資訊工程學院編譯原理實習指導書 老版

2022-11-24 07:51:03 字數 4210 閱讀 7520

編譯原理實驗指導書

西北農林科技大學資訊工程學院

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程式...