左递归消除编译原理
‘壹’ 编译原理:消除文法中的左递归
总得有个规则吧。如果不能提供,可以自己看看bison源代码分析--gcc源代码分析语法分析部分。
‘贰’ 编译原理中的左递归
1.A->Aa
2.A->Ba
B->Ab (A和B属于非终结符,a和b属于终结符)
通俗点讲:左递归就是情况1所说的“->”两边都含有同一个非终结符;
情况2所说的A->Ba中“->”后面的B 与 B->Ab中“->”前面的B是相同的非终结符
这两种情况就叫作左递归。
‘叁’ 编译原理语法分析中消除左递归的问题。比如A→Ab|c中为什么说它是左递归呢,明明是A定义为Ab或者
A->Ab|c为什么是左递归,和为什么要消除左递归:
定义,就无需争辩了。至于为什么自顶向下文法不能处理左递归,解释如下:
c∈FIRST(A),所以当预测分析的栈顶出现非终结符A,而输入字符串最左边为c时,就不知道用产生式A->Ab还是A->c了。无法构造预测分析表。比如输入字符串为cbb,我们人当然容易知道是A->Ab->Abb->cbb了,但是电脑没那么聪明,如果不消除左递归,只有回溯了。
‘肆’ 编译原理题 语法分析首先要求消除左递归吗
是的!
‘伍’ 编译原理 清除左递归
先提公因子
‘陆’ 编译原理题:消除以下文法的公共左因子和左递归
自己想的,不敢保证对错,若有纰漏,还请高手指教:
A->bAA'|aB
A'->bB|Bb
B->abB'|baB'
B'->aAB'|ε
‘柒’ 编译原理左递归消除
这些题很难啊!!!
都有间接左递归。要先变成直接左递归,然后消除掉。
--------------------
G3.1
S->SA|Ab|b|c
A->Bc|a
B->Sb|b
--------------------
间接左递归转直接左递归
B代入A:A ->(Sb|b)c|a -> Sbc|bc|a
A代入S:S -> S(Sbc|bc|a)|(Sbc|bc|a)b|b|c -> SSbc|Sbc|Sa|Sbcb|bcb|ab|b|c
消除直接左递归
S->bcbS'|abS'|bS'|cS'
S'->SbcS'|bcS'|aS'|bcbS'|ε
S'还是有直接左递归,继续消除
S'->bcS'T|aS'T|bcbS'T
T->bcS'T|ε
最后,这题答案就是S,S',T的产生式
--------------------
下面两题更难了,上一题反复代入还能把其他非终结符消掉,下面两个文法都是最后代入还剩下两个非终结符反复迭代,佛了!
G3.2
E->ET+|T
T->TF*|F
F->E|i
--------------------
F代入T: T->T(E|i)*|(E|i)->TE*|Ti*|E|i
T代入E:
--------------------
G3.3
S->V_1
V_1->V_2|V_1 2 V_2
V_2->V_3|V_2 + V_3
V_3->V_1 * |(
这些字母我都不认识了,换一下
S->A|SiA
A->B|A+B
B->S*|(
--------------------
B代入A:A->(S*|()|A+(S*|()->S*|(|A+S*|A+(
A代入S:
--------------------
‘捌’ 【编译原理】自顶向下LL(1)分析中,消除左递归和提取左因子的目的是什么
提取左因子---避免程序回溯;
消除左递归---消除死循环。
‘玖’ 编译原理的消除左递归是怎么回事啊
如果一个CFG像这样
A -> Ab
A -> e
就是有左递归,语法分析里的递归下降法和LL(1)就不能处理啦,因为程序会陷入递归而无法前进。
而CFG
A -> bA'
A' -> bA'|e
和前面一个表达的语言是一样的,但所有语法的第一项都是终结符,就消除了左递归。
有消除左递归的算法,一般编译原理书上会有介绍,不是很复杂。
‘拾’ 编译原理,如何消除文法的左递归
T::=ST'
T'::=,ST'|ε