对于一个文法若消除了左递归,提取了左公共因子后是否一定为LL(1)文法?试对 A→Ab|Ba A→aA|a B→a进行改写,并对改写后的文法进行判断
时间: 2023-06-09 16:03:41 浏览: 987
对于一个文法若消除了左递归,提取了左公共因子后并不一定为LL(1)文法。将文法 A→Ab|Ba 改写为 A→aA',A'→bA|ε;B→a。对改写后的文法进行判断:
1. 首先,由于 A→aA' 和 B→a 的非终结符的首字符都是 a,因此需要查看 FOLLOW(A') 和 FOLLOW(B) 是否存在交集。但是,FOLLOW(A')={b,$},FOLLOW(B)={$},它们没有交集。
2. 判断 A' 的候选式之间是否存在 FIRST/FOLLOW 冲突。但是,A' 的候选式中不存在一个非终结符的 FIRST 集合和 FOLLOW(A') 集合的交集。
综上所述,改写后的文法是 LL(1) 文法。
相关问题
对于一个文法若消除了左递归,提取了左公因子后是否一定为LL(1)文法?试对下面的文法进行改写,并对改写后的文法进行判断。 (1)A→baB| B→Abb|a (2)A→Aa|b A→SB B→ab (3)S→Ab|Ba A→aA|a B→a
消除了左递归和提取左公因子并不一定能够保证文法是LL(1)文法,还需要满足其他条件,比如FIRST和FOLLOW集合的性质等。
对于第一条文法:
A→aB A→bA' A'→aB A'→ε B→Abb B→a
改写后的文法可以判断为LL(1)文法。
对于第二条文法:
A→bA' A'→aA' A'→ε A→SB S→Ab S→Ba B→ab
改写后的文法可以判断为LL(1)文法。
对于第三条文法:
S→Ab S→Ba A→aA A→a B→a
改写后的文法不能判断为LL(1)文法,因为S和A的产生式的FIRST集合有交集,无法通过选择预测来进行语法分析。需要进一步的改写。
LL(1)型文法消除左递归应该怎么做呢
消除左递归的步骤如下:
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. 在消除左递归时,需要注意保证消除后的文法与原有文法等价。如果存在不等价的情况,则需要重新选择消除左递归的方法。
阅读全文