




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、目錄一、實(shí)驗(yàn)題目3二、實(shí)驗(yàn)?zāi)康?三、實(shí)驗(yàn)要求4四、實(shí)驗(yàn)步驟4基本設(shè)計(jì)思路4流程框圖5算法設(shè)計(jì)6函數(shù)相關(guān)說明6輸入與輸出8程序運(yùn)行結(jié)果9五、實(shí)驗(yàn)方案設(shè)計(jì)實(shí)現(xiàn)9六、實(shí)驗(yàn)程序亮點(diǎn)描述10七、實(shí)驗(yàn)程序使用說明10八、實(shí)驗(yàn)心得體會(huì)10九、源程序清單10一、 實(shí)驗(yàn)題目設(shè)計(jì)、編制、調(diào)試一個(gè)識(shí)別一簡(jiǎn)單語言單詞的詞法分析程序。程序能夠識(shí)別基本字、標(biāo)識(shí)符、無符號(hào)整數(shù)、浮點(diǎn)數(shù)、運(yùn)算符和界符)。單詞符號(hào)及種別表如下:?jiǎn)卧~符號(hào)種別編碼begin1if2then3while4do5end6l(l|d)*10dd*11+13-14*15/16:17:=18<20<>21<=22>23>=
2、24=25;26(27)28#0二、 實(shí)驗(yàn)?zāi)康脑O(shè)計(jì)、編制并調(diào)試一個(gè)詞法分析程序,加深對(duì)詞法分析原理的理解。三、 實(shí)驗(yàn)要求詞法分析程序需具備詞法分析的功能:輸入:所給文法的源程序字符串。(字符串以“#”號(hào)結(jié)束)輸出:二元組(syn,token或sum)構(gòu)成的序列。其中:syn為單詞種別碼; token為存放的單詞自身字符串; sum為整型常數(shù)。例如:對(duì)源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,經(jīng)過詞法分析后輸出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)四、 實(shí)驗(yàn)步驟基本設(shè)計(jì)思路Ø
3、; 基本字作為一類特殊的標(biāo)識(shí)符來處理:識(shí)別出標(biāo)識(shí)符,差基本字表,給出相應(yīng)種別碼。基本字表置初值:char *rwtab6="begin","if","then","while","do","end"(字符指針的數(shù)組)Ø 識(shí)別無符號(hào)整數(shù)是將數(shù)字串轉(zhuǎn)換為無符號(hào)整數(shù)。我們?cè)趃etchar()的時(shí)候是把數(shù)字當(dāng)做字符從外部輸出讀取的。將數(shù)字串345#轉(zhuǎn)換為整數(shù):(3*10+4)*10+5=345送到sum中Ø 程序主要由2個(gè)函數(shù)組成,主函數(shù)main()和掃描子函數(shù)s
4、canner()。掃描程序每次讀取1個(gè)獨(dú)立意義的單詞符號(hào),并判斷單詞類型。主程序做相應(yīng)處理后做控制臺(tái)輸出。流程框圖圖 1主程序圖 2掃描子程序算法設(shè)計(jì)詞法分析程序所用的較為重要的全局變量和需調(diào)用的函數(shù)如下:1) ch字符變量,存放當(dāng)前讀進(jìn)的源程序字符。2) token8字符數(shù)組,存放構(gòu)成單詞符號(hào)的字符串。3) prog80字符數(shù)組,存放所有用戶輸入的字符。4) syn整數(shù),存放當(dāng)前單詞的種別碼。5) sum雙精度浮點(diǎn)型變量,存放無符號(hào)整數(shù),或者浮點(diǎn)數(shù)。6) isDecimal整數(shù),是否為浮點(diǎn)數(shù)。isDecimal為1,則為浮點(diǎn)數(shù)。7) decimal雙精度浮點(diǎn)型變量(double),浮點(diǎn)數(shù)的小
5、數(shù)部分。8) isExp整數(shù),是否為指數(shù)形式表示的浮點(diǎn)數(shù)(即是否存在符號(hào)E或者e)。isExp為1,則為指數(shù)形式。9) index整數(shù),指數(shù)形式的冪。10) isNegative整數(shù),是否為負(fù)數(shù)冪。isNegative為1,則為負(fù)數(shù)冪,如123E-2。11) scanner()掃描子程序。12) getchar()從控制臺(tái)讀取一個(gè)字符數(shù)據(jù)。13) double pow(double x,double y),計(jì)算x的y次冪。14) int strcmp(char *str1,char #str2),字符串比較。函數(shù)相關(guān)說明1. 接收用戶輸入:getchar()和dowhile循環(huán)的組合doch=
6、getchar();progp+=ch;while(ch!='#'); /輸入以號(hào)鍵結(jié)束2. 輸出到控制臺(tái):dowhile循環(huán)中,掃描出單詞后(掃描程序還會(huì)判斷種別碼syn)輸出。doscanner(); /掃描,單詞switch(syn)case 11:if(isDecimal=0)printf("(%2d,%8d)n",syn,(int)sum);break;else if(isExp=1)printf("(%2d,%10.5e)n",syn,sum);isExp=0;isDecimal=0;break;else if(isDecim
7、al=1)printf("(%2d,%8.4f)n",syn,sum);isDecimal=0;break;case -1:printf("input errorn");break;default:printf("(%2d,%8s)n",syn,token);while(syn!=0);3. 浮點(diǎn)數(shù)的識(shí)別,先識(shí)別數(shù)字,再識(shí)別 . ,再識(shí)別數(shù)字,再識(shí)別E或e,再識(shí)別 - ,再識(shí)別數(shù)字。elseif(ch>='0')&&(ch<='9')while(ch>='0
8、39;)&&(ch<='9')sum=sum*10+ch-'0' /ch中數(shù)字本身是當(dāng)做字符存放的ch=progp+;if(ch='.')isDecimal=1;ch=progp+;while(ch>='0')&&(ch<='9')/pow(x,y)計(jì)算x的y次冪temp=(ch-'0')*pow(0.1,+count);decimal=decimal+temp;/AddToDec();ch=progp+;sum=sum+decimal;if(ch=
9、'e'|ch='E')isExp=1;ch=progp+;if(ch='-')isNegative=1;ch=progp+;while(ch>='0')&&(ch<='9')/指數(shù)index=index*10+ch-'0'ch=progp+;if(isNegative)sum=sum*pow(0.1,index);elsesum=sum*pow(10,index);p-;syn=11;輸入與輸出詞法分析程序需具備詞法分析的功能:輸入:所給文法的源程序字符串。(字符串以“#
10、”號(hào)結(jié)束)輸出:二元組(syn,token或sum)構(gòu)成的序列。其中:syn為單詞種別碼; token為存放的單詞自身字符串; sum為整型常數(shù)。程序運(yùn)行結(jié)果五、 實(shí)驗(yàn)方案設(shè)計(jì)實(shí)現(xiàn)用C語言實(shí)現(xiàn)。六、 實(shí)驗(yàn)程序亮點(diǎn)描述浮點(diǎn)數(shù)處理部分:巧妙利用double pow(double x,double y)函數(shù),簡(jiǎn)化了浮點(diǎn)數(shù)處理部分。如果是簡(jiǎn)單浮點(diǎn)數(shù),如1.23,出現(xiàn)“.”符號(hào),置isDeminal為1,用%f輸出。如果稍微復(fù)雜一點(diǎn),指數(shù)形式,但是正數(shù)冪,如1.23E2,出現(xiàn)“E”符號(hào),置isExp為1,用%e輸出。如果更復(fù)雜一點(diǎn),指數(shù)形式,但是負(fù)數(shù)冪,如1.23E-2,出現(xiàn)“-”號(hào),置isNegati
11、ve為1,仍然用%e輸出。如果是有符號(hào)數(shù)(有符號(hào)整數(shù)或者有符號(hào)浮點(diǎn)數(shù)),在識(shí)別出“+”或者“-”之后,再讀后邊一個(gè)字符,如果是數(shù)字,那么轉(zhuǎn)至識(shí)別數(shù)字的代碼段,并在末尾將sum進(jìn)行相應(yīng)處理。如果后邊字符不是數(shù)字,證明“+”或者“-”是加減號(hào),而非正負(fù)號(hào)。七、 實(shí)驗(yàn)程序使用說明用戶輸入待識(shí)別字符串(并以“#”結(jié)尾,表示字符串輸入結(jié)束),回車后程序自動(dòng)輸出詞法分析結(jié)果。八、 實(shí)驗(yàn)心得體會(huì)詞法分析的基本任務(wù)是從字符串表示的源程序中識(shí)別出具有獨(dú)立意義的單詞符號(hào),其基本思想是根據(jù)掃描到單詞符號(hào)的第一個(gè)字符的種類,拼出相應(yīng)的單詞符號(hào)。通過本試驗(yàn)的完成,更加加深了對(duì)詞法分析原理的理解。 最初是按照老師課堂上的
12、C語言實(shí)現(xiàn)這個(gè)思路進(jìn)行的,但是后來老師要求將識(shí)別數(shù)字拓展到浮點(diǎn)數(shù)(即實(shí)數(shù))。由于本人C語言功底不夠扎實(shí),最后只得再回過頭去看了一下C語言的語法,不過最后還是通過自己的力量把東西給做出來了。很有成就感!參考文獻(xiàn)1 張素琴,呂映芝等.編譯原理M.第2版.北京:清華大學(xué)出版社,2005.22 王雷,劉志成等.編譯原理課程設(shè)計(jì)M.北京:電子工業(yè)出版社,20023 何炎祥等.編譯程序構(gòu)造M.武漢:武漢大學(xué)出版社,19884 Holub A.Compiler Design in CM.Prentice-Hall,1990源程序代碼#include<stdio.h>#include<str
13、ing.h>#include<math.h>char prog80; /存放所有輸入字符char token8; /存放詞組char ch; /單個(gè)字符int syn,p,m,n; /syn:種別編碼double sum; int count;int isSignal; /是否帶正負(fù)號(hào)(0不帶,1負(fù)號(hào),2正號(hào))int isDecimal; /是否是小數(shù)double decimal; /小數(shù)int isExp; /是否是指數(shù)int index; /指數(shù)冪int isNegative; /是否帶負(fù)號(hào)double temp;int temp2;void scanner();char
14、 *rwtab6="begin","if","then","while","do","end"void main()p=0;count=0;isDecimal=0;index=0;printf("n Please input string:n");doch=getchar();progp+=ch;while(ch!='#'); /輸入以號(hào)鍵結(jié)束p=0;doscanner(); /掃描,單詞switch(syn)case 11:if(isDe
15、cimal=0)/加了1個(gè)強(qiáng)制類型轉(zhuǎn)換printf("(%2d,%8d)n",syn,(int)sum);break;else if(isExp=1)printf("(%2d,%10.5e)n",syn,sum);isExp=0;isDecimal=0;break;else if(isDecimal=1)printf("(%2d,%8.4f)n",syn,sum);isDecimal=0;break;case -1:printf("input errorn");break;default:printf("
16、(%2d,%8s)n",syn,token);while(syn!=0);void scanner()sum=0;decimal=0;m=0;for(n=0;n<8;n+)tokenn=NULL;ch=progp+; /從prog中讀出一個(gè)字符到ch中while(ch=' ') /跳過空字符(無效輸入)ch=progp+;if(ch>='a')&&(ch<='z')|(ch>='A')&&(ch<='Z') /ch是字母字符while(ch&g
17、t;='a')&&(ch<='z')|(ch>='A')&&(ch<='Z')|(ch>='0')&&(ch<='9')tokenm+=ch; /ch=>tokench=progp+; /讀下一個(gè)字符tokenm+='0'p-; /回退一格syn=10; /標(biāo)識(shí)符/如果是"begin","if","then","while"
18、;,"do","end"標(biāo)識(shí)符中的一個(gè)for(n=0;n<6;n+)if(strcmp(token,rwtabn)=0)syn=n+1;break; elseif(ch>='0')&&(ch<='9')IsNum: if(isSignal=1) /tokenm+='-' while(ch>='0')&&(ch<='9')sum=sum*10+ch-'0' /ch中數(shù)字本身是當(dāng)做字符存放的ch=pro
19、gp+;if(ch='.')isDecimal=1;ch=progp+;while(ch>='0')&&(ch<='9')/pow(x,y)計(jì)算x的y次冪temp=(ch-'0')*pow(0.1,+count);decimal=decimal+temp;/AddToDec();ch=progp+;sum=sum+decimal;if(ch='e'|ch='E')isExp=1;ch=progp+;if(ch='-')isNegative=1;ch=pro
20、gp+;while(ch>='0')&&(ch<='9')/指數(shù)index=index*10+ch-'0'ch=progp+;/10的冪/123e3代表123*10(3)/sum=sum*pow(10,index);是錯(cuò)誤的if(isNegative)sum=sum*pow(0.1,index);elsesum=sum*pow(10,index);if(isSignal=1)sum=-sum;isSignal=0;p-;syn=11;else switch(ch)case '<':m=0;tokenm+=ch;ch=progp+;if(ch='>')syn=21; /<>對(duì)應(yīng)21tokenm+=ch;else if(ch='=')syn=22;tokenm+=ch;elsesyn=20;p-;break;case '>':m=0;tokenm+=ch;ch=progp+;if(ch='=')syn=24;tokenm+=ch;elsesyn=23;p-;break;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高職單招面試培訓(xùn)
- 服務(wù)與教學(xué)培訓(xùn)
- 全國上海科教版初中信息技術(shù)八年級(jí)第一學(xué)期第三單元活動(dòng)三《設(shè)計(jì)家庭網(wǎng)絡(luò)》教學(xué)設(shè)計(jì)
- 人教部編版五年級(jí)下冊(cè)景陽岡教學(xué)設(shè)計(jì)及反思
- 地震救援高級(jí)培訓(xùn)課件
- 材料安全復(fù)習(xí)測(cè)試卷
- 《營(yíng)養(yǎng)含量》(教學(xué)設(shè)計(jì))-2024-2025學(xué)年北師大版小學(xué)數(shù)學(xué)六年級(jí)上冊(cè)
- 【八下HK數(shù)學(xué)】安徽省桐城市黃崗初級(jí)中學(xué)2023-2024學(xué)年八年級(jí)下學(xué)期期中數(shù)學(xué)試題
- 江蘇省宿遷市沭陽縣鄉(xiāng)鎮(zhèn)聯(lián)考2024-2025學(xué)年八年級(jí)下學(xué)期4月期中數(shù)學(xué)試題(原卷版+解析版)
- 大氣環(huán)境生態(tài)信息傳播重點(diǎn)基礎(chǔ)知識(shí)點(diǎn)
- CJT244-2016 游泳池水質(zhì)標(biāo)準(zhǔn)
- SH/T 3115-2024 石油化工管式爐輕質(zhì)澆注料襯里工程技術(shù)規(guī)范(正式版)
- HCIA H13-111鯤鵬應(yīng)用開發(fā)考試復(fù)習(xí)題庫(含答案)
- 部編版語文八年級(jí)下冊(cè)期中基礎(chǔ)鞏固與能力提升練習(xí)-解析版
- 杜威《民主主義與教育》電子版
- 碎石技術(shù)供應(yīng)保障方案
- 2023年江蘇省南京市中考化學(xué)試卷真題(含答案)
- 衛(wèi)星互聯(lián)網(wǎng)通信技術(shù)
- 2023年水利部珠江水利委員會(huì)直屬事業(yè)單位招聘工作人員考試真題及答案
- 2024年3月四川省考公務(wù)員面試題及參考答案
- 戰(zhàn)略性新興產(chǎn)業(yè)政府引導(dǎo)基金發(fā)展策略與模式
評(píng)論
0/150
提交評(píng)論