我正在尝试构建一个匹配单词子串的语法并且没有太多。运气。即我尝试匹配成功的文本“an”,但无法匹配“and”的前两个字母
expr = phrase*;
phrase = an|text;
an = 'an'
text = Any;
我意识到这是一个基本的例子。
我正在尝试构建一个匹配单词子串的语法并且没有太多。运气。即我尝试匹配成功的文本“an”,但无法匹配“and”的前两个字母
expr = phrase*;
phrase = an|text;
an = 'an'
text = Any;
我意识到这是一个基本的例子。
PEGKit的创建者在这里。
首先,我想说的是,从这个简短的描述中,我怀疑 PEGKit 可能不是这项工作的最佳工具。
PEGKit 擅长于标记级别的匹配,但对于子标记(字符)级别的匹配不太有用。
如果您需要按照此处所述进行大量纯子标记匹配,则正则表达式将是一个更好的解决方案,您应该使用它们而不是 PEGKit。
但是,如果您需要在更大的令牌解析问题的上下文中检查一些子令牌模式,那么是的,PEGKit 肯定可以做到这一点。
因此,要回答您的具体问题:
对于 PEGKit 中的这种子标记匹配,您应该使用Semantic Predicate。
语义谓词在PEGKit 自述文件中的简短文档中进行了描述。这是关于使用 Semantic Predicates 的 Stack Overflow 上的先前问题。
语义谓词是直接嵌入到您的 PEGKit 语法中的 Objective-C 表达式,它返回一个布尔值来指示匹配应该成功还是失败。它们被包裹在一个{ ... }?
构造中。
在这种情况下,您可以使用语义谓词来匹配匹配Word
标记的“前缀”:
expr = anPhrase*;
anPhrase = { [LS(1) hasPrefix:@"an"] }? Word;
在这里,anPhrase
只会匹配以 .Word
开头的标记an
。
LS(1)
宏(也在 PEGKit 自述文件中描述)表示" Lookahead String 1"。它将第一个前瞻标记的字符串值作为NSString
.