第六章
一:屬性文法
是在上下文無關文法的基礎上為每個文法符號(終結符或非終結符)配備若干個相關的「值」(稱為屬性)。
屬性:代表與文法符號相關的資訊,和變數一樣,可以進行計算和傳遞。
(1)綜合屬性
用於「自下而上」傳遞資訊
在語法樹中,乙個結點的綜合屬性的值,由其子結點的屬性值確定
(2)繼承屬性
用於「自上而下」傳遞資訊。
在語法樹中,乙個結點的繼承屬性由此結點的父結點和/或兄弟結點的某些屬性確定
(2)繼承屬性
用於「自上而下」傳遞資訊。
在語法樹中,乙個結點的繼承屬性由此結點的父結點和/或兄弟結點的某些屬性確定
4.語義規則所描述的工作
屬性計算
靜態語義檢查
符號表操作
**生成
在乙個屬性文法中,對應於每個產生式a都有一套與之相關聯的語義規則,每條語義規則的形式為:
b:=f(c1,c2,…,ck)
這裡f是乙個函式,而且或者
(1)b是a的乙個綜合屬性並且c1,c2,…ck是產生式右邊文法符號的屬性;或者
(2)b是產生式右邊某個文法符號的乙個繼承屬性並且c1,c2,…ck是a或產生式右邊任何文法符號的屬性
在這兩種情況下,我們都說屬性b依賴於屬性c1,c2,…,ck.
注意:(1)終結符只有綜合屬性,它由詞法分析器提供
(2)非終結符既可以有綜合屬性也可以有繼承屬性,文法開始符號的所有繼承屬性作為屬性計算前的初始值。
二:基於屬性文法的處理方法
1 輸入串語法樹依賴圖語義規則計算次序計算結果
這種由源程式的語法結構所驅動的處理辦法就是語法制導翻譯法。
語義規則的計算可能產生**、在符號表中存放資訊、給出錯誤資訊或執行任何其它動作。對輸入串的翻譯也就是根據語義規則進行計算得出結果。
2 屬性的計算次序
乙個有向非迴圈圖的拓撲序是圖中結點的任何順序m1,m2, …mk,使得邊必須是從序列中前面的結點指向後面的結點。也就是說,如果mimj是mi到mj的一條邊,那麼在序列中mi必須出現在mj之前。
3、樹遍歷的屬性計算方法
假設語法樹已經建立起了,並且樹中已帶有開始符號的繼承屬性和終結符的綜合屬性。然後以某種次序遍歷語法樹,直至計算出所有的屬性。
4.抽象語法樹
從語法樹中去掉對翻譯不必要的資訊,而獲得更有效的源程式中間表示。
這種經變換後的語法樹稱之為抽象語法樹
三:屬性文法的自下而上計算
s—屬性文法,它只含有綜合屬性。
綜合屬性可以在分析符號串的同時由自上而下的分析器來構造
分析器可以儲存與棧中文法符號有關的綜合屬性值
每當進行歸約時,新的屬性值就由棧中正在歸約的產生式右邊符號的屬性值來計算
可以通過擴充分析器中的棧來存放這些綜合屬性值
s-屬性文法的翻譯器通常可借助於lr分析器實現
四:l-屬性文法的自頂向下翻譯
屬性的計算次序受分析方法所限定的分析樹結點建立次序的限制
分析樹的結點是自左向右生成
如果屬性資訊是自左向右流動,那麼就有可能在分析的同時完成屬性計算
五:翻譯模式
翻譯模式是語法制導定義的一種便於翻譯的書寫形式。其中屬性與文法符號相對應,語義規則或語義動作用花括號{ }括起來,可被插入到產生式右部的任何合適的位置上。
這是一種語法分析和語義動作交錯的表示法,他表達在按深度優先遍歷分析樹的過程中何時執行語義動作。
翻譯模式給出了使用語義規則進行計算的順序。可看成是分析過程中翻譯的注釋。
從翻譯模式中消除左遞迴
對於乙個翻譯模式,若採用自頂向下分析,必須消除左遞迴和提取左公因子,在改寫基本文法時考慮屬性值的計算。
第七章一:語義分析概述
語義分析任務
1.審查每乙個語法結構的靜態語義,即驗證語法正確的結構是否有意義。
2.在語義正確的基礎上生成一種中間**或目標**。
語義分析範圍
1.確定型別:確定識別符號所關聯的資料型別。
2.型別檢查:按語言的型別規則,檢查運算的合法性與運算分量型別的一致性,必要時作型別轉換。
3.識別含義:根據語言的語義定義(形式或非形式),識別程式中各構造成分組合到一起的含義,並作相應的語義處理
4.控制流檢查:控制流語句必須轉移到合法的地方。如c中,break語句規定跳出最內層的迴圈或switch語句。
5.一致性檢查:在很多場合要求物件只能被說明一次。如:pascal語言規定同乙個識別符號在乙個分程式中只能被說明一次等。
語法制導翻譯
所謂語法制導翻譯是指:對文法中的每個產生式都附加上乙個語義動作或語義子程式。伴隨著語法分析,每當使用一條產生式進行推導或歸約時,就執行相應產生式的語義動作(包括:查填**,改變變數的求值,診察與報告錯誤,生成中間**等),從而完成預定的翻譯工作。
圖表示法
抽象語法樹。
無迴圈有向圖(dag)
dag與抽象語法樹基本上一樣,對表示式中的每個子表示式,dag中都有乙個結點。乙個內部結點表示乙個操作符,它的孩子表示運算元。
兩者所不同的是,在乙個dag中代表公共子表示式的結點具有多個父結點,而在一棵抽象語法樹中公共子表示式被表示為重複的子樹。
二:三元式
逆波蘭表示法
波蘭表示是一種既不須考慮優先關係、又不用括號的一種表示表示式的方法(字首式)。
現在我們要介紹的剛好是另一種波蘭表示形式,稱為字尾式,即運算子在後。
1.三元式由三個部分組成:
算符:op
第一運算分量:arg1
第二運算分量:arg2
語法制導產生三元式
(1) e→e1 op e2 我們用e.val表示乙個指示器,它或指向有關符號表的某項,或指向三元式表的某項,於是其語義子程式為:
這兒trip(op,arg1,arg2)是乙個語義過程,它產生(op,arg1,arg2)並放入三元式表中,返回三元式在表中的位置
(2)e→i
entry是乙個語義過程,它查詢i在符號表中的位置。若用lookup(name)函式表示對name查詢符號表,找到則返回表項位置,找不到則返回null。 於是可如下實現:
詞法分析器掃瞄到識別符號i時送回(種別碼,i值),語法分析器把i放入語義變數i.lexcal中,這時就可以呼叫entry過程:
無迴圈有向圖(dag)
dag與抽象語法樹基本上一樣,對表示式中的每個子表示式,dag中都有乙個結點。乙個內部結點表示乙個操作符,它的孩子表示運算元。
兩者所不同的是,在乙個dag中代表公共子表示式的結點具有多個父結點,而在一棵抽象語法樹中公共子表示式被表示為重複的子樹
三:某些語句的四元式及翻譯
說明語句的翻譯
為區域性名字建立符號表條目
為它分配儲存單元
符號表中包含名字的型別和分配給它的儲存單元的相對位址等資訊
一、說明語句的翻譯
程式語言中的說明語句都是給編譯程式提供資訊的,諸如型別、維數、每維的界種類等,因此一般不生成目標,只是在編譯時把有關資訊填入相應**即可。
型別轉換
我們可以把型別資訊反映到運算子中,例如用+i,*i表示定點+、*,用+r,*r表示浮點+、*。有的程式語言允許混合運算,有的不允許。如果不允許,則發現有型別不相同的運算分量就應該報錯。如果允許,就要進行型別轉換。
四:迴圈與分情況語句的翻譯
例如f1→for i:=e1 對應的語義動作:
(1)產生四元式:emit(:=,e1.place,--,entry(i));
(2)保留entry(i):f1.place:=entry(i);
(3)因為goto over 的轉移位址暫時填不上,必須
建鏈:f1.chain:=nextquad;
(4)產生無條件轉移指令:emit(j,--,--,0);
五:過程呼叫的翻譯
1. 過程呼叫主要解決兩個問題:
(1)把程式控制轉移到子程式(過程段),執行完畢再返回。這個問題很好解決。
(2)傳遞實在引數。我們前面談到過幾種不同的引數傳遞方式(傳名、傳值、傳位址),它們的語義動作也就有所區別。
六:中間**
把經過語法分析和語義分析而獲得的源程式中間表 示翻譯為中間**表示。
中間語言
語法樹
字尾式三位址**表示
圖表示法
語法樹,有向非迴圈圖和字尾式表示源程式的自然層次結構。
三位址語句的種類
1.賦值語句
2.無條件轉移語句
3.條件轉移語句
4.複製語句
5.過程呼叫語句
6.索引語句
7.位址和指標語句
布林表示式
用布林運算符號(and,or,not)作用到布林變數或關係表示式上而組成
布林表示式的作用:
1. 用作計算邏輯值
2. 用作控制流語句如if-then,if-then-else和while-do等之中的條件表示式
控制流語句中的布林表示式的翻譯
對於出現在條件語句 if e then s1 else s2中的布林表示式e,其作用就是控制對s1和s2的選擇
因此,作為條件的布林表示式,把它設計成兩個出口:e.true 和 e.false
考慮e的上下文,對於if語句,e.true 指向s1, e.false指向s2;對於while語句e.true 指向迴圈的開始, e.false指向while 的下一語句 回填
兩遍掃瞄:
對語法樹按深度優先遍歷,來進行語義分析
從給定的輸入構造出一棵語法樹;
一遍掃瞄:語法制導翻譯技術是屬於一遍掃瞄分析
編譯原理課程總結 第3章
詞法分析器 詞法分析器的功能和輸出形式 關鍵字,識別符號,常數,運算子,界符 單詞符號的識別 超前搜尋 在單詞識別的過程中,通過向前多讀幾個符號的形式,準確的進行單詞的識別。一旦確定識別到的單詞之後,需要進行掃瞄指標的回退,保證單詞識別工作的順利進行 直接分析法 根據讀來的第乙個字元的種類分別轉到各...
編譯原理第五章總結
第五章 語法分析 自下而上分析 1.短語定義 令g是乙個文法,s是文法的開始符號,假定 是文法g的乙個句型 其中 vn vt a vn 如果有 則 稱是句型 相對於非終結符a 的短語 兩個條件必須都滿足 2.規範歸約是關於是乙個最右推導的逆過程,由規範推導推出的句型稱為規範句型。3.算符優先分析法 ...
編譯原理 總結
一 編譯程式 1 編譯器是一種翻譯程式,它用於將源語言 即用某種程式語言寫成的 程式翻譯為目標語言 即用二進位制數表示的偽機器 寫成的 程式。後者在windows作業系統平台下,其檔案的副檔名通常為.obj。該檔案通常還要經過進一步的連線,生成可執行檔案 機器 寫成的程式,擴充套件名為.exe 通常...