A → aB|B, B →BC|C,C →dBa|u,这个文法是不是左递归,给出详细解释
时间: 2024-01-05 12:23:11 浏览: 74
这个文法是左递归的,因为存在一个非终结符 A,使得 A 产生式右侧的第一个符号是 A 本身。
具体地说,A -> aB | B 是一个左递归产生式,因为它的右侧第一个符号是 A。该产生式可以展开为:
A -> B A'
A' -> ε | aB A'
其中,A' 可以表示为 A 的右递归部分,即 A -> aB A'。这就是左递归的本质:递归地定义一个非终结符,直到它的产生式右侧不再以该非终结符开头。
为了消除左递归,我们需要对该文法进行改写。一种消除左递归的方法是左因子提取法。具体来说,我们可以将左递归的产生式 A -> aB | B 改写为:
A -> B A'
A' -> ε | aB A'
B -> ε | C B'
其中,B' 可以表示为 B 的右递归部分,即 B -> C B',而 C -> dBa | u。
改写后的文法如下所示:
A -> B A'
A' -> ε | aB A'
B -> ε | C B'
C -> dBa | u
这个文法不再包含左递归产生式。
相关问题
试消除下列文法中存在的左递归 G[A]: A → BC | CZ | W B → Ab | Bc C → Ax | By | Cp
消除 G[A] 中的左递归:
1. 将 B → Ab | Bc 改写为 B → AbB' | BcB',其中 B' 是 B 的后缀。
2. 将 C → Ax | By | Cp 改写为 C → AxC' | ByC' | CpC',其中 C' 是 C 的后缀。
3. 将 G[A] 改写为:
A → CZA' | WA'
A' → BCA' | ε
B → AbB' | BcB'
B' → AbB' | ε
C → AxC' | ByC' | CpC'
C' → xC' | yC' | pC' | ε
这样,G[A] 中的左递归被消除了。
对于一个文法若消除了左递归,提取了左公因子后是否一定为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集合有交集,无法通过选择预测来进行语法分析。需要进一步的改写。
阅读全文