PEG和CFG之间有什么区别?

时间:2011-03-31 13:59:15

标签: regex parsing language-agnostic context-free-grammar peg

wikipedia页面开始:

  

之间的根本区别   无上下文语法和解析   表达语法是PEG的   订购选择运算符。如果   第一个替代成功,第二个   替代被忽略了。如此有序   选择不是可交换的,不像   在无上下文中的无序选择   语法和正则表达式。   有序选择类似于软   在一些逻辑中切割运算符   编程语言。

为什么PEG的选择算子会使匹配短路?是因为最小化内存使用量(由于记忆)?

我不确定正则表达式中的选择运算符是什么,但我们假设它是:/[aeiou]/来匹配元音。所以这个正则表达式是可交换的,因为我可以用5个中的任何一个来编写它!元音字符的(五个阶乘)排列?即/[aeiou]//[eiaou]/的行为相同。它是可交换的有什么好处? (参见PEG的非交换性)

  

结果是如果CFG是   任何直接音译为PEG   前者的模糊性得到了解决   确定性地选择一个解析   可能的解析树。通过   仔细选择其中的顺序   语法替代品是   指定,一个程序员有一个伟大的   处理哪个解析树的控制权   被选中。

这说PEG的语法优于CFG吗?

2 个答案:

答案 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所做的确定性解析器。