该ANTLR文章是错的PEG。
LL(*)是DCFG(Deterministic Context Free Grammar)的一个子集,它是CFG(Context Free Grammar)的一个子集。
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
Run Code Online (Sandbox Code Playgroud)
但是在CFG中没有办法定义这样的语法(证明涉及泵引理)。所以 PEG 不是子集 CFG。PEG是否是CFG的超集?我不知道。
LL(*) 和 PEG 之间的两个主要区别:
LL(*) 只能向前看 DFA 模式,而 PEG 可以向前看递归模式。例如,在 PEG 中,您可以先行嵌套括号,而 LL(*) 则不能。
/PEG 中的选择操作符是优先选择(或“占有”),这意味着如果你有规则A / AB,它永远不会到达右手边AB。在 LL(*) 的规则中A | AB,可以匹配AB.
如果你有一个没有前瞻的 PEG 语法,或者你的前瞻模式可以简化为 DFA,那么它可以被翻译成 LL(*)。如果没有,那是不可能的。
| 归档时间: |
|
| 查看次数: |
3304 次 |
| 最近记录: |