我在想ANTLR v3是否完全代表了PEG(解析表达式语法)解析器,因为它将其内部解析算法表示为“LL(*)”。
它们有什么区别吗?
ANTLR文章关于PEG是错误的。
LL(*)是DCFG(确定性无上下文文法)的子集,其为CFG(上下文无关文法)的子集。
PEG可以表达上下文敏感语法,例如A{n}B{n}C{n}
,其中A
、B
和C
都出现了n
次。这是定义:
s := &(x C) A+ y / ε
x := A x B / A B
y := B y C / B C
k >= 1
,您可以实现与PEG相同的解析。当然,由于所有潜在的回溯,解析器的运行时间会降低。通过(一些)内存成本,您还可以启用备忘录功能,使其表现得像Packrat-parser,能够在线性时间内解析输入。ANTLR和PEG并不相同。这是一个非常理论性的问题,我认为最好是参考Terrence Parr写的这篇文章,他在其中精确地指出了ANTLR和PEG之间的区别以及ANTLR LL(*)解析策略的一些优点。我不想随意改述他在那里写的内容,但你最好阅读整篇文章。