3

我刚刚发现 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';

但是这些方法不会触发。

4

1 回答 1

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';
于 2011-08-17T00:41:58.897 回答