我有以下非常简单的(测试)语法文件
@start = expression+;
expression = keyword | otherWord;
otherWord = Word;
keyword = a | the;
a = 'a';
the = 'the';
然后我运行以下代码:// Grammar contains the contents of the above grammar file.
PKParser *parser = [[PKParserFactory factory] parserFromGrammar:grammar assembler:self];
NSString *s = @"The parrot";
[parser parse:s];
PKReleaseSubparserTree(parser);
以及以下方法:- (void)didMatchA:(PKAssembly *)a{
[self log:a type:@"didMatchA "];
}
- (void)didMatchThe:(PKAssembly *)a{
[self log:a type:@"didMatchThe "];
}
- (void)didMatchKeyword:(PKAssembly *)a{
[self log:a type:@"didMatchKeyword "];
}
- (void)didMatchExpression:(PKAssembly *)a{
[self log:a type:@"didMatchExpression "];
}
- (void)didMatchOtherWord:(PKAssembly *)a{
[self log:a type:@"didMatchOtherWord "];
}
-(void) log:(PKAssembly *) assembly type:(NSString *) type{
PKToken * token = [assembly top];
NSLog(@"Method: [%@], token: %@, assembly: %@", type, token, assembly);
}
最后我在日志中收到这些消息:[1] Method: [didMatchThe ], token: The, assembly: [The]The^parrot
[2] Method: [didMatchKeyword ], token: The, assembly: [The]The^parrot
[3] Method: [didMatchOtherWord ], token: The, assembly: [The]The^parrot
[4] Method: [didMatchExpression ], token: The, assembly: [The]The^parrot
[5] Method: [didMatchExpression ], token: The, assembly: [The]The^parrot
[6] Method: [didMatchOtherWord ], token: parrot, assembly: [The, parrot]The/parrot^
[7] Method: [didMatchExpression ], token: parrot, assembly: [The, parrot]The/parrot^
这种是有道理的,但我看不出为什么会出现 %5。我真的很希望能够删除双重匹配,以便像 "The"这样的关键字只触发 didMatchThe
而不是 didMatchKeyword
。不幸的是,parsekit 上的 doco 似乎不存在它的语法语法以及它如何决定触发方法。是的,我也拖钓了源代码:-)
有没有人有使用 parsekit 的经验并且可以对此有所了解?
最佳答案
我是 ParseKit 的开发者,这实际上是正确的行为。这里有一些项目可以帮助解决这个问题:
PKAssembly
的 target
ivar 中保持您正在处理的状态。a.target
当前的
PKAssembly
是传递给回调方法的代码。希望有帮助。
关于objective-c - parsekit 意外调用选择器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6237171/