如何理解編譯原理的推導
1. 如何由文法推導語法樹(編譯原理)
語法樹,是針對上下文無關文法,用來表示一個句型的生成過程的一種描述手段。
對於給定的句型,依據文法構造它的語法樹,是語法分析的任務。
編譯原理課程中重點學習的各種語法分析方法,都是解決語法樹的構造的具體分析方法。
在學習並掌握各種語法分析方法之前,一般只能依據直覺印象,通過猜測、拼湊等手段,去試著推演,湊出符合要求的句型的語法樹。所以這個階段練慣用的題目一般也不很復雜,通過多多練習也能找到一些技巧(其實主要是後面將要學習的自頂向下語法分析中的一些原則)。
對於給定的文法,有一些句型可能能構建出兩棵甚至多棵結構不同的語法樹,結果不一定是唯一的。這樣的文法就是所謂的二義性文法。
對於非二義性文法而言,任意一個句型的語法樹都是唯一的。
2. 編譯原理中=>*表示0步或多步推導,什麼叫0步推導難道不經過產生式嗎。。
0步推導,是指符號串本身已經就是所需要推導的結果,不推導就已經是了。
不推導,當然也就不需要應用任何一個產生式。
舉個例子:
G[S]:
S-->aSb
|
ab
待推導的句子是
w=aabb
現在有3個句型u,v,z,都可以推導出w。
它們分別是:
u=S
v=aSb
z=aabb
那麼:
從句型u推導:
u=S==>aSb==>aabb,需要2步推導
從句型v推導:
v=aSb==>aabb,需要1步推導
從句型z推導:
z=aabb,需要0步推導
3. 編譯原理
編譯原理):利用編譯程序從源語言編寫的源程序產生目標程序的過程; 用編譯程序產生目標程序的動作。 編譯就是把高級語言變成計算機可以識別的2進制語言,計算機只認識1和0,編譯程序把人們熟悉的語言換成2進制的。
編譯程序把一個源程序翻譯成目標程序的工作過程分為五個階段:詞法分析;語法分析;語義檢查和中間代碼生成
(3)如何理解編譯原理的推導擴展閱讀:
編譯程序的語法分析器以單詞符號作為輸入,分析單詞符號串是否形成符合語法規則的語法單位,如表達式、賦值、循環等,最後看是否構成一個符合要求的程序,按該語言使用的語法規則分析檢查每條語句是否有正確的邏輯結構,程序是最終的一個語法單位。
編譯程序的語法規則可用上下文無關文法來刻畫。語法分析的方法分為兩種:自上而下分析法和自下而上分析法。自上而下就是從文法的開始符號出發,向下推導,推出句子。
而自下而上分析法採用的是移進歸約法,基本思想是:用一個寄存符號的先進後出棧,把輸入符號一個一個地移進棧里,當棧頂形成某個產生式的一個候選式時,即把棧頂的這一部分歸約成該產生式的左鄰符號。
4. 怎樣理解編譯原理
如果你在學編譯原理的話,你可以把它理解為一個編寫《編譯器》的時間課程~
當然,事實上,編譯原理的老師也是這么要求的~
編譯器就是把你編寫的源程序代碼變成程序可理解的二進制代碼的過程。
而把這個過程細化之後就可以歸納為:1、預處理過程(例如去掉不需要的空格、注釋之類的~)、2、詞法分析(就是把你寫的程序從頭到尾掃描一遍,識別出你的程序中所有的「單詞」,並編號記錄,按順序放在一張大的二維表中,一遍下一個處理過程用到~,當然,如果你的單詞有錯的話,還要做相應的出錯處理哈~)、3、語法分析(處理的是第二部中得到的單詞二維表,經過一定的演算法處理,可以得到一張成為預測分析表的東東~簡單的說就是按照預測分析表對一個個句子進行檢查,全部通過就進入下一關節,否則出錯處理)、4、語義分析、5、目標代碼的生成(這部分生成基本的與機器無關的單步執行的代碼)
之後的步驟就是與機器有關的東西了~目標代碼優化>匯編代碼生成>生成二進制代碼~
恩,差不多就是這么個流程,你可以再去針對自己感興趣的部分網路一下哈~
5. 關於編譯原理中的最右推導問題。題目如下:
大寫A應該是最右邊的非終結符號,S怎麼是最右非終結符號?最右推導是將最右邊的非終結符號替換
6. 編譯原理的終結符和非終結符如何理解
一、非終結符:
1、非終結符可以再分成更細的東西。
2、不是終結符的都是非終結符。非終結符可理解為一個可拆分元素,而終結符是不可拆分的最小元素。終結符號就是語言中用到的基本元素,名詞、動詞、形容詞、助詞等等基本語言單位。
二、終結符:
1、終結符直接就代表一個意思,比如關鍵字if就不能再分成i和f了。
2、通俗的說就是不能單獨出現在推導式左邊的符號,也就是說終結符不能再進行推導。非終結符則是"語法"中用到的元素,除非談論"語法",一般交談語言中並不會用到非終結符。比如:主語、短語、片語、句子。
(6)如何理解編譯原理的推導擴展閱讀:
終結符和非終結符在計算機科學和語言學的領域是用來指定推導規則的元素。在某個形式語法之中,終結符和非終結符是兩個不交的集合。
從形式語言中定義看,終結符(T)就是不可再分的字元或串。而非終結符(N)是一個遞歸形式的定義:由終結符和至少一個非終結符號組成的串。
如果編譯過程中發現源程序有錯誤,編譯程序應報告錯誤的性質和錯誤的發生的地點,並且將錯誤所造成的影響限制在盡可能小的范圍內,使得源程序的其餘部分能繼續被編譯下去,有些編譯程序還能自動糾正錯誤,這些工作由錯誤處理程序完成。
需要注意的是,一般上編譯器只做語法檢查和最簡單的語義檢查,而不檢查程序的邏輯。
網路-終結符
網路-編譯
7. 編譯原理的最左推導和最右推導問題
最左推導:
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)))
8. 編譯原理的最左推導和最右推導。。。
(2)給出句子0127,34和568的最左推導和最右推導我是剛學編譯原理,不知道該怎麼去思考,從那入手呢? (1)帶先導0的十進制無符號整數 (2)最左推導:
9. 編譯原理求解
E是文法開頭。ε代表終結符號(推理中代表終點或結果,程序語言中代表常量等)。E T 這些大寫字母一般代表非終結符號(這些代表中間過程,非結果。程序中代表函數等等)。開始是E。因為有個G(E)。E就是文法開始符號。推導就有E開始,它也是一個非終結符(代表函數、或者一個推導過程,類似於程序中的main(c++)、winmain(vc++)、dllmain(dll)等主函數)。
1算術表達式文法:這個文法是一個遞歸文法。計算機進行邏輯推導時會走很多彎路(類似於遍歷一顆樹的過程)。為了不讓計算機走彎路(提高效率的目的),可以變換為第二種文法。這種文法消除了遞歸(消除了歧義,類似於後綴表達式),使計算機可以一條直線走到底兒推導出結果。
我也很久沒看編譯原理了。 呵呵