LL(1)型文法消除左递归应该怎么做呢
时间: 2023-05-26 11:01:58 浏览: 126
消除左递归的步骤如下:
1. 把文法拆分成两个集合:左递归集合和非左递归集合。
2. 对于左递归的产生式,进行消除。假设文法中存在以下产生式左递归:
A → Aα1 | Aα2 | … | Aαm | β1 | β2 | … | βn
首先,将β1、β2、…、βn中不含A的产生式提取出来,形成新的产生式B → β1 | β2 | … | βn。将原产生式修改为:
A → Aα1 | Aα2 | … | Aαm | BB1 | BB2 | … | BBn
接下来,对于左递归的产生式A → Aα1 | Aα2 | … | Aαm,按照以下公式进行修改:
A → β1A’ | β2A’ | … | βnA’
A’ → α1A’ | α2A’ | … | αmA’ | ε
其中,β1、β2、…、βn是不含A的产生式,α1、α2、…、αm是任意串,ε是空串。
3. 消除左递归后,可能会产生左公因子。需要将这些左公因子提取出来,形成新的非终结符和产生式,原有的产生式需要做相应的修改。
4. 对文法进行求FIRST集和FOLLOW集的计算。
5. 构造LL(1)分析表。
注意事项:
1. 消除左递归时,需要保持文法的动态特性。例如,对于以下文法:
A → AB
A → a
B → CD
B → b
C → c
D → d
如果将B → CD的左递归消除得到B → bC’,再将C’ → DC’ | ε的左递归消除得到C’ → cD’,那么产生式A → AB经过消除左递归后变成了A → aB,丧失了原有的动态定义。
2. 在消除左递归时,需要注意保证消除后的文法与原有文法等价。如果存在不等价的情况,则需要重新选择消除左递归的方法。
阅读全文