我正在尝试构建一个语法,该语法将匹配单词的子串并且没有太多。运气。即我尝试匹配文本' an'哪个成功了,但它在'和
的前两个字母上无法匹配expr = phrase*;
phrase = an|text;
an = 'an'
text = Any;
我意识到这是一个基本的例子。
答案 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
获取。