




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、二、課程設(shè)計正文1 編寫一個l-語言的詞法分析器,從左到右逐個字符地對l-語言的源程序進(jìn)行掃描,產(chǎn)生一個個單詞符號的機(jī)內(nèi)表示。程序結(jié)構(gòu)如圖l-1所示: scanner isalpha isnumberischarisother outputerror 圖 l-111 sanner()1 功能:完成初始化,并循環(huán)調(diào)用子模塊,完成單詞的識別。2 算法描述如下void scanner() 調(diào)用scannerinit()進(jìn)行初始化; 讀入源程序的第一個字符; while (字符!=eof) if (字符= =字母)isalpha();else if ( 字符= = 數(shù)字) isnumber(); el
2、se if (字符= =)ischar(); else isother();打印結(jié)束信息;結(jié)束操作;12 isalpha() 1功能:識別保留字和標(biāo)識符。 2算法描述如下: void isalpha() while(字符為字母或數(shù)字或_) 記錄當(dāng)前字符; 讀取下一字符;判斷當(dāng)前字符串是否為保留字,并設(shè)置標(biāo)志位h;調(diào)用output()函數(shù)輸出保留字或標(biāo)識符; 13 isnumber() 1功能:識別整數(shù)和實數(shù)。 2算法描述如下: void isnumber() int flag=0; while (字符為數(shù)字) 記錄當(dāng)前字符; 讀取下一字符; if(字符為.號) 記錄當(dāng)前字符; flag=1;
3、讀下一字符; 跳出循環(huán);記單詞編碼為整數(shù)的編碼(當(dāng)前token為整數(shù));if(flag=1) if (當(dāng)前字符為數(shù)字) 記錄當(dāng)前數(shù)字; while(當(dāng)前字符為數(shù)字) 記錄字符; 讀取下一字符;記單詞編碼為實數(shù)的編碼(當(dāng)前token為實數(shù));else error(2);if (當(dāng)前字符為.)刪除余下數(shù)字;if (當(dāng)前字符為字母) 舍去后面的部分;output();14 ischar() 1功能:識別字符串。 2算法描述: void ischar() for (;) 讀取下一字符; 現(xiàn)行token為字符串; if(當(dāng)前字符不是.號) 記錄字符; else break;output();讀下一字符;
4、15 isother() 1功能:識別其他單詞。 2算法描述如下: void isother() switch(當(dāng)前字符) 對于不同字符做出不同處理,主要有: 1、符號內(nèi)容的記??; 2、查出機(jī)內(nèi)碼; 3、調(diào)用output()輸出至token()文件; 4、讀取下一字符; 5、對于錯誤符號將其刪除,并報錯;16 scannerinit() 1功能:進(jìn)行初始化,主要包括: 1、建立單詞編碼表、token表、符號表,并將它們清空。 2、打開單詞編碼文件,并將單詞編碼讀到編碼表中。17 output() 1功能:輸出識別出的單詞,包括: 2若單詞為標(biāo)識符或常數(shù)再查,填符號表。18 error() 1.
5、功能:判斷錯誤原因。2在由詞法分析程序?qū)語言源程序分析產(chǎn)生的token,符號表文件的基礎(chǔ)上,從完成語法語義分析,并產(chǎn)生相應(yīng)的中間代碼-四元式序列。21 paser() 1功能:主模塊,完成初始化,并調(diào)用復(fù)合語句分析模塊和說明語句分析模塊,完成分析任務(wù)。 2算法描述如下: void paser() 初始化; 從token文件讀取第一個單詞; if (單詞= =program) 讀取下一單詞; if (單詞= =標(biāo)識符) 讀取下一單詞; if(單詞為;) 行數(shù)加一; 讀取下一單詞; if (單詞為var) declear( ); if (單詞為begin) s_begin(); if (code
6、 不是等于號) error(49);else 出錯處理;else 出錯處理;else出錯處理;else 出錯處理;22 s_begin() 1功能:完成復(fù)合語句的分析。 2算法描述 s_begin() if (當(dāng)前字符為begin) 讀取下一字符; 調(diào)用l_analize(); if(當(dāng)前字符為end) 結(jié)束; else 非正常結(jié)束,返回0;讀取下一字符;返回; 23 l_analize() 1功能:完成語句序列分析。 2算法描述 l_analize() int rtn; switch(當(dāng)前字符) case if:調(diào)用s_if()函數(shù);break; case begin :調(diào)用s_begin(
7、)函數(shù);braek; case 標(biāo)識符:調(diào)用 s_let()函數(shù);break; case while:調(diào)用 s_while();break;if (當(dāng)前字符為:) 行數(shù)加一; 讀取下一字符; 遞歸調(diào)用l_analize()else return rtn;24 s_let() 1功能:完成賦值語句的分析。 2算法分析 s_let(int a) if (當(dāng)前字符為標(biāo)識符) if (需要記錄變量的地址) 記錄賦值變量的地址;讀取下一個單詞; if(當(dāng)前單詞為賦值號) 調(diào)用表達(dá)式分析函數(shù)l_analize(); if(表達(dá)式正確) 生成賦值句四元式;else 賦值句出錯;return四元式序號;25
8、s_if() 1功能:完成條件語句的分析。 2算法描述: int s_if() int a; int rtn=0; 定義一個真出口true_address和一個假出口flase_address; if(當(dāng)前單詞為if) 布爾表達(dá)式初始化; 調(diào)用布爾表達(dá)式分析函數(shù)b_analize(); rtn=布爾表達(dá)式的四元式首址; 產(chǎn)生無條件跳轉(zhuǎn)四元式; if (當(dāng)前單詞為then) 讀取下一單詞; switch(當(dāng)前單詞) case if:調(diào)用s_if()函數(shù);break; case begin :調(diào)用s_begin()函數(shù);braek; case 標(biāo)識符:調(diào)用 s_let()函數(shù);break; cas
9、e while:調(diào)用 s_while();break; backpatch(); if(當(dāng)前單詞為else) 讀取下一單詞; switch(當(dāng)前單詞) case if:調(diào)用s_if()函數(shù);break; case begin :調(diào)用s_begin()函數(shù);braek; case 標(biāo)識符:調(diào)用 s_let()函數(shù);break; case while:調(diào)用 s_while();break; backpatch(); else rtn;else 報錯;(缺少then)rtn;26 s_while() 1功能:完成while循環(huán)語句的分析。 2算法描述; int s_while() int rtn=0
10、;boor_value,true_address,false_address; if (當(dāng)前單詞為while) rtn=布爾表達(dá)式分析函數(shù)b_analize(); boor_value=布爾表達(dá)式值地址; 產(chǎn)生跳轉(zhuǎn)四元式; if(當(dāng)前單詞為do) 讀取下一單詞; switch(當(dāng)前單詞) case if:調(diào)用s_if()函數(shù);break; case begin :調(diào)用s_begin()函數(shù);braek; case 標(biāo)識符:調(diào)用 s_let()函數(shù);break; case while:調(diào)用 s_while();break; backpatch();backpatch();else 出錯,缺少do
11、;return rtn;27 gen() 該函數(shù)形成一個四元式,并將其輸出至四元式文件。28 e_analize() 1該函數(shù)是算術(shù)分析表達(dá)式的主模塊,它調(diào)用算術(shù)表達(dá)式的子模塊,采用遞歸下降分析法完成算術(shù)表達(dá)式的分析。 2算術(shù)表達(dá)式的各個子模塊: ae_init()將算術(shù)表達(dá)式讀入分析棧; bint e_addsub()完成e-te1|t的分析; cint e1_addsub(int a) 完成e1-+te1|-te1| dt_muldiv() 完成t-ft1|f的分析; et1_muldiv(int a) 完成t1-*ft1|/ft1|; ff_number() 完成f-i|(e)的分析;2
12、9 b_analize() 1布爾表達(dá)式分析的主模塊,調(diào)用其他布爾表達(dá)式的子模塊,采用遞歸下降分析法完成布爾表達(dá)式的分析。并返回該布爾表達(dá)式的首個四元式地址。 ab_or()完成b-lb|l的分析; bb1_or(int a) 完成b1-orlb1|的分析; cl_and() 完成l-ml1|m的分析; dl1_and()完成l1-andm1|的分析; em_not()完成m-notm|k的分析; fk_end()完成k-i|false|true|(b)的分析; gk_cmp()完成k-isi,s-|=|=|的分析。三、課程設(shè)計總結(jié) 1、 實驗中遇到的問題 詞法分析器程序中要讀入一個單詞編碼文
13、件,但是文件的格式在編寫的時候和程序有點(diǎn)差異,因而導(dǎo)致輸出結(jié)果再三的錯誤。語法/語義分析器中,在修改符號表時,出現(xiàn)錯誤,最終沒有的到正確結(jié)果。2、 對實驗原理有更深的理解 通過該課程設(shè)計,掌握了什么是編譯程序,編譯程序工作的基本過程及其各階段的基本任務(wù),熟悉了編譯程序總流程框圖,了解了編譯程序的生成過程,構(gòu)造工具及其相關(guān)的技術(shù)對課本上的知識有了更深的理解,課本上的知識師機(jī)械的,表面的.通過把該算法的內(nèi)容,算法的執(zhí)行順序在計算機(jī)上實現(xiàn),把原來以為很深奧的書本知識變的更為簡單,對實驗原理有更深的理解。3、 對該理論在實踐中的應(yīng)用有深刻的理解 通過把該算法的內(nèi)容,算法的執(zhí)行順序在計算機(jī)上實現(xiàn),知道和
14、理解了該理論在計算機(jī)中是怎樣執(zhí)行的,對該理論在實踐中的應(yīng)用有深刻的理解。四、參考文獻(xiàn)1 賀訊. 編譯方法學(xué)習(xí)指導(dǎo)與實踐.北京:機(jī)械工業(yè)出版社, 第一版. 2004年8月。 五、附錄1單詞編碼文件ni.txt and1or11begin2program12bool3real13+23=33do4then14-2434else5true15*2535end6var16/2636false7while17.27=37if8標(biāo)識符18,28integer9整數(shù)19:29not10實數(shù)20;30(21:=31)22=32char 382測試代碼文件11.txt program abc; var a:re
15、al; begin if a22.2 then x:=c+d; end3詞法分析完整源代碼 #include#include#include#define length 61#define n 100/*/typedef struct tokenint label;char name30;int code;int addr;token;typedef struct keywordchar name30;int code;keyword;typedef struct symbleint number;int type;char name30;symble;/*/char ch;int var_c
16、ount;int error_count;int label_count;int code_count;int addr_count;int lineofpro;char filename30;file*keyfin;file*sourcefin;file*tokenfout;file*symblefout;keyword keylength;token currenttoken;symble currentsimble;symble symblelistn;/*/void scanner();void scannerinit();void isalpha();void isnumber();
17、void isanotation();void ischar();void isother();void output();void error(int a);int wordhave();int strcmp(char*s,char*t)for(;*s=*t;s+,t+)if(*s=0)return 0;return 1;/*/int main()int i=0,j=0;code_count=0;lineofpro=0;var_count=0;addr_count=1;label_count=1;for(i=0;in;i+)symblelisti.number=0;symblelisti.t
18、ype=0;for(j=0;j30;j+)symblelj=0;scanner();system(pause);return 0;/*主程序*/void scanner()int i=0;error_count=0;scannerinit();printf( * );printf( *l語言詞法分析器);printf( * ); printf(輸入原文件名:);for(;)scanf(%c,&filenamei);if(filenamei=10)break;i+;filenamei=0;if(sourcefin=fopen(filename,rt)=null)printf(無
19、法打開文件 %s.n,filename);exit(1);if(tokenfout=fopen(token.txt,wt+)=null)printf(無法打開文件 symble.txtn);exit(1);if(symblefout=fopen(symble.txt,wt+)=null)printf(無法打開文件 symble.txtn);exit(1);ch=fgetc(sourcefin);while(ch!=eof)for(i=0;i47)&(ch64)&(ch96)&(ch123)|(ch=_)isalpha(); elseif(ch=)ischar(); else isother()
20、;fclose(sourcefin);fclose(tokenfout);fclose(symblefout);printf(分析完畢/n);/*初始化*/void scannerinit()int i=1;int k=0;if(keyfin=fopen(ni.txt,rt)=null)printf(cannot open ni.txtn);exit(1);for(i=0;i60;i+)for(k=0;k30;k+)k=0;for(i=0;i47)&(ch47)&(ch47)&(ch47)&(ch64)&(ch96)&(ch64)&(ch96)&(ch47)&(ch64)&(
21、ch96)&(ch123)|(ch=_)currentti+=ch; ch=fgetc(sourcefin);for(i=1;ilength;i+)h=strcmp(currentt,);if(!h)break;if(!h)currenttoken.code=keyi.code;currenttoken.addr=-1;else currenttoken.code=18;currenttoken.addr=addr_count+;currenttoken.label=label_count+;output();/*字符串處理*/void i
22、schar()int i=0;for(;)ch=fgetc(sourcefin);currenttoken.code=20;if(ch!=) currentti+=ch;else break;currenttoken.addr=addr_count+;currenttoken.label=label_count+;output();ch=fgetc(sourcefin);/*其他情況*/void isother()char ch1;int i;for(i=0;i30;i+)currentti=0;switch(ch)case(:currenttoken.na
23、me0=(;currenttoken.code=21;currenttoken.addr=-1;currenttoken.label=label_count+;output();ch=fgetc(sourcefin);break;case):currentt0=);currenttoken.code=22;currenttoken.addr=-1;currenttoken.label=label_count+;output();ch=fgetc(sourcefin);break;case*:currentt0=*;currenttoken.code=25;c
24、urrenttoken.addr=-1;currenttoken.label=label_count+;output();ch=fgetc(sourcefin);break; case+:currentt0=+;currenttoken.code=23;currenttoken.addr=-1;currenttoken.label=label_count+;output();ch=fgetc(sourcefin);break;case,:currentt0=1;currenttoken.code=28;currenttoken.addr=-1;current
25、token.label=label_count+;output();ch=fgetc(sourcefin);break;case-:currentt0=-;currenttoken.code=24;currenttoken.addr=-1;currenttoken.label=label_count+;output();ch=fgetc(sourcefin);break;case.:currentt0=.;currenttoken.code=27;currenttoken.addr=-1;currenttoken.label=label_count+;out
26、put();ch=fgetc(sourcefin);break;case:ch1=ch;ch=fgetc(sourcefin);if(ch!=)currentt0=:; currenttoken.code=29; currenttoken.addr=-1; currenttoken.label=label_count+; output();elsecurrentt0=:;currentt1=; currenttoken.code=31; currenttoken.addr=-1; currenttoken.label=label_count
27、+; output(); ch=fgetc(sourcefin); break;case;:currentt0=;currenttoken.code=30;currenttoken.addr=-1;currenttoken.label=label_count+;output();ch=fgetc(sourcefin);break;case:ch1=fgetc(sourcefin);if(ch1=) currentt0=)currentt0=; currenttoken.code=35; currenttoken.addr=-1; curre
28、nttoken.label=label_count+; output(); ch1=fgetc(sourcefin); elsecurrentt0=:ch1=fgetc(sourcefin);if(ch1=) currentt0=; currentt1=;currenttoken.code=37; currenttoken.addr=-1; currenttoken.label=label_count+; output(); ch1=fgetc(sourcefin);elsecurrentt0=; currenttoken
29、.code=36; currenttoken.addr=-1; currenttoken.label=label_count+; output();ch=ch1;break;case 10: lineofpro+; ch=fgetc(sourcefin); break;case 13: lineofpro+; ch=fgetc(sourcefin); break;case : ch=fgetc(sourcefin); break;case eof: error(1);ch=fgetc(sourcefin);break;/*輸出模塊*/void output()int flag,i=0;int
30、k;/*查填符號模塊*/if(currenttoken.code=18)|(currenttoken.code=19)|(currenttoken.code=20)currentsimble.number=currenttoken.addr;currentsimble.type=currenttoken.code;strcpy(currents,currentt);flag=wordhave();if(currenttoken.code=18)&(flag=1)|(currenttoken.code=20)|(currenttoken.code=19)fp
31、rintf(symblefout,%3d %3d %sn,currentsimble.number,currentsimble.type,currents);/*輸出到token表*/for(;)if(currentti+=0)break;fprintf(tokenfout,%3d %s,currenttoken.label,currentt);printf(%3d %s,currenttoken.label,currentt);for(k=20-i;k0;k-)fprintf(tokenfout, );printf(
32、);fprintf(tokenfout,%3d %3dn,currenttoken.code,currenttoken.addr);printf(%3d %3dn,currenttoken.code,currenttoken.addr);void error(int a)error_count+;switch(a)case 1: printf(error %2d 非法字符于 %3d 行.n, error_count,lineofpro+1);break;case 2: printf(error %2d 實常數(shù)出過于 %3d 行.n, error_count,lineofpro+1);break
33、;case 3: printf(error %2d 沒有匹配的注釋符 */ n,error_count);break;case 4: printf(error %2d 非正常結(jié)束!n,error_count);break; default: break;return;int wordhave()int flag,i=0;for(i=0;ivar_count;i+)flag=strcmp(currents,symblel);if(flag=0)currenttoken.addr=symblelisti.number;return 0;symblelistva
34、r_count.number=currenttoken.addr;symblelistvar_count.type=currenttoken.code;strcpy(symblelistvar_,currentt);var_count+;return 1;4詞法分析的結(jié)果 5詞法分析產(chǎn)生的token文件 6詞法分析產(chǎn)生的符號表文件 7語法/語義分析器的完整代碼 #include#include#includetypedef struct stackchar name20;int cod;int addr;stack;typedef struct equin
35、t op;int op1;int op2;int result;equ;typedef struct varchar name20;int addr;int type;int value;var;#define exp_len 100#define equ_len 1024#define one 50001#define zero 50000#define e_expr 7#define if 8#define while 9#define for 10#define b_exp 12file *tokenfin;file *symblefin;file *equfout;int code ;
36、int address;int lineofpro;int lineofequ;stack var_listexp_len;stack exprexp_len;equ equequ_len;var templistequ_len;char id20;int var_count;int len_count;int pos;int now_addr;int temp_count;int error_count;int let_count;int e_contrl;int e_rtn;int true_address;int false_address;int gen_pos;int equpush
37、(int op,int a,int b,int r);void getnext();void error(int num);int num(char cc);int gen(int op,int a,int b,int r);void declear();void initstack();void push(int cod,int addr);int newtemp();void backpatch(int addr,int addr2);/布爾表達(dá)式分析函數(shù)int b_analize();void b_init();int b_or();int b1_or(int a);int l_and();int l1_and(int a);int m_not();int k_end();int k_cmp();/算術(shù)表達(dá)式分析函數(shù)int e_analize();void e_init();int e_addsub();int e1_addsub(int
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年個人短期貸款抵押合同樣本
- 2025年醫(yī)用設(shè)備維護(hù)管理合同
- 2025年軟件產(chǎn)品銷售合同協(xié)議書綜合
- Unit 5 TV Shows Lesson 3(教學(xué)設(shè)計)-2024-2025學(xué)年人教新起點(diǎn)版英語五年級上冊
- 2025年乘用車出口銷售合同
- 7我們有新玩法 (教學(xué)設(shè)計)統(tǒng)編版道德與法治二年級下冊
- 2025年上海房地產(chǎn)經(jīng)紀(jì)服務(wù)合同
- 8 紅樓春趣 教學(xué)設(shè)計-2023-2024學(xué)年統(tǒng)編版語文五年級下冊
- 2025年企業(yè)策劃產(chǎn)品代理銷售合同樣本
- 2025年農(nóng)業(yè)噴灌系統(tǒng)購銷合同范文
- 中國卒中學(xué)會急性缺血性卒中再灌注治療指南+2024解讀
- 2018熱控QC小組成果報告書
- 立體構(gòu)成-線立體課件
- 初中體育與健康人教7~9年級第7章 球類正面雙手墊球教學(xué)設(shè)計及教案
- 展示空間設(shè)計(案例)
- 風(fēng)力發(fā)電項目報價清單 (風(fēng)機(jī)基礎(chǔ)等)
- 《葉甫蓋尼·奧涅金》41張幻燈片
- 滬教牛津版三年級英語下冊全冊課件
- MicrosoftOffice2016簡體中文版下載及使用
- 招待所所長崗位職責(zé)內(nèi)容范本
- 北師大版七年級生物下冊 第8章 章末復(fù)習(xí) 課件(共18張PPT)
評論
0/150
提交評論