編譯原理實(shí)驗(yàn)報(bào)告_第1頁(yè)
編譯原理實(shí)驗(yàn)報(bào)告_第2頁(yè)
編譯原理實(shí)驗(yàn)報(bào)告_第3頁(yè)
編譯原理實(shí)驗(yàn)報(bào)告_第4頁(yè)
編譯原理實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、編譯原理實(shí)驗(yàn)報(bào)告姓名: 學(xué)號(hào): 班級(jí): 學(xué)院: 南昌大學(xué)信息工程學(xué)院計(jì)算機(jī)系2014年6月目錄實(shí)驗(yàn)一3實(shí)驗(yàn)二8實(shí)驗(yàn)三15實(shí)驗(yàn)1 詞法分析程序的設(shè)計(jì)學(xué)生姓名: 學(xué) 號(hào): 專業(yè)班級(jí): 實(shí)驗(yàn)類型: 驗(yàn)證 綜合 設(shè)計(jì) 創(chuàng)新 實(shí)驗(yàn)日期: 實(shí)驗(yàn)成績(jī): 一、實(shí)驗(yàn)?zāi)康恼莆沼?jì)算機(jī)語(yǔ)言的詞法分析程序的開發(fā)方法。 二、實(shí)驗(yàn)內(nèi)容編制一個(gè)能夠分析三種整數(shù)、標(biāo)識(shí)符、主要運(yùn)算符和主要關(guān)鍵字的詞法分析程序。三、實(shí)驗(yàn)要求1、根據(jù)以下的正規(guī)式,編制正規(guī)文法,畫出狀態(tài)圖;標(biāo)識(shí)符(|)*十進(jìn)制整數(shù)0 |(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*如有余力,則進(jìn)一步分析八進(jìn)制和十六進(jìn)制整數(shù),其正規(guī)

2、式如下:八進(jìn)制整數(shù) 0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*十六進(jìn)制整數(shù)0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*運(yùn)算符和界符+ - * / = = ( ) ; 關(guān)鍵字main if then else while do int (可根據(jù)需要添加)2、根據(jù)狀態(tài)圖,設(shè)計(jì)詞法分析函數(shù)int scan( ),完成以下功能:1) 從文本文件中讀入測(cè)試源代碼,根據(jù)狀態(tài)轉(zhuǎn)換圖,分析出一個(gè)單詞,2) 以二元式形式輸出單詞其中單詞種類用整數(shù)表示:0:標(biāo)識(shí)符1:十進(jìn)制整數(shù)2:八進(jìn)制整數(shù)3:

3、十六進(jìn)制整數(shù)運(yùn)算符和界符,關(guān)鍵字采用一字一符,不編碼其中單詞屬性表示如下:標(biāo)識(shí)符,整數(shù)由于采用一類一符,屬性用單詞表示運(yùn)算符和界符,關(guān)鍵字采用一字一符,屬性為空3、編寫測(cè)試程序,反復(fù)調(diào)用函數(shù)scan( ),輸出單詞種別和屬性。 四、實(shí)驗(yàn)環(huán)境PC微機(jī)DOS操作系統(tǒng)或 Windows 操作系統(tǒng)Turbo C 程序集成環(huán)境或 Visual C+ 程序集成環(huán)境五、實(shí)驗(yàn)步驟1.根據(jù)正規(guī)式,畫出狀態(tài)轉(zhuǎn)換圖;2. 根據(jù)狀態(tài)圖,設(shè)計(jì)詞法分析算法;3. 采用C語(yǔ)言,設(shè)計(jì)函數(shù)scan( ),實(shí)現(xiàn)該算法;4. 編制測(cè)試程序(主函數(shù)main);代碼如下:21#include#include#include#defin

4、e SYMBOL_CODE 0/ 標(biāo)識(shí)符編碼 0#define NUM_CODE1/ 數(shù)字編碼 1/ 可識(shí)別的關(guān)鍵字 char keywordstab830=main,if,then,else,int,return,void,while;char ch;/接受字符char name30=;FILE *sourceFile;/源文件FILE *outputFile;/輸出文件void isNumber();void isOthers();void isKeyword();void output_keyword()printf(關(guān)鍵字:n,name,-);void output_symbol()p

5、rintf(標(biāo)識(shí)符:n,0,name);void output_number()printf(數(shù)字:n,1,name);void output_others()printf(其他:n,name,-);/=void scan() sourceFile = fopen(program.txt,r);/ 以讀取方式打開源文件if( sourceFile = NULL)printf(file open errorn);exit(0);outputFile = fopen(output.txt,w);/ 以寫方式打開輸出文件 if(outputFile=NULL)printf(file open err

6、orn);exit(0);ch = fgetc(sourceFile);/ 讀取字符 while(ch != EOF) / 標(biāo)識(shí)符以字母或下劃線開頭 if(ch=a & ch=A & ch=0& ch=9) isNumber(); else isOthers(); fclose(sourceFile); fclose(outputFile);/=void isKeyword()int i=0, j=0, k=0;int flag = 0;for(k=0; k=a) & (ch=A) & (ch0 & ch9) namei+ = ch;/ 把標(biāo)識(shí)符名字存入數(shù)組 ch = fgetc(source

7、File);/ 讀取下一個(gè)字符for(i=0; i8; i+)for(j=0; j30; j+)/ 判斷是否與關(guān)鍵字匹配 if(namej = keywordstabij) flag = 0; else / 如果與當(dāng)前關(guān)鍵字不匹配則跳出內(nèi)循環(huán)繼續(xù)與下一個(gè)關(guān)鍵字匹配 flag = 1; break; if(flag=0)/ 如果是關(guān)鍵字則跳出外循環(huán)break;if(flag=0)/ 是關(guān)鍵字output_keyword();/ 輸出關(guān)鍵字(限于篇幅輸出函數(shù)沒有放上來(lái))else/ 不是關(guān)鍵字output_symbol();/ 輸出標(biāo)識(shí)符 /=void isNumber()int i=0;for(i

8、=0; i=0& ch=9)namei+ = ch;ch = fgetc(sourceFile);output_number();/=void isOthers() char ch1; int i; for(i=0; i30; i+) namei=0; switch(ch) case +:case -:case *:case /: case ;:case (:case ):case :case :case :case :name0 = ch;ch = fgetc(sourceFile); output_others();break;case:case=: ch1 = fgetc(sourceF

9、ile);if(ch1 = =) name0= ch; name1= =; ch = fgetc(sourceFile);/ 讀取下一個(gè)字符 output_others();break;else name0= ch;output_others();ch = ch1;break;case :case 10:/ 換行符ch = fgetc(sourceFile); break;default :ch = fgetc(sourceFile); break; /=void main() scan();5、調(diào)試程序:檢查輸出結(jié)果是否正確。六、思考題1、 詞法分析能否采用空格來(lái)區(qū)分單詞?答:不能。程序中分

10、割單詞的不僅僅是空格,還可以是+,-,*,/,T|E+T; T-F|T*F; F-i|(E);2、 根據(jù)該文法構(gòu)造相應(yīng)的LL(1)文法及LL(1)分析表,并為該文法設(shè)計(jì)預(yù)測(cè)分析程序,利用C語(yǔ)言或C+語(yǔ)言或Java語(yǔ)言實(shí)現(xiàn);3、 利用預(yù)測(cè)分析程序完成下列功能:1) 手工將測(cè)試的表達(dá)式寫入文本文件,每個(gè)表達(dá)式寫一行,用“;”表示結(jié)束;2) 讀入文本文件中的表達(dá)式;3) 調(diào)用實(shí)驗(yàn)一中的詞法分析程序搜索單詞;4) 把單詞送入預(yù)測(cè)分析程序,判斷表達(dá)式是否正確(是否是給出文法的語(yǔ)言),若錯(cuò)誤,應(yīng)給出錯(cuò)誤信息;5) 完成上述功能,有余力的同學(xué)可以進(jìn)一步完成通過程序?qū)崿F(xiàn)對(duì)非LL(1)文法到LL(1)文法的自動(dòng)

11、轉(zhuǎn)換(見實(shí)驗(yàn)二附加資料1)。四、實(shí)驗(yàn)環(huán)境PC微機(jī)Windows 操作系統(tǒng)Visual C+ 程序集成環(huán)境五、實(shí)驗(yàn)步驟1. 分析文法,將給出的文法轉(zhuǎn)化為L(zhǎng)L(1)文法;GEE-T|E+T;T-F|T*F;F-i|(E);對(duì)應(yīng)的LL(1)文法為:E-TE1E1-+TE1 | ;T-FT1;T1-*FT1 | ;F-i|(E);2. 構(gòu)造該文法中非終結(jié)符的FIRST集和FOLLOW集:FIRST(E)= (, i FOLLOW(E) = ),# FIRST(E1)= +, FOLLOW(E1)= ),# FIRST(T) = ( , i FOLLOW(T) = +,),# FIRST(T1)= *,

12、 FOLLOW(T1)= +,),# FIRST(F) = ( , i FOLLOW(F) = *,+,),# 3. 構(gòu)造預(yù)測(cè)分析表:i+*()#EE-TE1E-TE1E1E1-+TE1E1- E1- TT-FT1T-FT1T1T1- T1-*FT1T1- T1- FF-iF-(E)注:在程序中用P代替E1, Q代替T1。4. 學(xué)習(xí)預(yù)測(cè)分析程序的結(jié)構(gòu),設(shè)計(jì)合理的預(yù)測(cè)分析程序;4. 編寫測(cè)試程序,包括表達(dá)式的讀入和結(jié)果的輸出;FILE *inputFile;/輸入文件FILE *outputFile;/輸出文件char currentStr10;/ 用來(lái)存放輸入的字符串char currentC

13、har;/ 當(dāng)前讀取的字符char tabData5;/ 從預(yù)測(cè)分析表中匹配的產(chǎn)生式右部char statement50;/ 用于存放讀取的語(yǔ)句int index = 0;int finish = 0;int endFlag = 0;/ 文件結(jié)尾int errorFlag = 0;/ 語(yǔ)法錯(cuò)誤標(biāo)志int endOfStamnt = 0;/ 用于判斷是否達(dá)到語(yǔ)句結(jié)尾/預(yù)測(cè)分析表: 表示錯(cuò)誤, K表示空串char E 105 = E,iTP,+,*,(TP,),#;char E1105 = P,i,+TP,*,(,)K,#K;char T 105 = T,iFQ,+,*,(FQ,),#;char

14、T1105 = Q,i,+K,*FQ,(,)K,#K;char F 105 = F,ii,+,*,(E),),#;struct Stack/ 用來(lái)模擬符號(hào)棧int top;/ 棧頂指針char strNameMAX_STACK; / 棧中存放的符號(hào)串stack;/=void checkOneStatement()char chtop;errorFlag = 0;finish = 0;stack.top = 0;tabData0 = 0;push(#);push(E);currentChar = readNext();/ 讀取字符while(!finish)showStack();chtop =

15、 pop();/ 棧頂字符printf(char=%ct,currentChar);printf(tabData=%sn,tabData);if(chtop = currentChar)if(chtop = #)finish = 1;/ finishprintf(正確!n);break;currentChar = readNext();else if(chtop = #)error();exit(0);else int i;match(chtop,currentChar);if(tabData1 = )error();printf(錯(cuò)誤:%cn,currentChar);finish = 1;

16、elsefor(i=0; tabDatai!=0; i+);i-;while(i0)if(tabDatai- != K)push(tabDatai+1);/ end while(!finish)/=void main()init();while(!endFlag)index = 0;checkOneStatement();/ 對(duì)一條語(yǔ)句做語(yǔ)法檢查if(errorFlag)printf(語(yǔ)句:%s 錯(cuò)誤!n,statement);fprintf(outputFile,語(yǔ)句:%s 錯(cuò)誤!n,statement);else if(!endFlag)printf(語(yǔ)句:%s 合法!n,statemen

17、t);fprintf(outputFile,語(yǔ)句:%s 合法!n,statement);fclose(inputFile);fclose(outputFile);exit(0);六、測(cè)試數(shù)據(jù) 輸入數(shù)據(jù):編輯一個(gè)文本文文件expression.txt,在文件中輸入如下內(nèi)容:10;1+2;(1+2)*3+(5+6*7);(1+2)*3+4;1+2+3+(*4+5);(a+b)*(c+d);(ab3+de4)*5)+1;先調(diào)用實(shí)驗(yàn)一的詞法分析程序掃描輸入語(yǔ)句輸出結(jié)果如下: 圖:輸入文件然后調(diào)用本次實(shí)驗(yàn)的語(yǔ)法分析程序?qū)υ~法分析的結(jié)果進(jìn)行處理,結(jié)果如下:輸出文件:七、實(shí)驗(yàn)總結(jié)在本次實(shí)驗(yàn)過程中,通過設(shè)計(jì)、

18、編制、調(diào)試一個(gè)典型的語(yǔ)法分析程序,實(shí)現(xiàn)對(duì)詞法分析程序所提供的單詞序列進(jìn)行語(yǔ)法檢查和結(jié)構(gòu)分析,進(jìn)一步掌握常用的語(yǔ)法分析中預(yù)測(cè)分析方法。將書本上的理論知識(shí)運(yùn)用到實(shí)驗(yàn)中,加深、鞏固了對(duì)語(yǔ)法制導(dǎo)翻譯原理的理解。八、思考題如果使用遞歸下降分析法來(lái)進(jìn)行語(yǔ)法分析,為什么文法必須先轉(zhuǎn)化為L(zhǎng)L(1)文法再做遞歸下降分析?答:為了消除左遞歸和消除回溯。實(shí)驗(yàn)3 語(yǔ)法分析程序的設(shè)計(jì)(2)學(xué)生姓名: 學(xué) 號(hào): 專業(yè)班級(jí): 實(shí)驗(yàn)類型: 驗(yàn)證 綜合 設(shè)計(jì) 創(chuàng)新 實(shí)驗(yàn)日期: 實(shí)驗(yàn)成績(jī): 一、實(shí)驗(yàn)?zāi)康耐ㄟ^設(shè)計(jì)、編制、調(diào)試一個(gè)典型的語(yǔ)法分析程序,實(shí)現(xiàn)對(duì)詞法分析程序所提供的單詞序列進(jìn)行語(yǔ)法檢查和結(jié)構(gòu)分析,進(jìn)一步掌握常用的語(yǔ)法分析中

19、算符優(yōu)先分析方法,并加深對(duì)語(yǔ)法制導(dǎo)翻譯原理的理解。二、實(shí)驗(yàn)內(nèi)容設(shè)計(jì)一個(gè)文法的算符優(yōu)先分析程序,判斷特定表達(dá)式的正確性,并結(jié)合語(yǔ)法制導(dǎo)翻譯原理,構(gòu)造相應(yīng)語(yǔ)義規(guī)則,將語(yǔ)法分析所識(shí)別的正確的表達(dá)式翻譯計(jì)算出結(jié)果。三、實(shí)驗(yàn)要求1、給出文法如下: GE E-T|E+T; T-F|T*F; F-i|(E);可以構(gòu)造算符優(yōu)先表如下:+*()i+ * ( ) i 2、計(jì)算機(jī)中表示上述優(yōu)先關(guān)系,優(yōu)先關(guān)系的機(jī)內(nèi)存放方式有兩種1)直接存放,2)為優(yōu)先關(guān)系建立優(yōu)先函數(shù),這里選擇直接存放;1、 給出算符優(yōu)先分析算法如下:k:=1; Sk:=#;REPEAT 把下一個(gè)輸入符號(hào)讀進(jìn)a中; IF SkVT THEN j:=k

20、 ELSE j:=k-1; WHILE Sj a DO BEGIN REPEAT Q:=Sj; IF Sj-1VT THEN j:=j-1 ELSE j:=j-2 UNTIL Sj Q 把Sj+1Sk歸約為某個(gè)N; k:=j+1; Sk:=N; END OF WHILE; IF Sj a OR Sj a THEN BEGIN k:=k+1;Sk:=a END ELSE ERROR UNTIL a=# 4、 根據(jù)給出算法,利用適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)算符優(yōu)先分析程序;5、 利用算符優(yōu)先分析程序完成下列功能:1) 手工將測(cè)試的表達(dá)式寫入文本文件,每個(gè)表達(dá)式寫一行,用“;”表示結(jié)束;2) 讀入文本文件中的

21、表達(dá)式;3) 調(diào)用實(shí)驗(yàn)2中的詞法分析程序搜索單詞;4) 把單詞送入算法優(yōu)先分析程序,判斷表達(dá)式是否正確(是否是給出文法的語(yǔ)言),若錯(cuò)誤,應(yīng)給出錯(cuò)誤信息;5) 完成上述功能,有余力的同學(xué)可以對(duì)正確的表達(dá)式計(jì)算出結(jié)果。四、實(shí)驗(yàn)環(huán)境PC微機(jī)DOS操作系統(tǒng)或 Windows 操作系統(tǒng)Turbo C 程序集成環(huán)境或 Visual C+ 程序集成環(huán)境五、實(shí)驗(yàn)步驟1、分析文法中終結(jié)符號(hào)的優(yōu)先關(guān)系;2、存放優(yōu)先關(guān)系或構(gòu)造優(yōu)先函數(shù);3、利用算符優(yōu)先分析的算法編寫分析程序;4、寫測(cè)試程序,包括表達(dá)式的讀入和結(jié)果的輸出;#include malloc.h#include#include stdio.h/#defin

22、e _DEBUG_ 0/ 是否打印調(diào)試信息/存儲(chǔ)算符優(yōu)先關(guān)系表,大于為1,小于為-1,等于為0,其它為2表示出錯(cuò)int table66= 1,-1,-1, 1,-1, 1, 1, 1,-1, 1,-1, 1, -1,-1,-1, 0,-1, 2, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 2, 1, -1,-1,-1, 2,-1, 0;char E64=E+T,E+F,T+F,T+T,F+T,F+F;char F44=(E),(F),(T),i;char T24=F*F,T*F;FILE *inputFile;/輸入文件FILE *outputFile;/輸出文件char c

23、urrentStr10;/ 用來(lái)存放輸入的字符串char currentChar;/ 當(dāng)前讀取的字符char tabData5;/ 從預(yù)測(cè)分析表中匹配的產(chǎn)生式右部char statement50;/ 用于存放讀取的語(yǔ)句int index = 0;int endFlag = 0;/ 文件結(jié)尾/=打開文件讀寫流void init()inputFile = fopen(wordfile.txt,r);if( inputFile = NULL) printf(inputfile open errorn); exit(0); outputFile = fopen(outputfile.txt,w);if

24、( outputFile = NULL) printf(outputfile open errorn); exit(0); /=讀取下一個(gè)輸入字符char readNext()char ch;int i;for(i=0; i10; i+)currentStri = 0;while(ch = fgetc(inputFile) != ; i+)currentStri = ch;ch = fgetc(inputFile);if(currentStr0=0 | currentStr0=1)for(i=2; currentStri != 0; i+)statementindex+ = currentSt

25、ri;return i;else if(currentStr0 = ;)statementindex+ = ;statementindex+ = 0;return #;else statementindex+ = currentStr0;return currentStr0;int match(char ch)int t; switch(ch) case +:t=0;break; case *:t=1;break; case (:t=2;break;case ):t=3;break; case i:t=4;break; case #:t=5;break;default:t=-1;/ 用于判斷非

26、終結(jié)符 return t; /=查算符優(yōu)先表表int getState(char Si, char a)int i=match(Si), j=match(a);return tableij;/=對(duì)字符串歸約char reduce(char* c_ptr)int i,j;char* ch_ptr = c_ptr;if(* ch_ptr = i)return F;for(i=0;i6;i+)for(j=0;j3;j+)if(*ch_ptr != Eij)break;ch_ptr+;if(j=3)return E;ch_ptr = c_ptr;for(i=0;i3;i+)for(j=0;j3;j+)if(*ch_ptr != Fij)break;ch_ptr+;if(j=3)return F;ch_ptr = c_ptr;for(i=0;i2;i+)for(j=0;j= 0)/ 非終結(jié)符j = k;elsej = k-1;#ifdef _DEBUG_for(i=1; i= 0)j -= 1;else j -= 2;while(getState(stackj,Q) = 0);k = j+1;N = reduce( stack+k);if(N = $) error(stack); errorFlag = 1;break;elsestac

溫馨提示

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

評(píng)論

0/150

提交評(píng)論