編譯原理實驗報告合肥工業大學版

2021-03-04 08:19:43 字數 4440 閱讀 3254

編譯原理實驗報告

合肥工業大學電腦科學與技術

完成日期:2013.6.3

實驗一詞法分析設計

1、實驗功能:

對輸入的txt檔案內的內容進行詞法分析:

由檔案流輸入test.txt中的內容,

對檔案中的各類字元進行詞法分析

列印出分析後的結果;

二、程式結構描述:(源**見附錄)

1、利用key進行構造並儲存關鍵字表;利用optr進行構造並儲存運算子表;利用separator進行構造並儲存分界符表;

2、bool iskey(string ss) {}判斷是否是關鍵字函式若是關鍵字返回true,否則返回false;

bool isletter(char c) {}判斷當前字元是否字母,若是返回true,否則返回false;

bool isdigit(char c) {}判斷當前字元是否是數字,若是返回true,否則返回false;

bool isoptr(string ss) {}判斷當前字元是否是運算子,若是返回true,否則返回false;

bool isseparator(string ss) {}判斷當前字元是否是分界符,若是返回true,否則返回false;

void analyse(ifstream &in) {}分析函式構造;

關係運算子通過switch來進行判斷;

三、實驗結果

實驗總結:

詞法分析的程式是自己親手做的,在實現各個函式時花了不少功夫,

1、要考慮到什麼時候該退一字元,否則將會導致字元漏讀甚至造成字元重複讀取。

2、在實現行數和列數列印時要考慮到row++和line++應該放在什麼位置上才可以,如當讀取乙個\n時line要增加一,而row需要歸0處理,在讀取某一字串或字元後row需要加一;

3、對於關係運算子用switch結構進行選擇判斷即可解決乙個字元和兩個字元的運算子之間的差異;

4、將自己學過的知識應用到實踐中是件不怎麼容易的事情,只有親身嘗試將知識轉化成程式才能避免眼高手低,對於知識的理解也必將更加深刻。

1、實驗原理:

1、寫出ll(1)分析法的思想:當乙個文法滿足ll(1)條件時,我們就可以為它構造乙個不帶回溯的自上而下的分析程式,這個分析程式是有一組遞迴過程組成的,每個過程對應文法的乙個非終結符。實現ll(1)分析的一種有效的方法是使用一張分析表和乙個站進行聯合控制。

**分析表是乙個m[a,a]形式的矩陣,儲存著分析規則;棧stack用於存放文法符號。從棧頂取符號,按照分析表給出的規則進行有步驟的分析。

2.實驗要求實現的文法:

(1)e->tg

(2)g->+tg|—tg

(3)g->ε

(4)t->fs

(5)s->*fs|/fs

(6)s->ε

(7)f->(e)

(8)f->i

2、程式結構:

各個模組:

(1)定義部分:定義常量、變數、資料結構。

(2)初始化:設立ll(1)分析表、初始化變數空間(包括堆疊、結構體、陣列、臨時變數等);

(3)控制部分:從鍵盤輸入乙個表示式符號串;

(4)利用ll(1)分析演算法進行表示式處理:根據ll(1)分析表對表示式符號串進行堆疊(或其他)操作,輸出分析結果,如果遇到錯誤則顯示錯誤資訊。

程式各個部分的實現:

(1)vn儲存非終結符陣列;

vt儲存終結符陣列;

char strtoken[length];//儲存規約表示式

struct ll//ll(1)分析表的構造字初始化

class stack實現棧的要求功能:初始化,判斷空滿,入棧出棧等;

run()函式實現ll(1)文法分析的函式:先將表示式字元入棧,#最先入棧底,依次取棧頂符號,查和符號棧和分析表,進行相應的操作。

3、實驗結果:

測試方法:執行程式,輸入需要分析的語句

測試結果如下:

4、實驗總結:

1、出現下列兩種情況說明遇到了語法錯誤:

(1)棧頂的終結符與當前的輸入符號不匹配。

(2)非終結符a處於棧頂,面臨輸入符號為a,但分析表m中m[a,a]為空。發現錯誤後要盡快的從錯誤中恢復過來使分析能繼續進行下去。

2、對於符號的入棧出棧,哪個應該先入棧,棧頂是哪個元素需要搞清楚,不然得到的結果肯定不對。

實驗三 lr(1)分析法

一實驗原理

lr(1)分析法實驗設計思想及演算法

(1)總控程式,也可以稱為驅動程式。對所有的lr分析器總控程式都是相同的。

(2)分析表或分析函式,不同的文法分析表將不同,同乙個文法採用的lr分析器不同時,分析表將不同,分析表又可以分為動作表(action)和狀態轉換(goto)表兩個部分,它們都可用二維陣列表示。

(3)分析棧,包括文法符號棧和相應的狀態棧,它們均是先進後出棧。

分析器的動作就是由棧頂狀態和當前輸入符號所決定。

二、程式結構

◆ lr分析器由三個部分組成:

◆ 其中:sp為棧指標,s[i]為狀態棧,x[i]為文法符號棧。狀態轉換錶用goto[i,x]=j表示,規定當棧頂狀態為i,遇到當前文法符號為x時應轉向狀態j,x為終結符或非終結符。

◆ action[i,a]規定了棧頂狀態為i時遇到輸入符號a應執行。動作有四種可能:

(1)移進:

action[i,a]= sj:狀態j移入到狀態棧,把a移入到文法符號棧,其中i,j表示狀態號。

(2)歸約:

action[i,a]=rk:當在棧頂形成控制代碼時,則歸約為相應的非終結符a,即文法中有a- b的產生式,若b的長度為r(即|b|=r),則從狀態棧和文法符號棧中自頂向下去掉r個符號,即棧指標sp減去r,並把a移入文法符號棧內,j=goto[i,a]移進狀態棧,其中i為修改指標後的棧頂狀態。

(3)接受acc:

當歸約到文法符號棧中只剩文法的開始符號s時,並且輸入符號串已結束即當前輸入符是'#',則為分析成功。

(4)報錯:

當遇到狀態棧頂為某一狀態下出現不該遇到的文法符號時,則報錯,說明輸入端不是該文法能接受的符號串。

3、實驗結果:

程式測試:輸入需要規約的字串

測試結果:

4、實驗總結

1、與算符優先分析方法比較,用lr分析時,設計特定出錯處理子程式比較容易,因為不會發生不正確的歸約。在分析表的每乙個空項內,可以填入乙個指示器,指向特定的出錯處理子程式,第一類錯誤的處理一般採用插入、刪除或修改的辦法,但要注意,不能從棧內移去任何那種狀態,它代表已成功地分析了程式中的某一部分。

2、lr分析法的歸約過程是規範推導的逆過程,所以lr分析過程是一種規範歸約過程。lr分析法正是給出一種能根據當前分析棧中的符號串(通常以狀態表示)和向右順序檢視輸入串的k個(k≥0)符號就可唯一地確定分析器的動作是移進還是歸約和用哪個產生式歸約,因而也就能唯一地確定控制代碼。其中lr(0)分析器是在分析過程中不需向右檢視輸入符號,因而它對文法的限制較大,然而,它是構造其它lr類分析器的基礎。

因此,首先應學好lr(0)專案集規範族構造的基本原理和方法。當k=1時,已能滿足當前絕大多數高階語言編譯程式實現的需要。slr(1)分析是為學習lr(1)分析做準備,lr(1)專案集族的構造是lalr(1)分析器的構造原理和基礎。

lalr(1) 分析器是當前大多數高階程式語言編譯程式所採用的語法分析技術,也是編譯程式語法分析器自動構造工具yacc的實現基本原理。由此,lr(0)、slr(1)、lalr(1)、lr(1)四種分析器的構造方法都必須深入理解和掌握。

3、經過以上三個實驗的錘煉,不得不說自己編譯原理這門課的認識又提高了乙個階層,對編譯原理的知識運用更加深入,編寫過程中遇到不少的問題,結合課本及強大的網路資源,在完成的過程中得到很多收穫,不僅來自於對知識點的了解更加深入,更是對自己程式設計能力的一次很好的鍛鍊,希望有更多這樣實驗的機會。

4、本人很希望在完成實驗後,老師可以根據自己講的課本,將自己所寫的程式花一段時間來講解,我想這樣會對不會編寫的是一種教學,對會了的同學是一種榜樣效應,可以讓我們有個目標追求,這樣我們收穫了的也會更加準確與豐富。

附錄:實驗一源**:

#include

#include

#include

using namespace std;

string key[8]=;

string optr[4

string separator[6

char ch;

//判斷是否為保留字

bool iskey(string ss)

//字母判斷函式

bool isletter(char c)

//數字判斷函式

bool isdigit(char c)

//運算子判斷函式

bool isoptr(string ss)

//分界符判斷函式

bool isseparator(string ss)

void analyse(ifstream &in) {

string st="";

char ch;

int line=1,row=0;

while((in.get(ch

廣東工業大學編譯原理實驗報告格式

廣東工業大學實驗報告 學院專業 班成績評定 學號姓名合作者 號 教師簽名 實驗 題目第 周星期 第 節 實驗型別 綜合性 設計性 驗證性 編譯原理上機實驗報告 一 實驗目的與要求 目的 在分析理解乙個教學型編譯程式 如pl 0 的基礎上,對其詞法分析程式 語法分析程式和語義處理程式進行部分修改擴充。...

合肥工業大學電子系實習報告

2011年3月28日上午,計算機與資訊學院電子資訊科學與技術和電子資訊工程兩個專業四個班召開了畢業實習動員大會。會議由吳老師和徐老師主持,會上徐老師先對我們畢業實習的意義和重要性做了言簡意賅的講解,同時向我們大家介紹了這次整個實習的日程安排,並向我們介紹了即將前去參觀實習的企業的有關情況。緊接著吳老...

合肥工業大學電子系實習報告

2011年3月28日上午,計算機與資訊學院電子資訊科學與技術和電子資訊工程兩個專業四個班召開了畢業實習動員大會。會議由吳老師和徐老師主持,會上徐老師先對我們畢業實習的意義和重要性做了言簡意賅的講解,同時向我們大家介紹了這次整個實習的日程安排,並向我們介紹了即將前去參觀實習的企業的有關情況。緊接著吳老...