匹配PEGKit语法中的子串

时间:2014-07-22 15:00:37

标签: ios objective-c pegkit

我正在尝试构建一个语法,该语法将匹配单词的子串并且没有太多。运气。即我尝试匹配文本' an'哪个成功了,但它在'和

的前两个字母上无法匹配
expr = phrase*;
phrase = an|text;
an = 'an'
text = Any;

我意识到这是一个基本的例子。

1 个答案:

答案 0 :(得分:0)

PEGKit的创作者。

首先,我想说从这个简短的描述中,我怀疑PEGKit可能不是这项工作的最佳工具。

PEGKit擅长令牌级别的匹配,但对于子令牌(字符)级别的匹配不太有用。

如果您需要执行此处所述的大量纯子令牌匹配,正则表达式将是一个更好的解决方案,您应该使用它们而不是PEGKit。

但是,如果你需要在更大的令牌解析问题的上下文中检查一些子令牌模式,那么是的,PEGKit当然可以实现这一点。


回答您的具体问题:

对于PEGKit中的这种子令牌匹配,您应该使用语义谓词

语义谓词在PEGKit readme的简要文档中描述。这是一个previous question on Stack Overflow related to the use of Semantic Predicates

Semantic Predicates是直接嵌入在您的PEGKit语法中的Objective-C表达式,它返回一个布尔值,表示匹配应该成功还是失败。它们包含在{ ... }?构造中。

在这种情况下,您可以使用语义谓词来匹配"前缀"匹配的Word令牌:

expr = anPhrase*;
anPhrase = { [LS(1) hasPrefix:@"an"] }? Word;

此处,anPhrase仅匹配以Word开头的an令牌。

LS(1)宏(也在PEGKit自述文件中描述)表示" Lookahead String 1" 。它将第一个超前标记的字符串值作为NSString获取。