《編譯原理》實驗指導書

2022-09-03 17:24:06 字數 4290 閱讀 1498

黃營楊躍武編寫

2014.4

前言編譯原理實驗是為電腦科學與技術專業本科《編譯原理》課程配套設定的,是《編譯原理》課程講授中乙個重要的、不可或缺的實踐環節。

通過實驗訓練,達到如下目的:

使學生進一步了解和掌握編譯原理,提高對實際專案的分析和設計能力,通過實驗課程,熟悉和基本掌握編譯器的詞法分析,語法分析和**生成,文件資料的編寫格式及規範,全面領會和貫通所學習的理論知識,從而培養學生綜合運用所學課程知識,分析解決問題的能力,培養學生理論聯絡實際作風,實事求是,嚴肅認真的科學態度和良好的工作作風,為今後從事教學工作或科學研究工作打下紮實的基礎。

實驗總體要求

實驗要求對pl語言及其編譯器進行實現及擴充、修改。每個擴充或修改方式可得到不同的分數,滿分為100分。實驗總成績主要從兩大方面評定:

考勤與實際操作技能考核佔50%、實驗報告佔50%。

完成上機作業後,必須提交下列文件:

(1)修改後的pl語言文字。包含詞法分析(正規式),語法分析(bnf)。

(2)有關修改後的pl編譯/直譯器的說明。詳細說明編譯器是如何編譯新的pl語言程式的。指出程式中最精彩的部分,以及為什麼這樣做,如何控制和恢復語義錯誤的。

(3)給出改動後的編譯器源程式清單,並標記出所修改的部分。比較你的編譯器和原來的編譯器之間的差別。

(4)說明你的編譯器中可能存在的錯誤。

(5)總結經驗與教訓,如果重做一遍,會有哪些新的改進?

對現存的pl編譯程式可做如下修改或擴充,其中(1)、(2)、(11)和(12)必須完成,剩餘的均可任意選擇,但總分必須超過40分。

(1)注釋(5分)

(2)布林型別的資料(10分)

(3)布林表示式的短路計算(5分)

(4)陣列(10分)為了便於解釋執行,可能要增加新的pl機器操作指令。

(5)引數(10分) 語法同pascal(不用var宣告)。

(6)函式(10分)語法同pascal。

(7)else子句和repeat語句(5分)

(8)for語句,語法參照pascal或c語言(5分)

(9)exit語句和break語句(5分)

(10)記錄(結構),語法同pascal語言(10分)。

(11)更有力的語法錯誤恢復機制(20分)

(12)分離解釋和編譯器(5分)

實驗專案安排如下:

參考流程圖

實驗一編譯器的詞法分析

一.實驗目的

通過閱讀pl語言的語法圖,設計、編制並除錯乙個pl詞法分析程式,加深學生對詞法分析原理的理解。

二.實驗內容

pl的詞法分析器將要完成以下工作:

(1) 跳過分隔符(如空格,回車,製表符);

(2) 識別諸如begin,end,if,while等保留字;

(3) 識別非保留字的一般識別符號,此識別符號值(字串行)賦給全域性量id,而全域性量sym賦值為sym_identifier。

(4) 識別數字序列,當前值賦給全域性量num,sym則置為sym_number;

(5) 識別:=,<=,>=之類的特殊符號,全域性量sym則分別被賦值為sym_becomes,sym_leq,sym_geq等。

相關過程(函式)有getsym(),getch(),其中getch()為獲取單個字元的過程,除此之外,它還完成:

(1) 識別且跳過行結束符;

(2) 將輸入原始檔進行詞法分析後寫到輸出檔案;

(3) 產生乙份程式列表,輸出相應行號或指令計數器的值。

三.實驗步驟

1. 根據pl/0語言的文法規範,編寫pl/0語言的詞法分析程式。

2. 通過設計除錯詞法分析程式,實現從源程式中分出各種單詞的方法;加深對課堂教學的理解;提高詞法分析方法的實踐能力。

3. 掌握從源程式檔案中讀取有效字元的方法和產生源程式的內部表示檔案的方法。

四.使用以下源程式測試編寫的語法分析程式。

const a=10;

var b,c;

begin

read(b);

c:=a+b;

write(c)

end.

參考輸出:

(constsym,const)

(ident , a)

(eql

(number, 10)

(semicolon, ;)

(varsym, var )

(ident, b)

(comma

(ident, c )

(semicolon, ;)

(beginsym,begin)

(readsym, read )

(lparen, ( )

(ident, b)

(rparen, ) )

(semicolon, ;)

(ident, c )

(becomes, := )

(ident, a )

(plus

(ident, b )

(semicolon, ;)

(writesym,write)

(lparen, ( )

(ident, c )

(rparen, ) )

(endsym, end )

(period, .)

實驗二編譯器的語法分析

一.實驗目的:

掌握pl語言編譯器的語法分析程式設計與ll(1)文法應用的實現方法。

二.實驗內容:

採用遞迴下降的方法來設計pl/0編譯器,證明pl/0語言屬於ll(1)文法。然後結合語法圖編寫(遞迴下降)語法分析程式的一般方法,具體方面有:

(1)用合適的替換將語法約化成盡可能少的單個圖;

(2)將每乙個圖按下面的規則(3)-(7)翻譯成乙個過程說明;

(3)順序圖對應復合語句:

對應:begin t(s1); t(s2); ...; t(sn) end

(4)選擇:

對應:case語句或者條件語句:

case ch ofif ch in l1 then t(s1) else

l1: t(s1if ch in l2 then t(s2) else

l2: t(s2); 或

if ch in ln then t(sn) else

ln: t(snerror

其中li∈first(si),ch為當前輸入符號。(下同)

(5)迴圈:

對應:while ch in l do t(s)

(6)表示另乙個圖a的圖:

對應:過程呼叫a。

(7)表示終結符的單元圖:

對應:if ch == x then read(ch) else error

相關過程有:

block(), constdeclaration(), vardeclaration(), statement(), condition(), expression(), term(), factor()等。

並畫出它們之間依賴關係圖,並在此基礎上實現程式的編制。

並適當進行語義分析的相關檢查:

(1)是否存在識別符號先引用未宣告的情況;

(2)是否存在己宣告的識別符號的錯誤引用;

(3)是否存在一般識別符號的多重宣告。

實驗三編譯器的**生成

一.實驗目的

掌握pl語言編譯器的中間**生成的程式分析與實現方法,並能對錯誤進行分析與處理。

二.實驗內容:

為了使我們的編譯程式保持適當簡單的水平,不致陷入與本課程無關的實際機器的特有性質的考慮中去,我們假想有台適合pl程式執行的計算機,我們稱之為pl處理機。pl處理機順序解釋生成的目標**。

pl處理機的指令集根據pl語言的要求而設計,它包括以下的指令:

(1)lit將常數置於棧頂 */

(2)lod將變數值置於棧頂 */

(3)sto將棧頂的值賦與某變數 */

(4)cal用於過程呼叫的指令 */

(5)int在資料棧中分配存貯空間 */

(6)jmp, jpc /* 用於if, while語句的條件或無條件控制轉移指令 */

(7)opr一組算術或邏輯運算指令 */

上述指令的格式由三部分組成:

其中,f, l, a的含義見下表:

pl的編譯程式為每一條pl源程式的可執行語句生成字尾式目標**。另一方面,發現錯誤,並給出合適的診斷資訊且繼續編譯下去從而發現更多的錯誤,對於編譯程式而言是完全必要的。結合關鍵字規則、鎮定規則,採用策略:

先用一些明顯的關鍵符號給它賦初值,然後隨著分析子目標的層次深入,逐步補充別的合法符號。並編寫子程式去驗證之。

編譯原理實驗指導書

編譯原理實踐教程 作為 編譯原理和技術 課程的延伸,其目的是讓大家動手設計和實現某一規模適中的語言的編譯器,該編譯器不僅涉及編譯程式的各個階段,而且也強調了編譯的總體設計 各個階段的介面安排等等。通過上機實踐,來設計這個相對完整的編譯器,一方面可以使學生增加對編譯程式的整體認識和了解 鞏固 編譯原理...

編譯原理E實驗指導書

實驗1 詞法程式設計 11 實驗2 詞法程式設計 23 實驗3 語法程式設計 14 實驗4 語法程式設計 25 實驗5 語法程式設計 36 實驗6 中間 生成8 實驗1 詞法程式設計 dfa 確定的有窮自動機 的化簡 一 實驗目的與要求 通過設計 編寫和除錯將確定的有窮自動機的狀態數變為最少的c程式...

編譯原理實驗

實驗三中間的 優化 一 實驗目的 掌握區域性優化方法 提高機器的執行速度 二 相關知識 某些編譯程式在中間 或目標 生產之後要對其進行優化,所謂優化就是對 進行等價的變換。而變換後的 執行結果與變換前的 執行結果相同。而執行速度加快或占用記憶體空間減少。中間的 優化就是對中間 進行等價的變換。基本塊...