編譯原理中的左結合
㈠ 編譯原理中 左遞歸具體解釋是什麼
定義:
"一個文法是左遞歸的,若我們可以找出其中存在某非終端符號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:
--------------------