Parsing LL(*)与PEG解析器:有什么区别?

Parsing LL(*)与PEG解析器:有什么区别?,parsing,antlr,Parsing,Antlr,我想知道ANTLR v3是否完全代表PEG(解析表达式语法)解析器,它将其内部解析算法表示为“LL(*) 有区别吗 根据列出的工具,ANTLR是PEG解析器的完全代表: ANTLR是Terence Parr开发的一个成熟的解析器生成器,支持广泛的PEG特性,并将packrat解析与LL解析技术相结合 在ANTLR中,您可以对语法中的所有产生式规则启用全局回溯,因此对于k>=1,您可以解析与PEG几乎相同的内容。当然,由于所有潜在的回溯,解析器的运行时间会降低。以(一些)内存为代价,您还可以启用记

我想知道ANTLR v3是否完全代表PEG(解析表达式语法)解析器,它将其内部解析算法表示为“LL(*)


有区别吗

根据列出的工具,ANTLR是PEG解析器的完全代表:

ANTLR是Terence Parr开发的一个成熟的解析器生成器,支持广泛的PEG特性,并将packrat解析与LL解析技术相结合


在ANTLR中,您可以对语法中的所有产生式规则启用全局回溯,因此对于
k>=1
,您可以解析与PEG几乎相同的内容。当然,由于所有潜在的回溯,解析器的运行时间会降低。以(一些)内存为代价,您还可以启用记忆,使其行为类似于Packrat解析器,能够在线性时间内解析输入


因此,没有什么不同,w.r.t ANTLR和PEG/Packrat(启用了正确的选项!)。

ANTLR和PEG不一样。这是一个相当理论化的问题,我认为你最好参考Terrence Parr的论文,他在论文中准确地指出了ANTLR和PEG之间的差异以及ANTLR LL(*)解析策略的一些优势。我不想给自己解释他在那里写的内容的自由,但你最好读整篇文章。

佩格的观点是错误的

LL(*)是DCFG(确定性上下文无关语法)的子集,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
但在CFG中无法定义这种语法(证明涉及泵引理)。因此,PEG不是一个完整的概念。PEG是否是CFG的超集?我不知道

LL(*)和PEG之间的两个关键区别:

  • LL(*)只能向前看DFA模式,而PEG可以向前看递归模式。例如,在PEG中,您可以提前查看嵌套参数,而LL(*)则不能

  • PEG中的choice操作符
    /
    是priority choice(或“所有格”),这意味着如果您有规则
    A/AB
    ,它永远不会到达右侧
    AB
    。在LL(*)中,对于规则
    a | AB
    ,可以匹配
    AB


  • 如果您有一个没有前瞻的PEG语法,或者您的前瞻模式可以简化为DFA,那么它可以转换为LL(*)。如果没有,就不可能。

    存在一些左递归Packrat扩展,这些扩展显然不受ANTLR支持。您的PEG语法还不正确。它还将解析A{n}B{n+1}C{n+1}。感谢您指出,我用更新的语法编辑了答案,以确保C正好发生在A{n}B{n}之后。