编译原理中的左结合
㈠ 编译原理中 左递归具体解释是什么
定义:
"一个文法是左递归的,若我们可以找出其中存在某非终端符号A,最终会推导出来的句型(sentential form)里面包含以自己为最左符号(left-symbol)的句型"
即
A -> Aa 或
A -> Ba
B -> A
两种形式的文法.
㈡ 编译原理中的文法的产生式的括号有什么用
加上括号,是让编程语言机器 最先识别。
就不用 从 E 执行到 F——EIid
先执行 括号里面的
㈢ 楂桦垎銆伞备粈涔埚彨宸︾粨钖堬纴浠涔埚彨鍙崇粨钖
宸︾粨钖堟э细镒忔濇槸浠庡乏钖戝彸镓ц岃繍绠楋绂
鍙崇粨钖堟э细镒忔濇槸浠庡彸钖戝乏镓ц岃繍绠椼
渚嫔傜畻链杩愮畻绗︾殑缁揿悎镐ф槸镊宸﹁呖鍙筹纴鍗冲厛宸﹀悗鍙炽傚傛湁琛ㄨ揪寮弜-y+z
鍒檡
搴斿厛涓庘-钬濆彿缁揿悎锛屾墽琛寈-y
杩愮畻锛岀劧钖庡啀镓ц+z
镄勮繍绠椼傝繖绉嶈嚜宸﹁呖鍙崇殑缁揿悎
鏂瑰悜灏辩О涓衡滃乏缁揿悎镐р濄
钥岃嚜鍙宠呖宸︾殑缁揿悎鏂瑰悜绉颁负钬滃彸缁揿悎镐р濄傛渶鍏稿瀷镄勫彸缁揿悎
镐ц繍绠楃︽槸璧嫔艰繍绠楃︺傚倄=y=z,鐢变簬钬=钬濈殑鍙崇粨钖堟э纴搴斿厛镓ц寉=z
鍐嶆墽琛寈=(y=z)杩愮畻銆
镓╁𪾢璧勬枡锛
C璇瑷涓锛岃繍绠楃︾殑杩愮畻浼桦厛绾у叡鍒嗕负15
绾с1
绾ф渶楂桡纴15
绾ф渶浣庛
鍦ㄨ〃杈惧纺涓锛屼紭鍏堢骇杈冮珮镄勫厛浜庝紭鍏堢骇杈冧绠镄勮繘琛岃繍绠椼傝屽湪涓涓杩愮畻閲忎袱渚х殑杩愮畻绗
浼桦厛绾х浉钖屾椂锛屽垯鎸夎繍绠楃︾殑缁揿悎镐ф墍瑙勫畾镄勭粨钖堟柟钖戝勭悊銆
浼桦厛绾т粠涓婂埌涓嬩緷娆¢掑噺锛屾渶涓婇溃鍏锋湁链楂樼殑浼桦厛绾э纴阃楀彿镎崭綔绗﹀叿链夋渶浣庣殑浼桦厛绾с
镓链夌殑浼桦厛绾т腑锛屽彧链変笁涓浼桦厛绾ф槸浠庡彸镊冲乏缁揿悎镄勶纴瀹冧滑鏄鍗旷洰杩愮畻绗︺佹浔浠惰繍绠楃︺佽祴鍊艰繍绠楃︺傚叾瀹幂殑閮芥槸浠庡乏镊冲彸缁揿悎銆
鍙傝冭祫鏂欐潵婧愶细锏惧害锏剧-C璇瑷杩愮畻绗
㈣ 编译原理中文法二义性问题
二义性文法
【定义】 若文法中存在这样的句型,它具有两棵不同的语法树,则称该文法是二义性文法。
二义性文法会引起歧义,应尽量避免之!
E E
E + E E * E
i E * E E + E i
i i i i
都可以表示i+i*i
所以G(E):E -> E+E | E*E | (E) | i ;文法具有二义性。
文法二义性的消除:
【方法1】不改变文法的原有规则,加进一些非形式规定。
加进运算符的优先顺序和结合规则对G(E),规定*优于+,*和+服从左结合
【方法2】构造一个等价的无二义性文法,将排除 二义性的规则合并到文法中
G(E) -> G´(E) : E -> E+T | T T -> T*F | F F -> (E) | i ;
㈤ 左结合和右结合的问题~和编译原理有关
B与第一个*结合:用编译原理的运算符的结合性来解释的话,就是假设*是左结合的。当运算分量(本例中是B)两侧都有运算符(本例中是*)的时候,采用左结合。即B与B左边的*结合。
eg: L —>A*B*C 先计算 A*B 然后计算(A*B)*C。
不知道你懂么??
㈥ 编译原理语法分析中消除左递归的问题。比如A→Ab|c中为什么说它是左递归呢,明明是A定义为Ab或者
A->Ab|c为什么是左递归,和为什么要消除左递归:
定义,就无需争辩了。至于为什么自顶向下文法不能处理左递归,解释如下:
c∈FIRST(A),所以当预测分析的栈顶出现非终结符A,而输入字符串最左边为c时,就不知道用产生式A->Ab还是A->c了。无法构造预测分析表。比如输入字符串为cbb,我们人当然容易知道是A->Ab->Abb->cbb了,但是电脑没那么聪明,如果不消除左递归,只有回溯了。
㈦ 编译原理的最左推导和最右推导问题
最左推导:
S=> (L) =>(L,S)=>(S,S)=>(a,S)=>(a,(L))=>(a,(L,S))=>(a,(S,S))=>(a,((L),S))=>(a,((L,S),S))
=>(a,((S,S),S))=>(a,((a,S),S))=>(a,((a,a),S))=>(a,((a,a),(L)))=>(a,((a,a),(L,S)))
=>(a,((a,a),(S,S)))=>(a,((a,a),(a,S)))=>(a,((a,a),(a,a))) 共17步
最右推导
S=> (L) =>(L,S)=>(L,(L))=>(L,(L,S))=>(L,(L,(L)))=>(L,(L,(L,S)))=>(L,(L,(L,a)))=>(L,(L,(S,a)))
=>(L,(L,(a,a)))=>(L,(S,(a,a)))=>(L,((L),(a,a)))=>(L,((L,S),(a,a)))=>(L,((L,a),(a,a)))
=>(L,((S,a),(a,a)))=>(L,((a,a),(a,a)))=>(S,((a,a),(a,a)))=>(a,((a,a),(a,a)))
㈧ 编译原理左递归消除
这些题很难啊!!!
都有间接左递归。要先变成直接左递归,然后消除掉。
--------------------
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:
--------------------