从这个wikipedia页面:



为什么PEG的选择运算符会短路匹配?是因为要尽量减少内存使用(由于记忆)?

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



这是否表示PEG的语法优于CFG的语法?

最佳答案

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”关键字时,它无法决定是否应该移位(读取另一个 token )或减少(完成节点)。当然,有一些方法可以解决此问题。

PEG分析器将始终是首选。

哪个更好由您决定。我的观点是,通常PEG语法更容易编写,而CFG语法更易于分析。

关于regex - PEG和CFG有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5501074/

10-12 04:15