如何在ParseKit中自定义PKTokenizer来标记子字符串?

时间:2013-03-02 22:42:22

标签: objective-c tokenize parsekit

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

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

现在没有修改ParseKit,我可以匹配'预览'和'重新观看',但不能匹配'预览'或'评论'。从查看文档我想我需要自定义PKTokeinzer的单词状态,因为它正在寻找空格来终止'Word'标记。我该如何解决这个问题?

1 个答案:

答案 0 :(得分: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/;

希望有所帮助。