PEG的选择运算符为什么会短路匹配呢?这是为了减少内存使用(由于备忘录机制)吗?上下文无关文法和解析表达式文法的根本区别在于PEG的选择运算符是有序的。如果第一个备选成功,那么第二个备选将被忽略。因此,与上下文无关文法和正则表达式中的无序选择不同,有序选择是不可交换的。有序选择类似于某些逻辑编程语言中可用的软剪切运算符。
我不确定正则表达式中的选择运算符是什么,但假设它是这样的:
/[aeiou]/
以匹配元音字母。那么这个正则表达式是否是可交换的,因为我可以将它写成五个元音字符的5!(五的阶乘)排列之一?即/[aeiou]/
与/[eiaou]/
表现相同。它可交换的优点是什么?(与 PEG 的非交换性相比)从下面的引用中可以了解到:
这是在说PEG的语法优于CFG吗?其结果是,如果一个CFG直接被转换为PEG,那么前者中的任何歧义都将通过确定性地从可能的解析树中选择一棵来解决。通过仔细选择语法备选项的顺序,程序员可以对选择哪个解析树有很大的控制权。
(air|airplane)
试图匹配单词airplane。 - xanatos[aeiou]
分隔,而选择运算符是管道字符|
,而在 PEG 中,选择运算符是斜杠字符/
。 - hippietrail