消除文法G: S→a|b|(T) T→TcS|S 的左递归;
时间: 2024-06-18 09:02:36 浏览: 161
消除文法的左递归是为了让文法满足LL(1)文法的要求,方便语法分析器进行处理。对于文法G:S→a|b|(T) T→TcS|S,我们可以按照以下步骤进行左递归的消除:
1. 将所有的直接左递归都消除,即将T→TcS转化为T→SU,其中U→cSU|ε;
2. 对于每一个非终结符号A,找到其所有能够推导出ε的直接或间接子孙非终结符号B1,B2,...Bn,并将其从A的产生式中删除;
3. 将删除ε后的产生式中的右部替换为其所有可能的组合,例如T→SU可以替换为T→cST|S;
4. 将新产生的文法规则加入原有文法中。
经过消除左递归后,G的新文法为:
S → a | b | '(' T ')'
T → SU
U → cSU | ε
相关问题
对文法G[S]:S→a|∧|(T);T→T,S|S。对文法进行改写
可以将文法G[S]改写为G'[S']:
S' → a | ε | (TS')
T → TS' | S'
其中,ε表示空串。
解释:
- S'可以推导出a、空串、以及括号内为T和S'的组合,即可以递归地构造出任意数量的S。
- T可以推导出TS'或者S',即可以递归地构造出任意数量的T和S。
这样改写后,原本存在左递归的文法得到了消除。
对文法G(S): S→(T) | aS | a T→T,S | S (1)消去文法的左递归和提取公共左因子
首先我们来看一下文法G(S):
S → (T) | aS | a
T → T,S | S
1. 消去文法的左递归
为了消除左递归,我们需要对S的产生式进行改写。S的产生式中存在左递归,因此我们可以将其拆分为两个产生式:
S → aS'
S' → (T)S' | ε
接下来,我们需要对T的产生式进行改写。T的产生式中也存在左递归,因此我们可以将其拆分为两个产生式:
T → ST'
T' → ,ST' | ε
最终,消除左递归后的文法为:
S → aS'
S' → (T)S' | ε
T → ST'
T' → ,ST' | ε
2. 提取公共左因子
在消除左递归的基础上,我们可以进一步提取公共左因子。在这个文法中,S的产生式中存在公共左因子a,因此我们可以将其提取出来:
S → aS'
S' → (T)S' | ε
T → ST'
T' → ,ST' | ε
变成:
S → aS'
S' → (T)S' | ε
T → ST'
T' → aT' | ,ST' | ε
最终,经过消除左递归和提取公共左因子后的文法为:
S → aS'
S' → (T)S' | ε
T → ST'
T' → aT' | ,ST' | ε
阅读全文