1

假设我想用 ParseKit 解析子字符串,比如单词的前缀。例如,我想解析“预览”和“评论”。所以我的语法可能是:

@start  = prefix 'view';
prefix = 'pre' | 're';

现在无需修改 ParseKit 我可以匹配“预览”和“重新查看”,但不能匹配“预览”或“审查”。通过查看文档,我想我需要自定义 PKTokeinzer 的单词状态,因为它正在寻找空格来终止“单词”令牌。我该如何解决?

4

1 回答 1

1

ParseKit的开发者在这里。

我不确定我是否完全理解这个问题,但我认为这听起来有些误导。

如果您正在寻找一种匹配子标记或字符的方法,正则表达式可能比 ParseKit 更适合您的需求。

ParseKit 语法与 ParseKit 标记器(PKTokenizer类)生成的标记匹配。不是个别字符。

并不是说不可能从 的输入中PKTokenizer产生一个pre和和一个标记。但这需要对我称之为不明智和不必要的复杂的代码进行定制。我认为这是个坏主意。viewpreview

如果你想使用 ParseKit(而不是 Regex),你可以简单地在你的汇编回调中进行子解析(而不是在语法中)。

所以在语法中:

@start = either;
either = 'preview' | 'review';

在 ObjC 中:

- (void)parser:(PKParser *)p didMatchEither:(PKAssembly *)a {
    PKToken *tok = [a pop];
    NSString *str = tok.stringValue;

    if ([str hasPrefix:@"pre"]) {
        ... // handle 'preview'
    } else {
        ... // handle 'review'
    }
}

还要记住 ParseKit 语法通过 RegEx 支持匹配标记。因此,如果您想匹配所有以 结尾的单词view

@start = anyView;
anyView = /\b\w*?view\b/;

希望有帮助。

于 2013-03-03T00:00:45.000 回答