編譯原理實驗報告:實驗一編寫詞法分析程序_第1頁
編譯原理實驗報告:實驗一編寫詞法分析程序_第2頁
編譯原理實驗報告:實驗一編寫詞法分析程序_第3頁
編譯原理實驗報告:實驗一編寫詞法分析程序_第4頁
編譯原理實驗報告:實驗一編寫詞法分析程序_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、 編譯原理實驗報告實驗名稱:實驗一編寫詞法分析程序?qū)嶒烆愋停候炞C型實驗指導(dǎo)教師:何 中 勝專業(yè)班級:13軟件四姓 名:丁越學(xué) 號:13030504電子郵箱:862245792實驗地點:秋白樓B720實驗成績: 日期:2016年 3 月 18 日一、實驗?zāi)康耐ㄟ^設(shè)計、調(diào)試詞法分析程序,實現(xiàn)從源程序中分出各種單詞的方法;熟悉詞法分析程序所用的工具自動機(jī),進(jìn)一步理解自動機(jī)理論。掌握文法轉(zhuǎn)換成自動機(jī)的技術(shù)及有窮自動機(jī)實現(xiàn)的方法。確定詞法分析器的輸出形式及標(biāo)識符與關(guān)鍵字的區(qū)分方法。加深對課堂教學(xué)的理解;提高詞法分析方法的實踐能力。通過本實驗,應(yīng)達(dá)到以下目標(biāo):1、掌握從源程序文件中讀取有效字符的方法和產(chǎn)生

2、源程序的內(nèi)部表示文件的方法。2、掌握詞法分析的實現(xiàn)方法。3、上機(jī)調(diào)試編出的詞法分析程序。二、實驗過程以編寫PASCAL子集的詞法分析程序為例1.理論部分(1)主程序設(shè)計考慮主程序的說明部分為各種表格和變量安排空間。數(shù)組 k為關(guān)鍵字表,每個數(shù)組元素存放一個關(guān)鍵字。采用定長的方式,較短的關(guān)鍵字后面補空格。P數(shù)組存放分界符。為了簡單起見,分界符、算術(shù)運算符和關(guān)系運算符都放在 p表中(編程時,還應(yīng)建立算術(shù)運算符表和關(guān)系運算符表,并且各有類號),合并成一類。id和ci數(shù)組分別存放標(biāo)識符和常數(shù)。instring數(shù)組為輸入源程序的單詞緩存。outtoken記錄為輸出內(nèi)部表示緩存。還有一些為造表填表設(shè)置的變量

3、。主程序開始后,先以人工方式輸入關(guān)鍵字,造 k表;再輸入分界符等造p表。主程序的工作部分設(shè)計成便于調(diào)試的循環(huán)結(jié)構(gòu)。每個循環(huán)處理一個單詞;接收鍵盤上送來的一個單詞;調(diào)用詞法分析過程;輸出每個單詞的內(nèi)部碼。詞法分析過程考慮將詞法分析程序設(shè)計成獨立一遍掃描源程序的結(jié)構(gòu)。其流程圖見圖 1-1。圖1-1該過程取名為 lexical,它根據(jù)輸入單詞的第一個字符(有時還需讀第二個字符),判斷單詞類,產(chǎn)生類號:以字符 k表示關(guān)鍵字;i表示標(biāo)識符;c表示常數(shù);p表示分界符;s表示運算符(編程時類號分別為 1,2,3,4,5)。對于標(biāo)識符和常數(shù),需分別與標(biāo)識符表和常數(shù)表中已登記的元素相比較,如表中已有該元素,則記

4、錄其在表中的位置,如未出現(xiàn)過,將標(biāo)識符按順序填入數(shù)組id中,將常數(shù)變?yōu)槎M(jìn)制形式存入數(shù)組中 ci中,并記錄其在表中的位置。lexical過程中嵌有兩個小過程:一個名為getchar,其功能為從instring中按順序取出一個字符,并將其指針pint加1;另一個名為error,當(dāng)出現(xiàn)錯誤時,調(diào)用這個過程,輸出錯誤編號。2.實踐部分所有識別出的單詞都用兩個字節(jié)的等長表示,稱為內(nèi)部碼。第一個字節(jié)為t,第二個字節(jié)為i。t為單詞的種類。關(guān)鍵字的t=1;分界符的 t=2;算術(shù)運算符的t=3;關(guān)系運算符的t=4;無符號數(shù)的t=5;標(biāo)識符的 t=6。i為該單詞在各自表中的指針或內(nèi)部碼值。表 1-1為關(guān)鍵字表;

5、表1-2為分界符表;表1-3為算術(shù)運算符的i值;表1-4為關(guān)系運算符的i值。關(guān)鍵字表指針l關(guān)鍵字0BEGIN1DO2ELSE3EN4IF5THEN6VAR7WHILE表1-1分界符表指針l分界符0,1;2。3:=4(5)6:7"表1-2算術(shù)運算符指針l算術(shù)運算符10H+11H-20H*21H/表1-3關(guān)系運算符指針l關(guān)系運算符00H<01H<=02H=03H>04H>=05H<>表1-4常數(shù)表和標(biāo)識符表是在編譯過程中建立起來的。其 i值是根據(jù)它們在源程序中出現(xiàn)的順序確定的。另外可以根據(jù)Pascal語言子集中出現(xiàn)其它單詞情況進(jìn)行自行修改以上表格。最后

6、編寫程序進(jìn)行詞法分析,判斷目標(biāo)在哪個表中并進(jìn)行顯示。3、 實驗結(jié)果1.測試數(shù)據(jù)數(shù)據(jù)共分為3組,分別如下:第一組數(shù)據(jù)var i,j,k:integer;begin i:=5; j:=6; k:=i+j; write("k=",k);End.第二組數(shù)據(jù)var i,sum:integer;begin sum:=0; for i:=1 to 10 do begin sum:=sum+i; end; writeln("sum=",sum);End.第三組數(shù)據(jù)var weight,price:real;begin write("please input w

7、eight: "); readln(weight); if weight<10 then price=5; else price=5+(weight-10)*0.4; writeln("price=",price);End.這三組數(shù)據(jù)都是通過文件“test.txt”讀入到程序中,通過程序一一讀取文件中的數(shù)據(jù)進(jìn)行分析,程序分析時要注意所屬的類型。2. 測試結(jié)果以上三組數(shù)據(jù)測試結(jié)果通過控制臺顯示,顯示時要根據(jù)表進(jìn)行分類,不同的表有不同的標(biāo)號,具體顯示如圖1-1,1-2,1-3,和1-4所示:第一組數(shù)據(jù)圖1-2第二組數(shù)據(jù)圖1-3第三組數(shù)據(jù)圖1-4圖1-4(接圖1-

8、5)4、 討論與分析實驗結(jié)果的每一條數(shù)據(jù)可分為兩個部分。第一個部分是識別出的單詞部分,第二個部分(小括號內(nèi)的部分)則顯示了單詞在表中的位置,括號內(nèi)第一個數(shù)字表示是第幾張表,第二個數(shù)字代表單詞在表的位置。實驗結(jié)果與預(yù)期結(jié)果一致。該實驗證明了通過其他語言來編譯一種語言的詞法分析器是可行的。實驗結(jié)果說明了詞法分析是作為相對獨立的階段來完成的。在詞法分析過程中,編譯程序是通過操作系統(tǒng)從外部介質(zhì)中讀取源程序文件中的各個字符的。同時,為正確地識別單詞,有時還需進(jìn)行超前搜索和回退字符等操作。因此,為了提高讀盤效率和便于掃描器進(jìn)行工作,通??刹捎镁彌_輸入的方案,即在內(nèi)存中設(shè)置一個適當(dāng)大小的輸入緩沖區(qū),讓操作系

9、統(tǒng)直接將磁盤上的源程序字符串分批送入此緩沖區(qū)中,供掃描器進(jìn)行處理。5、 附錄:關(guān)鍵代碼部分如下:bool isKey( string str, int &syn) /*判斷是否為關(guān)鍵字,若是傳回相應(yīng)關(guān)鍵碼的種別名*/int i;for(i=0; i<7; i+)if(str = keyi)syn = i + 1;return true;return false;bool isLetter(char c) /判斷是否為字母,若是返回true,不是返回false if(c >= 'A' && c <= 'Z') | (c &

10、gt;= 'a' && c <= 'z')return true;elsereturn false; bool isDigit(char c) /判斷是否為數(shù)字,若是返回true,不是返回falseif(c >= '0' && c <= '9')return true;elsereturn false;void analyse(FILE *fileP)/分析函數(shù)對具體情形進(jìn)行分析int n;char c;string str = ""int count=0;/標(biāo)

11、識變量int count1=0;/標(biāo)識變量while(c = fgetc(fileP) != EOF)if(c = ' ' | c = 'n' | c = 't')continue;else if(isDigit(c) /如果是數(shù)字while(isDigit(c)/數(shù)字后還是數(shù)字str += c;/數(shù)值連接c = fgetc(fileP);fseek(fileP, -1, SEEK_CUR);for(int a=0;a<50;a+)/數(shù)字沒出現(xiàn)在數(shù)組中,在數(shù)組中加入if(arr1a=str)break;else if(arr1a="

12、;")arr1count1=str;count1+;break;for(int b=0;b<50;b+)/數(shù)字的分析if(arr1b=str)cout <<str<< "(5, " << ""<< b << "" << ")" << endl;str = ""else if(isLetter(c) /字母開頭的while(isDigit(c) | isLetter(c)/字母后還是字母str +=

13、 c;c = fgetc(fileP);fseek(fileP, -1, SEEK_CUR);if(isKey(str, n)/如果是關(guān)鍵碼cout <<str<< "(" << 1 << ", " << n << ")" << endl; /關(guān)鍵碼分析elsefor(int i=0;i<50;i+)/標(biāo)識符沒出現(xiàn)在數(shù)組中,在數(shù)組中加入if(arri=str)break;else if(arri="")arrcount=str

14、;count+;break;for(int j=0;j<50;j+)/標(biāo)識符分析if(arrj=str)cout <<str<< "(6, " << ""<< j << "" << ")" << endl;str = ""else /操作符等字符,為表2,3,4中的switch(c)./列舉出現(xiàn)在表2,3,4中的字符進(jìn)行分析,此處略int main()/主函數(shù)FILE *fileP;fileP = fopen("test.txt", "r");/讀文件cout << "-詞法分析如下-" << endl;analyse(fileP);/調(diào)用函數(shù)an

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論