【发布时间】:2018-12-04 11:18:57
【问题描述】:
假设我有这个语法:
S -> A C x | u B A
A -> z A y | S u | ε
B -> C x | y B u
C -> B w B | w A
这个语法显然不是 LL(1),我可以找到它来构建解析表。但是,如果不使用经典方法,即不构造解析表或发现任何冲突,我有什么方法可以证明这个语法不是 LL(1)?
另外,我怎样才能将此语法转换为 LL(1)?我认为我必须同时使用 epsilon-derivation 消除和左递归消除,但这有点棘手,而且我尝试过很多次都无法将其转换为 LL(1)。
提前谢谢你。
【问题讨论】:
-
通过S(first Alternative)->A(second Alternative)->S可以从自身到达S,可以直接看出语法不是LL(1),中间没有代币消耗。这将导致递归下降解析器中的无限递归。对于像@rici 这样的人,我将把转换留给 LL(1) - 我可能会这样做(如果可能的话),但这对我来说不是例行公事(或者)。
标签: compiler-construction grammar context-free-grammar compiler-theory