从这个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/