如果不使用经典方法并将其转换为LL(1),则查找语法不是LL(1)

时间:2018-12-04 11:18:58

标签: compiler-construction grammar context-free-grammar compiler-theory

假设我有这个语法:

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推导消除法和左递归消除法,但这有点棘手,而且我尝试过很多次,都无法将其转换为LL(1)。

谢谢。

1 个答案:

答案 0 :(得分:2)

S / AB / C都涉及indirect left-recursion

由于任何 k 都不存在左递归语法(直接或间接)为LL(k),因此只需显示左递归循环即可证明该语法不是LL(1)。 (另一方面,如果您有一个计算FIRST和FOLLOW集的工具,那么“经典”方法实际上非常简单。)

消除间接左递归涉及首先找到一种可能的非末端递归类型,然后通过用其右侧替换非末端的某些用法来打破推导周期。之后,可以应用简单的左递归消除算法。

您可以在here on StackOverflowhere中找到具体的转换示例,也可以在任何有关解析理论的优秀教科书中找到。 (或者,当然,通过搜索“间接左递归”一词并寻找具有一定可信度的页面。)