編譯原理實(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è)
免費(fèi)預(yù)覽已結(jié)束,剩余13頁(yè)可下載查看

付費(fèi)下載

下載本文檔

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

文檔簡(jiǎn)介

1、精品文檔編譯方法實(shí)驗(yàn)報(bào)告實(shí)驗(yàn) 1:掃描器的設(shè)計(jì)一、 實(shí)驗(yàn)?zāi)康氖煜げ?shí)現(xiàn)一個(gè)掃描器(詞法分析程序)。1歡迎下載精品文檔二、 實(shí)驗(yàn)要求(1) 設(shè)計(jì)掃描器的有限自動(dòng)機(jī)(識(shí)別器) ;(2) 設(shè)計(jì)翻譯、生成 Token 的算法(翻譯器);(3) 編寫代碼并上機(jī)調(diào)試運(yùn)行通過(guò)。·輸入 源程序文件或源程序字符串;·輸出 相應(yīng)的 Token 序列;關(guān)鍵字表和界符表;符號(hào)表和常數(shù)表;三、 實(shí)驗(yàn)步驟流程:初始化;打開用戶源程序文件;while(文件未結(jié)束)讀入一行到 wi , i=0;do/處理一行,每次處理一個(gè)單詞濾空格,直到第一個(gè)非空的 wi ; i- ;s=1;/處理一個(gè)單詞開始while

2、(s!=0 )/拼單詞并生成相應(yīng)Tokenact(s);/執(zhí)行 qsif(s>=11 && s<=14)/一個(gè)單詞處理結(jié)束break;i+;/getchar()s=find(s, wi);if(s=0)詞法錯(cuò)誤;while( wi!=換行符);關(guān)閉用戶源程序文件;生成 Token 文件;輸出關(guān)鍵字表;輸出 Token 序列;輸出符號(hào)表;輸出常數(shù)表;有限自動(dòng)機(jī)的狀態(tài)轉(zhuǎn)換圖:e。2歡迎下載精品文檔ddd+|-1/+/-+ d . d e dd11-1/+/-l/d-1/+/-1l-12-1b b-13-114-1-15其中: d 為數(shù)字, l為字母, b 為界符, -1

3、 代表其它符號(hào)(如在狀態(tài)8 處遇到了非字母或數(shù)字的其它符號(hào),會(huì)變換到狀態(tài)12)。關(guān)鍵字表和界符表:Program;Begin:End(Var)While,Do:=Repeat+Until-For*To/If>Then>=Else=<<=四、 主要數(shù)據(jù)結(jié)構(gòu)狀態(tài)轉(zhuǎn)換矩陣: int aut107= 2, 0, 0, 0, 8, 9, 15,2, 3, 5,11, 0, 0, 11,4, 0, 0, 0, 0, 0, 0,4, 0, 5,11, 0, 0, 11,7, 0, 0, 6, 0, 0, 0,7, 0, 0, 0, 0, 0, 0,7, 0, 0,11, 0, 0,

4、11,。3歡迎下載精品文檔8, 0, 0, 0, 8, 0, 12,0, 0, 0, 0, 0, 10, 14,0, 0, 0, 0, 0, 0, 13;關(guān)鍵字表:char keywords3012=“program”,”begin ”,”end”,”var ”,”while ”,”do”,”repeat ”,”until”,”for ”,”to ”,”if ”,”then ”,”else ”,“;”, ”:”, ”(“, ”)”, ”,”, ”:= ”, ”+”, ”-“, ”*”, ”/”,”>”, ”>=”, ”=”, “<”, “<=”;符號(hào)表: char ID

5、5012;/表中存有源程序中的標(biāo)識(shí)符常數(shù)表: float C20;其它變量: struct token int code;int value;/Token結(jié)構(gòu)struct token tok100;/Token數(shù)組int s;/當(dāng)前狀態(tài)intn,p,m,e,t;/尾數(shù)值,指數(shù)值,小數(shù)位數(shù),指數(shù)符號(hào),類型float num;/常數(shù)值char w50;/源程序緩沖區(qū)int i;/源程序指針 , 當(dāng)前字符為 wichar strTOKEN12;/當(dāng)前已經(jīng)識(shí)別出的單詞五、 實(shí)驗(yàn)核心代碼int main(int argc, char* argv)FILE *fp;int s;/當(dāng)前狀態(tài)*有限自動(dòng)機(jī)中的狀

6、態(tài)fp=fopen("exa.txt","r");while (!feof(fp)fgets(w,50,fp);i=0;/* 處理一行doprintf("%c ",wi);/測(cè)試顯示每個(gè)token 的首字母。4歡迎下載精品文檔/* 處理一個(gè) tokenwhile (wi=' ')/濾空格i+;if(wi>='a'&& wi<='z')/判定單詞類別*是字母(關(guān)鍵字或標(biāo)識(shí)符)ptr=col2; num_map=2;elseif(wi>='0'

7、;&&wi<='9')/* 是數(shù)字(常量的開頭)ptr=col1; num_map=4;elseif(strchr(col30.str,wi)=NULL)/* 其他字符算為非法字符printf("非法字符 %cn",wi);i+;continue;else/ 界符ptr=col3; num_map=1;i-;/*向后退一個(gè)字符s=1;/開始處理一個(gè)單詞while (s!=0)act(s);if (s>=11 && s<=14)/*判斷是否是終止?fàn)顟B(tài)*是終止?fàn)顟B(tài),則形成一個(gè)tokenbreak;i+;/getc

8、har()* 讀取下一個(gè)字符s=find(s,wi);/狀態(tài)轉(zhuǎn)換if (s=0)strTOKENi_str='0'。5歡迎下載精品文檔printf("詞法錯(cuò)誤: %sn",strTOKEN);while (wi!=10);printf("關(guān)鍵字表: ");/輸出結(jié)果for (i=0;i<30;i+)printf("%s ",keywordsi);printf("n");printf("Token序列: ");for (i=0;i<num_token;i+)printf

9、("(%d,%d)",toki.code,toki.value);printf("n");printf("符號(hào)表: ");for (i=0;i<num_ID;i+)printf("%s ",IDi);printf("n");printf("常數(shù)表: ");for (i=0;i<num_C;i+)printf("%d ",Ci);printf("n");fclose(fp);printf("Hello World!n

10、");return 0;/* 狀態(tài)轉(zhuǎn)換后,達(dá)到新的狀態(tài)之后,記錄的變化void act(int s)int code;switch (s)case 1:n=0;m=0;p=0;t=0;e=1;num=0;i_str=0;strTOKENi_str='0'/其它變量初始化break;case 2:n=10*n+wi-48;break;case 3:t=1;break;case 4:n=10*n+wi-48; m+;。6歡迎下載精品文檔break;case 5:t=1;break;case 6:if (wi='-') e=-1;break;case 7:p

11、=10*p+wi-48;break;case8:strTOKENi_str+=wi; /將 ch 中的符號(hào)拼接到strTOKEN的尾部;break;case9:strTOKENi_str+=wi; /將 ch 中的符號(hào)拼接到strTOKEN的尾部;break;case 10:strTOKENi_str+=wi; /將 ch 中的符號(hào)拼接到strTOKEN的尾部;break;case 11:num=n*pow(10,e*p-m);/計(jì)算常數(shù)值toki_token.code=2;toki_token+.value=InsertConst(num); /生成常數(shù) Tokennum_token+;br

12、eak;case 12:strTOKENi_str='0'code=Reserve(strTOKEN);/查關(guān)鍵字表if (code)toki_token.code=code;toki_token+.value=0;/ 生成關(guān)鍵字 Tokenelse toki_token.code=1;toki_token+.value=InsertID(strTOKEN); /生成標(biāo)識(shí)符 Tokennum_token+;break;case 13:strTOKENi_str='0'code=Reserve(strTOKEN); / 查界符表 if (code)toki_tok

13、en.code=code;toki_token+.value=0;/ 生成界符 Token elsestrTOKENstrlen(strTOKEN)-1='0'/單界符i-;code=Reserve(strTOKEN);/查界符表toki_token.code=code;toki_token+.value=0;。7歡迎下載精品文檔/ 生成界符 Tokennum_token+; break;case 14:strTOKENi_str='0'code=Reserve(strTOKEN);/查界符表toki_token.code=code; toki_token+.v

14、alue=0; / 生成界符 Tokennum_token+;break;/* 狀態(tài)轉(zhuǎn)換int find(int s,char ch)int i,col=7;struct map *p;p=ptr;for (i=0;i<num_map;i+)if (strchr(p+i)->str,ch)col=(p+i)->col;break;return autscol;/* 向常量表中插入常量int InsertConst(double num)int i;for (i=0;i<num_C;i+)if (num=Ci)return i;Ci= (int)num;num_C+;re

15、turn i;int Reserve(char *str)int i;for (i=0;i<num_key;i+)。8歡迎下載精品文檔if (!strcmp(keywordsi,str)return (i+3);return 0;/* 向符號(hào)表中插入新的符號(hào)int InsertID(char *str)int i;for (i=0;i<num_ID;i+)if (!strcmp(IDi,str)/*符號(hào)已經(jīng)存在,則返回地址return i;strcpy(IDi,str);num_ID+;return i;六、 實(shí)驗(yàn)結(jié)果實(shí)驗(yàn)思考題:1. 掃描器的任務(wù)是什么?答:詞法分析程序又稱掃描器

16、,任務(wù)有:(1) 識(shí)別單詞 從用戶的源程序中把單詞分離出來(lái);(2) 翻譯單詞 把單詞轉(zhuǎn)換成機(jī)內(nèi)表示,便于后續(xù)處理。2. 掃描器、識(shí)別器、翻譯器三者之間的關(guān)系是怎樣的?答:掃描器、識(shí)別器、翻譯器三者之間的關(guān)系是:掃描器的實(shí)現(xiàn)要通過(guò)識(shí)別器和翻譯器1. 為什么說(shuō)有限自動(dòng)機(jī)是詞法分析的基礎(chǔ)?。9歡迎下載精品文檔答:因?yàn)樵~法分析的包括:識(shí)別-識(shí)別單詞的有限自動(dòng)機(jī)。和翻譯 - 根據(jù)有限自動(dòng)機(jī)所識(shí)別出的對(duì)象,完成從單詞串到單詞的TOKEN串的翻譯。我們可以看出,不論是識(shí)別還是分析,都是應(yīng)用有限自動(dòng)機(jī),所以可以說(shuō)有限自動(dòng)機(jī)是詞法分析的基礎(chǔ)。實(shí)驗(yàn) 2:中間代碼生成器的設(shè)計(jì)一、 實(shí)驗(yàn)?zāi)康氖煜に阈g(shù)表達(dá)式的語(yǔ)法分析與

17、中間代碼生成原理。二、 實(shí)驗(yàn)要求(1) 設(shè)計(jì)語(yǔ)法制導(dǎo)翻譯生成表達(dá)式的四元式的算法;(2) 編寫代碼并上機(jī)調(diào)試運(yùn)行通過(guò)。·輸入 算術(shù)表達(dá)式·輸出 語(yǔ)法分析結(jié)果相應(yīng)的四元式序列(3) 本實(shí)驗(yàn)已給出遞歸子程序法的四元式屬性翻譯文法的設(shè)計(jì), 鼓勵(lì)學(xué)生在此基礎(chǔ)上進(jìn)行創(chuàng)新,即設(shè)計(jì) LL(1) 分析法或 LR(0) 分析法的屬性翻譯文法,并根據(jù)這些屬性翻譯文法,使用擴(kuò)展的語(yǔ)法分析器實(shí)現(xiàn)語(yǔ)法制導(dǎo)翻譯。三、 設(shè)計(jì)概要(1) 算術(shù)表達(dá)式文法G(E) :EE 0 T | TTT F | F1Fi | (E)(2) 文法變換G(E)E0T TTF 1 FFi | (E)(3) 屬性翻譯文法:ET

18、0 “push(SYN, w) ”T “QUAT”TF 1 “push(SYN, w) ”F“QUAT”F i “push(SEM, entry(w) ”| (E)其中: ·push(SYN, w) 當(dāng)前單詞 w入算符棧 SYN;·push(SEM, entry(w) 當(dāng)前 w 在符號(hào)表中的入口值壓入語(yǔ)義棧SEM;·QUAT 生成四元式函數(shù)i T = newtemp;ii QTj =( SYNk, SEMs-1, SEMs, T); j+;。10歡迎下載精品文檔iii pop( SYN, _ ); pop( SEM, _ ); pop( SEM, _ ); pus

19、h( SEM, T );(4) 遞歸下降子程序:·數(shù)據(jù)結(jié)構(gòu): SYN 算符棧;SEM語(yǔ)義棧;E:入口T:入口TFn0?n1?yy出口push(SYN, w)出口push(SYN, w)read(w)QUATread(w)QUATTFF:入口主程序: ZE( ?ni ?n errread(w)read(w)push(SEM, entry(w)EEerrn# ?errn) ?yy輸出四元式序列read(w)結(jié)束出口四、 實(shí)驗(yàn)核心代碼void main()/主函數(shù)t = 1;cout<<"輸入表達(dá)式,以 #結(jié)束 :"<<endl;Z();stri

20、ng its(int a)/整形變成字符串形函數(shù)。11歡迎下載精品文檔string d;char b='0',c;int i;while(a!=0)i = a%10;a = a/10;c = (int)b + i;d = c + d;return d;char F(char w)/F自動(dòng)機(jī)string theWord;if(w>='a'&&w<='z'|w>='A'&&w<='Z')theWord = w;/當(dāng)前字符是字母markStack.push(theW

21、ord);/ 則壓棧else if(w = '(')/ 是左括號(hào)cin>>w;/則讀取下一字符w = E(w);if(w!=')')/不是右括號(hào)則輸入有誤,報(bào)錯(cuò)cerr<<" 輸入錯(cuò)誤 !"<<endl;exit(0);else/否則有誤,報(bào)錯(cuò)cerr<<" 輸入錯(cuò)誤 !"<<endl;exit(0);cin>>w;/讀取下一字符return w;char E(char w)/E自動(dòng)機(jī)string operate,a,b,c;string state5

22、;w = T(w);while(w='+'|w='-')/是加或減符號(hào)operate = w;cin>>w;/讀入下一字符w = T(w);b = markStack.pop();/字符棧彈出a = markStack.pop();/兩個(gè)操作字符。12歡迎下載精品文檔cout<<"(""<<operate<<"","<<a<<","<<b<<",t"<<t&

23、lt;<")"<<endl;c = "t"+its(t);/輸出四元式markStack.push(c);/新狀態(tài)壓棧t+;/狀態(tài)計(jì)數(shù)加一return w;char T(char w)string operate,a,b,c;string state5;w = F(w);while(w='*'|w='/')operate = w;cin>>w;/讀取下一字符w = F(w);b = markStack.pop();/符號(hào)棧彈出a = markStack.pop();/兩個(gè)操作字符cout<

24、;<"(""<<operate<<"","<<a<<","<<b<<",t"<<t<<")"<<endl; c = "t"+its(t);markStack.push(c);t+;return w;bool Z()/Z自動(dòng)機(jī)char w;cin>>w;w = E(w);if(w='#')/遇到 "#" 則結(jié)束return true;elsereturn false;五、 實(shí)驗(yàn)結(jié)果。13歡迎下載精品文檔實(shí)驗(yàn)思考題:1. 語(yǔ)法分析分為幾類?其關(guān)鍵技術(shù)各是什么?答: 自頂向下法(推導(dǎo)法)從開始符號(hào)出發(fā),采用推導(dǎo)運(yùn)算,試圖自頂向下構(gòu)造語(yǔ)法樹。自底向上法(歸約法)從給定的符號(hào)串出發(fā),采用歸約運(yùn)算,試圖自底向上構(gòu)造語(yǔ)法樹。2. 什么是遞歸下降子

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論