假设我有这个语法:
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)。
谢谢。
答案 0 :(得分:2)
S
/ A
和B
/ C
都涉及indirect left-recursion。
由于任何 k 都不存在左递归语法(直接或间接)为LL(k),因此只需显示左递归循环即可证明该语法不是LL(1)。 (另一方面,如果您有一个计算FIRST和FOLLOW集的工具,那么“经典”方法实际上非常简单。)
消除间接左递归涉及首先找到一种可能的非末端递归类型,然后通过用其右侧替换非末端的某些用法来打破推导周期。之后,可以应用简单的左递归消除算法。
您可以在here on StackOverflow或here中找到具体的转换示例,也可以在任何有关解析理论的优秀教科书中找到。 (或者,当然,通过搜索“间接左递归”一词并寻找具有一定可信度的页面。)