从wikipedia页面开始:
之间的根本区别 无上下文语法和解析 表达语法是PEG的 订购选择运算符。如果 第一个替代成功,第二个 替代被忽略了。如此有序 选择不是可交换的,不像 在无上下文中的无序选择 语法和正则表达式。 有序选择类似于软 在一些逻辑中切割运算符 编程语言。
为什么PEG的选择算子会使匹配短路?是因为最小化内存使用量(由于记忆)?
我不确定正则表达式中的选择运算符是什么,但我们假设它是:/[aeiou]/
来匹配元音。所以这个正则表达式是可交换的,因为我可以用5个中的任何一个来编写它!元音字符的(五个阶乘)排列?即/[aeiou]/
与/[eiaou]/
的行为相同。它是可交换的有什么好处? (参见PEG的非交换性)
结果是如果CFG是 任何直接音译为PEG 前者的模糊性得到了解决 确定性地选择一个解析 可能的解析树。通过 仔细选择其中的顺序 语法替代品是 指定,一个程序员有一个伟大的 处理哪个解析树的控制权 被选中。
这说PEG的语法优于CFG吗?
答案 0 :(得分:50)
CFG语法是非确定性的,这意味着某些输入可能导致两个或更多可能的解析树。虽然大多数基于CFG的解析器生成器都对语法的可确定性有限制。如果它有两个或更多选择,它将发出警告或错误。
PEG语法是确定性的,这意味着任何输入只能以一种方式解析。
举一个典型的例子;语法
if_statement := "if" "(" expr ")" statement "else" statement
| "if" "(" expr ")" statement;
应用于输入
if (x1) if (x2) y1 else y2
可以解析为
if_statement(x1, if_statement(x2, y1, y2))
或
if_statement(x1, if_statement(x2, y1), y2)
CFG解析器会生成Shift / Reduce冲突,因为它无法在到达“else”关键字时决定是应该移位(读取另一个令牌)还是减少(完成节点)。当然,有办法解决这个问题。
PEG解析器总是会选择第一个选择。
哪一个更好是供您决定。我的观点是,PEG语法通常更容易编写,而且CFG语法更容易分析。
答案 1 :(得分:4)
我认为你将CFG与LR混淆并且含糊不清。语法不是确定性的/非确定性的,尽管它们的解析器可能是。如果符合定义,则模糊语法仍然是CFG,并且可以为其执行PEG所做的确定性解析器。