假设我想用 ParseKit 解析子字符串,比如单词的前缀。例如,我想解析“预览”和“评论”。所以我的语法可能是:
@start = prefix 'view';
prefix = 'pre' | 're';
现在无需修改 ParseKit 我可以匹配“预览”和“重新查看”,但不能匹配“预览”或“审查”。通过查看文档,我想我需要自定义 PKTokeinzer 的单词状态,因为它正在寻找空格来终止“单词”令牌。我该如何解决?
假设我想用 ParseKit 解析子字符串,比如单词的前缀。例如,我想解析“预览”和“评论”。所以我的语法可能是:
@start = prefix 'view';
prefix = 'pre' | 're';
现在无需修改 ParseKit 我可以匹配“预览”和“重新查看”,但不能匹配“预览”或“审查”。通过查看文档,我想我需要自定义 PKTokeinzer 的单词状态,因为它正在寻找空格来终止“单词”令牌。我该如何解决?
ParseKit的开发者在这里。
我不确定我是否完全理解这个问题,但我认为这听起来有些误导。
如果您正在寻找一种匹配子标记或字符的方法,正则表达式可能比 ParseKit 更适合您的需求。
ParseKit 语法与 ParseKit 标记器(PKTokenizer
类)生成的标记匹配。不是个别字符。
并不是说不可能从 的输入中PKTokenizer
产生一个pre
和和一个标记。但这需要对我称之为不明智和不必要的复杂的代码进行定制。我认为这是个坏主意。view
preview
如果你想使用 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/;
希望有帮助。