編譯原理直接推導和推導
⑴ 編譯原理的最左推導和最右推導。。。
(2)給出句子0127,34和568的最左推導和最右推導我是剛學編譯原理,不知道該怎麼去思考,從那入手呢? (1)帶先導0的十進制無符號整數 (2)最左推導:
⑵ 編譯原理-句型、句子、短語、直接短語、句柄、素短語、最左素短語
在進行語法分析的時候,有時候會對這些詞語的概念不清晰,這里我們就詳細歸納總結一下。
可以看出這個裡面,最需要理解的概念就是短語,其他大部分概念都是在短語基礎上延伸的,從概念上可以看出:
假設有一個文法
針對文法的一個特定句型 (Sd(T)db) , 其推導過程如下:
這個句型 (Sd(T)db) 對應的 CFG 分析樹如下:
那個這個句型 (Sd(T)db) 有多少個短語呢?
還記得短語的定義么, S ⇒* αβδ , αβδ 代表句型就是這里的 (Sd(T)db) 。
因此這個句型 (Sd(T)db) :
演算法非常簡單,就是通過分析樹的後序遍歷,先將子樹的葉節點從左到右排合並成字元串(即一個短語),然後用它代表子樹的根節點的值,再和與子樹根節點同一層節點值合並,得到新的短語。就這樣從分析樹的最底層,一路合並到分析樹的根節點,就能得到所有的短語了。
通過遞歸的方法,獲取短語列表 phraseList , 直接短語列表 directPhraseList 和 素短語列表 plainPhraseList 。
運行結果:
⑶ 句柄的編譯原理
一個句型的最左直接短語稱為該句型的句柄,句型的句柄是和某產生式右部匹配的子串,並且,把它規約成該產生式左部的非終結符,代表了最右推導過程的逆過程的一步。
如右圖,在推導過程中,S→aABe→aAde→aAbcde→abbcde,此四步的句柄分別為aABe,d,Abc,b
句柄的特徵:
1. 它是直接短語,即某規則右部。
2. 它具有最左性。
注意:短語、直接短語和句柄都是針對某一句型的,特指句型中的哪些符號子串能構成短語和直接短語,離開具體的句型來談短語、直接短語和句柄是無意義的。另外句柄的右邊僅含終結符如果文法二義,那麼句柄可能不唯一。
⑷ 一個編譯原理問題
首先寫出指定句型的規范推導:
S→(L)→(L,S)→(L,(L))→(L,(S))→(L,(a))→(S,(a))
然後畫出分析樹如下圖
根據分析樹的葉子結點可以找出該句型的所有短語:
aS(a)S,(a)(S,(a))
直接短語,就是經過一次非終結符替換得到的短語:
aS沒了
句柄就是最左直接短語,要進行規約的部分,根據分析樹我們找到最左直接短語為:
S
⑸ 如何由文法推導語法樹(編譯原理)
語法樹是一種用於表示句型生成過程的結構,特別是在上下文無關文法中非常有用。它能夠幫助我們理解句型是如何通過文法規則逐步構建起來的。在編譯原理課程中,構建語法樹是語法分析的一項重要任務。為了完成這項任務,我們通常需要應用各種語法分析方法,這些方法在學習過程中會逐漸掌握。
在學習這些方法之前,我們只能依賴直覺和經驗,通過猜測和拼湊的方式嘗試構建句型的語法樹。由於這種方法依賴於經驗和直覺,因此適用於較為簡單的句型。通過反復練習,可以逐漸積累一些構建語法樹的技巧,這些技巧主要是自頂向下的語法分析中的基本原則。
值得注意的是,對於同一文法,可能存在多個結構不同的語法樹。如果一個文法能夠產生多個不同的語法樹,這個文法就被稱為二義性文法。二義性文法的存在使得句型的解析變得復雜,因為同一個句型可能存在多種解釋。
然而,如果文法是非二義性的,那麼對於任何給定的句型,其對應的語法樹都是唯一的。這意味著,只要遵循文法中的規則,我們就能確定句型的正確結構。這種特性對於編譯器的設計和實現非常重要,因為它確保了解析過程的確定性和唯一性。
總之,理解如何構建語法樹以及文法的二義性問題,對於深入學習編譯原理至關重要。通過掌握各種語法分析方法,我們可以更准確地解析句型,從而為後續的編譯工作奠定堅實的基礎。
⑹ 編譯原理的題目:對於文法G(E):E→T|E+T|E-T T→F|T*F|T/F F→(E)|i
終極符集合Vt={+,-,*,/,(,),i}
非終極符集合Vi={E,T,F}
最右推導:E => E-T => E-F => E-(E) => E-(T) => E-(T+F) => E-(T+i) => E-(T*F+i)
直接短語:T*F,i
⑺ 編譯原理的最左推導和最右推導問題
最左推導:
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)))
⑻ 什麼叫活前綴,用通俗的話解答下,或者簡單的例子。 這個題是編譯原理的。
活前綴:右句型的前綴,而且其右端不會超過該句型的最右邊句柄的末端。
右句型:最右推導可得到的句型。
最右推導:每步推導都替代最右非終結符的推導。
推導:我們說αBγ推導出αβγ,是說存在產生式B->β。
產生式:左邊為非終結符,右邊為終結符與非終結符組合成的串。
非終結符:是字元串的集合。
終結符:組成語言的詞。如c語言中的2,a,int,if等。
句型:開始符經過若干步推導後得到的串。
前綴:如abc的前綴為a、ab、abc。
開始符:開始符是整個語言的集合。
句柄:非形式的,句柄是和某個產生式右部匹配的字元串,把句柄歸約成產生式左部的非終結符,可以得到最右推導的逆過程的一步。形式的定義為:開始符s經過若干步最右推導得到αBγ,αBγ經過一步最右推導得到αβγ,若γ為終結符的集合,則β為句柄。舉例:
E->E+E|E*E|-E|(E)|id,對於id+id*id,其中一個最右推導為E->E+E->E+E*E->E+E*id->E+id*id->id+id*id。在id+id*id歸約成E+id*id的過程中,最左邊的id是句柄。E+id*id歸約成E+E*id時,最左邊的id是句柄,把E+E*id歸約成E+E*E時,id是句柄。把E+E*E歸約成E+E時E*E是句柄。E+E歸約成E時,E+E是句柄。
歸約:可理解為把產生式右邊的串用產生式左邊的非終結符代替。
注1:再說一下活前綴,舉個例子,比如E+E*E歸約成E+E,句柄是E*E,那麼它的活前綴就是E、E+、E+E、E+E*、E+E*E。又比如id+id*id歸約成E+id*id,句柄是最左邊的id,那麼它的活前綴是id,因為不能超過句柄。
注2:至於為什麼要給出活前綴的定義和如何用歸約的方法實現語法分析,還要進一步學習。
⑼ 編譯原理的最左推導和最右推導問題
最左推導:
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)))
⑽ 編譯原理
編譯原理):利用編譯程序從源語言編寫的源程序產生目標程序的過程; 用編譯程序產生目標程序的動作。 編譯就是把高級語言變成計算機可以識別的2進制語言,計算機只認識1和0,編譯程序把人們熟悉的語言換成2進制的。
編譯程序把一個源程序翻譯成目標程序的工作過程分為五個階段:詞法分析;語法分析;語義檢查和中間代碼生成
(10)編譯原理直接推導和推導擴展閱讀:
編譯程序的語法分析器以單詞符號作為輸入,分析單詞符號串是否形成符合語法規則的語法單位,如表達式、賦值、循環等,最後看是否構成一個符合要求的程序,按該語言使用的語法規則分析檢查每條語句是否有正確的邏輯結構,程序是最終的一個語法單位。
編譯程序的語法規則可用上下文無關文法來刻畫。語法分析的方法分為兩種:自上而下分析法和自下而上分析法。自上而下就是從文法的開始符號出發,向下推導,推出句子。
而自下而上分析法採用的是移進歸約法,基本思想是:用一個寄存符號的先進後出棧,把輸入符號一個一個地移進棧里,當棧頂形成某個產生式的一個候選式時,即把棧頂的這一部分歸約成該產生式的左鄰符號。