我刚刚发现了ParseKit,但似乎无法让它在一个简单的例子上工作。
NSString *test = @"FOO:BAR";
NSString *grammar = ...//get grammar txt file and read it into a string
PKParser *parser = nil;
parser = [[PKParserFactory factory] parserFromGrammar:grammar assembler:self];
[parser parse:test];
}
- (void)didMatchFoo:(PKAssembly *)a
{
NSLog(@"FOO");
}
- (void)didMatchBar:(PKAssembly *)a
{
NSLog(@"BAR");
}
我的语法文件如下所示:
@start = foo;
foo = 'FOO:' bar;
bar = 'BAR';
但这些方法并没有开火。
答案 0 :(得分:2)
ParseKit的开发人员。上面的例子不起作用。默认情况下,Tokenizer会对此进行标记:
FOO:BAR
作为三个代币:
Word (FOO)
Symbol (:)
Word (BAR)
问题是你的语法期待像'FOO:'这样的词,但冒号默认是符号字符,而不是字符字符。如果您希望冒号(:)被接受为有效的内部“Word”字符,则必须自定义Tokenizer以使其接受。我有点怀疑你真的想要那个。如果您这样做,请阅读此处的文档以了解如何自定义Tokenizer:http://parsekit.com/tokenization.html
我认为一个更好的“玩具”语法可能就像:
@start = pair;
pair = foo colon bar;
foo = 'FOO';
colon = ':';
bar = 'BAR';
您在语法中的声明方面有很大的灵活性。一个等价的语法是:
@start = foo ':' bar;
foo = 'FOO';
bar = 'BAR';