假设我想用ParseKit解析子字符串,就像单词的前缀一样。例如,我想解析'预览'和'评论'。所以我的语法可能是:
@start = prefix 'view';
prefix = 'pre' | 're';
现在没有修改ParseKit,我可以匹配'预览'和'重新观看',但不能匹配'预览'或'评论'。从查看文档我想我需要自定义PKTokeinzer的单词状态,因为它正在寻找空格来终止'Word'标记。我该如何解决这个问题?
答案 0 :(得分:1)
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/;
希望有所帮助。