編譯原理實驗指導書
西北農林科技大學資訊工程學院
2023年3月7日
實驗一詞法分析 1
實驗二語法分析 3
實驗三語義分析1 4
實驗四語義分析2 4
實驗五錯誤處理 4
附錄 5
實驗環境和工具 5
minic語言 21
實習一詞法分析
一、實驗目的:
1. 熟悉j**acc工作原理,掌握詞法分析相關的類:
token:表示單詞的類。每個token物件的主要成員:
int kind表示單詞的種別; string image 儲存了token所代表的內容;int beginline表示單詞所處的行;int begincolumn表示單詞所處的列。
tokenmanager:詞法分析器,用來識別源程式中的單詞序列。
******charstream:詞法分析器的輸入流。可以指定源程式來自於標準輸入還是檔案。
tokenmgrerror:詞法錯誤類,當識別到非法單詞時,彈出的錯誤物件。
constants:儲存已定義所有單詞的介面,針對每種單詞定義其對應的種別碼。
2. 使用以上的類,編制乙個讀單詞過程,從輸入的源程式中,識別出各個具有獨立意義的單詞,即基本保留字、識別符號、常數、運算子、分隔符五大類。並依次輸出各個單詞的內部編碼及單詞符號自身值。
二、實驗預習提示
1. 詞法分析器的功能和輸出格式
詞法分析器的功能是讀入源程式,輸出單詞序列。詞法分析器的單詞常表示成二元式:(單詞種別碼,單詞在源**中的字串)。
2. 詞法分析器需要把物件語言的詞法規則全部描述出來,在這我們取c語言子集,它的詞法定義如下:
(1)關鍵字keyword
if else int return void while…….. 所有的關鍵字都是小寫。
(2)識別符號identifier
識別符號的定義採取正規表示式定義方式,識別符號由字母、數字、下劃線「_」組成,並且首字母不能是數字。
(3)分隔符separater
(4)運算子operator
> < =
(5)常數constant
簡化為只表示整型常數。
(6)詞法分析過濾的字元
空格「 」、製表符「\t」、回車「\r」 和換行符「\n」。
三、實驗過程和指導:
1. 準備
編譯原理的實習借助的j**acc外掛程式版本是1.5.33,要求jdk版本是1.7。請提前安裝除錯好。
2. 新建乙個用於j**acc編輯的jj模板檔案:
(1)新建j**a專案
(2)建立乙個詞法分析包(例如:package lexical)
(3)在lexical 包內,「新建」-「其它」-「j**acc template file」
(4)建立乙個「.jj」檔案,如圖1所示:
圖1 新建jj模板檔案
3. 在模板檔案中修改第三部分,將「二、實驗預習提示」部分的詞法規則寫入。
圖2 jj模板檔案格式
4. 在熟悉詞法分析器工作原理的基礎上,在main方法中編寫詞法分析程式,並輸出單詞序列。要求:準備好多組測試源程式。
四、程式輸入/輸出示例:
圖3 測試源**
圖4 詞法分析輸出1
對照圖3,圖4顯示了詞法輸出的二元組序列(單詞種別碼,單詞在源**中的字串)。圖4中最後一行提示詞法錯誤的原因是
實驗二語法分析
一、實驗目的:
設計minic的上下文無關文法,利用j**acc生成除錯遞迴下降分析程式,以便對任意輸入的符號串進行分析。本次實驗的目的主要是加深對遞迴下降分析法的理解。
二、語法分析器:
按照minic語言的語法規則檢查詞法分析輸出的記號流是否符合這些規則,並根據這些規則所體現出的語言中的各種語法結構的層次性。把規則寫入到j**acc的 .jjt檔案中,可以生成樹狀的層次結構。
三、j**acc:
在j**acc的文法規範檔案中,不僅可以描述語言的語法規範,而且可以描述詞法規範,本次實習中,利用j**acc以minic語言構造乙個不含語義分析的編譯器前端,包括詞法分析、語法分析,並要考慮語法分析中的錯誤恢復問題。通過使用j**acc, 可以體會ll(k)文法的編寫特點,掌握編寫j**acc文法規範檔案的方法。
內容:利用j**acc生成乙個minic的語法分析器;
要求:1. 用流的形式讀入要分析的c語言程式,或者通過命令列輸入源程式。
2. 具有錯誤檢查的能力,如果有能力可以輸出錯誤所在的行號,並簡單提示
3. 如果輸入的源程式符合minic的語法規範,輸出該程式的層次結構的語法樹
具體實施步驟如下:
1.把minic轉換為文法如下
〈程式〉 → int main()
〈語句塊〉→〈語句〉|
〈語句〉 →〈順序語句〉|〈條件語句〉|〈迴圈語句〉
〈順序語句〉→〈宣告語句〉| 〈賦值語句〉
〈賦值語句〉→ id =〈表示式〉
〈條件語句〉→ if〈條件〉〈語句塊〉
〈迴圈語句〉→ while〈條件〉〈語句塊〉
〈條件〉 →(〈表示式〉〈關係符〉〈表示式〉)
〈表示式〉→〈表示式〉〈運算子〉〈表示式〉|(〈表示式〉)|id|num
(也可以使用j**acc自動生成的表示式expression的文法)
〈運算子〉→+|-|*|/
〈關係符
2.在eclipse環境下完成j**acc的外掛程式安裝後,寫乙個j**acc文法規範檔案(擴充套件名為jj)
3.完成的功能包括詞法分析,語法分析(輸出語法樹),能夠讀檔案,也能夠把輸出的結果儲存檔案中,可以把樹的層次結果輸出到檔案中。
實驗三語義分析
一、實習目的
通過上機實習,加深對語法制時翻譯原理的理解,掌握將語法分析所識別的語法成分變換為中間**的語義翻譯方法。
二、實習要求
採用遞迴下降語法制導翻譯法對算術表示式、賦值語句、條件語句、迴圈語句進行語義分析生成四元式序列。
實習的輸入和輸出(舉例)
1.輸入語法分析提供的正確的單詞串,輸出四元式序列。例如:對於語句串:
float r , h , s;
s=2*3.1416*r*(h+r)
2.輸出的四元式序列如下:
(1) (*,2,3.1416,t1)
(2) (*, t1, r, t2)
(3) (+, h, r, t3)
(4) (*, t2, t3, t4)
(5) (=, t4, _, s)
3.實習內容:以下三個內容難度不同,三選一實現即可。
(1)寫出乙個源程式中僅包含if…else, if語句的語法分析。要求能分析其自身巢狀。
(2)寫出乙個源程式中僅包含while語句的語法分析。求能分析其自身巢狀。
(3)寫出乙個源程式中包含while語句、if-else、if語句的語法分析。 要求能分析其自身巢狀。
注意:(1)對條件的判斷只需要實現關係表示式即可,不需要實現布林表示式的翻譯;
(2)「巢狀」功能的實現依賴於文法。如果:
《語句》 =>… => if語句〉→ if〈條件〉〈語句〉 (產生式)
則有: … => if〈條件〉 if〈條件〉〈語句〉
即, 測試**:
void main()
結果:1a, 2, t1 )
2: (j<, t1, b, 4 )
3: (j11 )
4: (j>, c, d, 6 )
5: (j10 )
6b, 1, t2 )
7t2a )
87c )
9: (j4 )
10: (j1 )
void main()
else if(b>7)
}結果:
1a, 2, t1 )
2: (j>, t1, 3, 4 )
3: (j6 )
46b )
5: (j11 )
6: (j>, b, 7, 8 )
7: (j11 )
8a, b, t2 )
9t2c )
100d )
《編譯原理》實驗指導書
黃營楊躍武編寫 2014.4 前言編譯原理實驗是為電腦科學與技術專業本科 編譯原理 課程配套設定的,是 編譯原理 課程講授中乙個重要的 不可或缺的實踐環節。通過實驗訓練,達到如下目的 使學生進一步了解和掌握編譯原理,提高對實際專案的分析和設計能力,通過實驗課程,熟悉和基本掌握編譯器的詞法分析,語法分...
編譯原理實驗指導書
編譯原理實踐教程 作為 編譯原理和技術 課程的延伸,其目的是讓大家動手設計和實現某一規模適中的語言的編譯器,該編譯器不僅涉及編譯程式的各個階段,而且也強調了編譯的總體設計 各個階段的介面安排等等。通過上機實踐,來設計這個相對完整的編譯器,一方面可以使學生增加對編譯程式的整體認識和了解 鞏固 編譯原理...
編譯原理E實驗指導書
實驗1 詞法程式設計 11 實驗2 詞法程式設計 23 實驗3 語法程式設計 14 實驗4 語法程式設計 25 實驗5 語法程式設計 36 實驗6 中間 生成8 實驗1 詞法程式設計 dfa 確定的有窮自動機 的化簡 一 實驗目的與要求 通過設計 編寫和除錯將確定的有窮自動機的狀態數變為最少的c程式...