1

我正在尝试构建一个匹配单词子串的语法并且没有太多。运气。即我尝试匹配成功的文本“an”,但无法匹配“and”的前两个字母

expr = phrase*;
phrase = an|text;
an = 'an'
text = Any;

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

4

1 回答 1

0

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.

于 2014-07-23T14:56:46.787 回答