




已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
編譯方法實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)1:掃描器的設(shè)計(jì)一、 實(shí)驗(yàn)?zāi)康氖煜げ?shí)現(xiàn)一個(gè)掃描器(詞法分析程序)。二、 實(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)步驟流程:初始化;打開(kāi)用戶源程序文件; while (文件未結(jié)束) 讀入一行到wi,i=0;do /處理一行,每次處理一個(gè)單詞 濾空格,直到第一個(gè)非空的wi;i-;s=1; /處理一個(gè)單詞開(kāi)始while (s!=0) /拼單詞并生成相應(yīng)Token act(s); /執(zhí)行qs if (s=11 & s Then = Else = ”, ”=”, ”=”, “”, “=a & wi=0 & wi=11 & s=14) /*判斷是否是終止?fàn)顟B(tài) *是終止?fàn)顟B(tài),則形成一個(gè)tokenbreak;i+; /getchar() *讀取下一個(gè)字符 s=find(s,wi); /狀態(tài)轉(zhuǎn)換if (s=0)strTOKENi_str=0;printf(詞法錯(cuò)誤:%sn,strTOKEN);while (wi!=10); printf(關(guān)鍵字表:); /輸出結(jié)果for (i=0;i30;i+)printf(%s ,keywordsi);printf(n); printf(Token序列:);for (i=0;inum_token;i+)printf(%d,%d),toki.code,toki.value);printf(n);printf(符號(hào)表:);for (i=0;inum_ID;i+)printf(%s ,IDi);printf(n);printf(常數(shù)表:);for (i=0;inum_C;i+)printf(%d ,Ci);printf(n);fclose(fp);printf(Hello World!n);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+; break; case 5:t=1; break; case 6:if (wi=-) e=-1; break; case 7:p=10*p+wi-48; break; case 8:strTOKENi_str+=wi; /將ch中的符號(hào)拼接到strTOKEN的尾部; break; case 9: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ù)Token num_token+;break;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í)符Token num_token+;break; case 13:strTOKENi_str=0; code=Reserve(strTOKEN); /查界符表 if (code) toki_token.code=code; toki_token+.value=0; /生成界符Token else strTOKENstrlen(strTOKEN)-1=0; /單界符 i-; code=Reserve(strTOKEN); /查界符表 toki_token.code=code; toki_token+.value=0; /生成界符Tokennum_token+;break; case 14:strTOKENi_str=0; code=Reserve(strTOKEN); /查界符表 toki_token.code=code; toki_token+.value=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;istr,ch)col=(p+i)-col;break;return autscol;/*向常量表中插入常量int InsertConst(double num)int i;for (i=0;inum_C;i+)if (num=Ci)return i;Ci= (int)num;num_C+;return i;int Reserve(char *str)int i;for (i=0;inum_key;i+)if (!strcmp(keywordsi,str)return (i+3);return 0;/*向符號(hào)表中插入新的符號(hào)int InsertID(char *str)int i; for (i=0;inum_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ù)是什么?答:詞法分析程序又稱掃描器,任務(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ǔ)?答:因?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ǔ)法分析與中間代碼生成原理。二、 實(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): E E 0 T | T T T 1 F | FF i | (E)(2) 文法變換G(E) E T 0 T T F 1 FF i | (E)(3) 屬性翻譯文法: E T 0 “push(SYN, w)” T “QUAT” T F 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ù) iT = newtemp; iiQTj =( SYNk, SEMs-1, SEMs, T); j+; iiipop( SYN, _ ); pop( SEM, _ ); pop( SEM, _ ); push( SEM, T );(4) 遞歸下降子程序: 數(shù)據(jù)結(jié)構(gòu):SYN 算符棧;SEM 語(yǔ)義棧; E: 入口 T: 入口 T F n 0? n 1? y y 出口 push(SYN, w) 出口 push(SYN, w) read(w) QUAT read(w) QUAT T F F: 入口 主程序:Z E ( ? n i ? n err read(w) read(w) push(SEM, entry(w) E E err n # ?err n ) ? y y 輸出四元式序列 read(w)結(jié)束開(kāi)始出口四、 實(shí)驗(yàn)核心代碼void main() /主函數(shù) t = 1; cout輸入表達(dá)式,以#結(jié)束:=a&w=A&ww; /則讀取下一字符w = E(w); if(w!=) /不是右括號(hào)則輸入有誤,報(bào)錯(cuò)cerr輸入錯(cuò)誤!endl;exit(0);else /否則有誤,報(bào)錯(cuò)cerr輸入錯(cuò)誤!w; /讀取下一字符return w;char E(char w) /E自動(dòng)機(jī)string operate,a,b,c;string state5;w = T(w); while(w=+|w=-) /是加或減符號(hào)operate = w;cinw; /讀入下一字符w = T(w); b = markStack.pop(); /字符棧彈出a = markStack.pop(); /兩個(gè)操作字符cout(operate,a,b,tt)w; /讀取下一字符w = F(w); b = markStack.pop(); /符號(hào)棧彈出a = markStack.pop(); /兩個(gè)操作字符 cout(operate,a,b,tt)w;w = E(w); if(w=#) /遇到#則結(jié)束return true;elsereturn false;五、 實(shí)驗(yàn)結(jié)果實(shí)驗(yàn)思考題:1. 語(yǔ)法分析分為幾類?其關(guān)鍵技術(shù)各是什么?答: 自頂向下法(推導(dǎo)法)從開(kāi)始符號(hào)出發(fā),采用推導(dǎo)運(yùn)算,試圖自頂向下構(gòu)造語(yǔ)法樹(shù)。 自底向上法(歸約法) 從給定的符號(hào)串出發(fā),采用歸約運(yùn)算,試圖自底向上構(gòu)造語(yǔ)法樹(shù)。2. 什么是遞歸下降子程序法,什么是LL(1)分析法?二者對(duì)文法各有什么要求?答: 遞歸下降子程序法:遞歸子程序法屬于自頂向下語(yǔ)法分析方法。故又名遞歸下降法。要求文法是LL(1)文法。 LL(1)分析法:LL(1)分析法是指從左到右掃描(第一個(gè) L) 、最左推導(dǎo)(第二個(gè) L)和只查看一個(gè)當(dāng)前符號(hào)(括號(hào)中的 1)之意;LL(1)分析法又稱預(yù)測(cè)分析法,屬于自頂向下確定性語(yǔ)法分析方法。要求文法是LL(1)文法。3. 比較LL(1)分析法和遞歸下降子程序法的異同。答: 相同點(diǎn):都要求文法是LL(1)文法;都是自頂向下的分析方法;都通過(guò)分析下個(gè)字符來(lái)判斷該進(jìn)入哪個(gè)狀態(tài)或者調(diào)用哪個(gè)函數(shù)。 不同點(diǎn):LL(1)分析法先建立起預(yù)測(cè)分析表,通過(guò)對(duì)分析棧的不斷操作(出棧,入棧)來(lái)進(jìn)行;遞歸下降子程序法是通過(guò)函數(shù)間的函數(shù)調(diào)用來(lái)實(shí)現(xiàn)不同狀態(tài)間的轉(zhuǎn)換,并簡(jiǎn)化了代碼。4. 什么是語(yǔ)法制導(dǎo)翻譯技術(shù)?其核心技術(shù)是什么?答:語(yǔ)法制導(dǎo)翻譯是在語(yǔ)法分析過(guò)程中,隨著分析(推導(dǎo)或歸約)的逐步進(jìn)展,每識(shí)別出一個(gè)語(yǔ)法結(jié)構(gòu),根據(jù)文法的每個(gè)規(guī)則所對(duì)應(yīng)的語(yǔ)義子程序進(jìn)行翻譯的方法;核心技術(shù)是構(gòu)造屬性翻譯文法。5. 表達(dá)式的四元式屬性翻譯文法如
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 機(jī)場(chǎng)商業(yè)投訴管理辦法
- 煤礦突發(fā)事故應(yīng)急預(yù)案
- 特種設(shè)備安全法相關(guān)法規(guī)
- 班組安全培訓(xùn)
- 新產(chǎn)品開(kāi)發(fā)流程的標(biāo)準(zhǔn)化與優(yōu)化
- 知識(shí)競(jìng)賽具體方案
- 安全生產(chǎn)穩(wěn)定
- 開(kāi)展安全生產(chǎn)排查活動(dòng)簡(jiǎn)報(bào)
- 建筑施工企業(yè)安全生產(chǎn)領(lǐng)導(dǎo)小組的主要職責(zé)
- 安全管理系統(tǒng)開(kāi)發(fā)
- 肌肉刑警的改造計(jì)劃
- 電力現(xiàn)貨交易流程
- 音樂(lè)劇排練課程設(shè)計(jì)
- 保險(xiǎn)公司理賠服務(wù)手冊(cè)
- 醫(yī)院病案質(zhì)控管理學(xué)習(xí)匯報(bào)
- GB/T 28569-2024電動(dòng)汽車交流充電樁電能計(jì)量
- 靜脈炎的預(yù)防和處理
- 醫(yī)療機(jī)構(gòu)麻醉藥品、第一類精神藥品管理
- 海上風(fēng)電場(chǎng)海上安全保障
- 儲(chǔ)能系統(tǒng)培訓(xùn)課程
- 體重管理咨詢表
評(píng)論
0/150
提交評(píng)論