版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 編譯原理實驗報告實驗名稱:實驗一編寫詞法分析程序?qū)嶒烆愋停候炞C型實驗指導(dǎo)教師:何 中 勝專業(yè)班級:13軟件四姓 名:丁越學(xué) 號:13030504電子郵箱:862245792實驗地點:秋白樓B720實驗成績: 日期:2016年 3 月 18 日一、實驗?zāi)康耐ㄟ^設(shè)計、調(diào)試詞法分析程序,實現(xiàn)從源程序中分出各種單詞的方法;熟悉詞法分析程序所用的工具自動機,進一步理解自動機理論。掌握文法轉(zhuǎn)換成自動機的技術(shù)及有窮自動機實現(xiàn)的方法。確定詞法分析器的輸出形式及標(biāo)識符與關(guān)鍵字的區(qū)分方法。加深對課堂教學(xué)的理解;提高詞法分析方法的實踐能力。通過本實驗,應(yīng)達到以下目標(biāo):1、掌握從源程序文件中讀取有效字符的方法和產(chǎn)生
2、源程序的內(nèi)部表示文件的方法。2、掌握詞法分析的實現(xiàn)方法。3、上機調(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制形式存入數(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)其它單詞情況進行自行修改以上表格。最后
6、編寫程序進行詞法分析,判斷目標(biāo)在哪個表中并進行顯示。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ù)進行分析,程序分析時要注意所屬的類型。2. 測試結(jié)果以上三組數(shù)據(jù)測試結(jié)果通過控制臺顯示,顯示時要根據(jù)表進行分類,不同的表有不同的標(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ì)中讀取源程序文件中的各個字符的。同時,為正確地識別單詞,有時還需進行超前搜索和回退字符等操作。因此,為了提高讀盤效率和便于掃描器進行工作,通??刹捎镁彌_輸入的方案,即在內(nèi)存中設(shè)置一個適當(dāng)大小的輸入緩沖區(qū),讓操作系
9、統(tǒng)直接將磁盤上的源程序字符串分批送入此緩沖區(qū)中,供掃描器進行處理。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ù)對具體情形進行分析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中的字符進行分析,此處略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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 有關(guān)抵押借款合同范文
- oem委托加工合同協(xié)議常用范本年
- 變電站安裝工程承包合同模板
- 2024年高考英語 (全國甲卷)真題詳細解讀及評析
- 個人商品購銷合同
- 2025年外研版九年級歷史下冊月考試卷含答案
- 貨物運輸合同、法規(guī)與保險
- 2025年外研版九年級歷史下冊階段測試試卷
- 造紙機購買合同
- 民政局離婚的協(xié)議書范本
- 全過程造價咨詢服務(wù)的質(zhì)量、進度、保密等保證措施
- 開工第一課安全培訓(xùn)內(nèi)容
- 湖北省石首楚源“源網(wǎng)荷儲”一體化項目可研報告
- 經(jīng)顱磁刺激增強定神狀態(tài)的研究
- Creo-7.0基礎(chǔ)教程-配套課件
- 六年級人教版上冊數(shù)學(xué)計算題練習(xí)題(及答案)100解析
- 超聲科質(zhì)量控制制度及超聲科圖像質(zhì)量評價細則
- 初中物理滬粵版八年級下冊《第六章 力和機械》章節(jié)練習(xí)(含答案)
- 金礦管理制度
- 橋梁樁基礎(chǔ)施工概述及施工控制要點
- JB/T 20036-2016提取濃縮罐
評論
0/150
提交評論