【发布时间】:2011-07-26 22:38:05
【问题描述】:
来自这个wikipedia页面:
两者的根本区别 上下文无关语法和解析 表达式语法是 PEG 的 选择运算符是有序的。如果 第一个选择成功,第二个 替代被忽略。如此下令 选择不是可交换的,不像 与上下文无关的无序选择 语法和正则表达式。 有序选择类似于软 某些逻辑中可用的剪切运算符 编程语言。
为什么 PEG 的选择算子会短路匹配?是因为要尽量减少内存使用(由于 memoization)吗?
我不确定正则表达式中的选择运算符是什么,但我们假设它是这样的:/[aeiou]/ 匹配元音。所以这个正则表达式是可交换的,因为我可以用 5 个中的任何一个来写它! (五个阶乘)元音字符的排列?即/[aeiou]/ 的行为与/[eiaou]/ 相同。它是可交换的有什么好处? (c.f. PEG 的不可交换性)
结果是,如果 CFG 是 直接音译为 PEG,任何 前者的歧义通过以下方式解决 确定性地选择一个解析 从可能的解析树。经过 仔细选择其中的顺序 语法选择是 指定,程序员有一个伟大的 处理对哪个解析树的控制 被选中。
这是说PEG的语法优于CFG的吗?
【问题讨论】:
-
“高级”?你的“优秀”标准是什么?
-
对于可交换性,想想
(air|airplane)试图匹配单词飞机。 -
您似乎混淆了选择运算符和字符类的概念。在正则表达式中,字符类用方括号
[aeiou]分隔,而选择运算符是管道字符|。在 PEG 中,选择运算符是斜杠字符/。
标签: regex parsing language-agnostic context-free-grammar peg