C-minus語(yǔ)言詞法分析器實(shí)驗(yàn)報(bào)告_第1頁(yè)
C-minus語(yǔ)言詞法分析器實(shí)驗(yàn)報(bào)告_第2頁(yè)
C-minus語(yǔ)言詞法分析器實(shí)驗(yàn)報(bào)告_第3頁(yè)
C-minus語(yǔ)言詞法分析器實(shí)驗(yàn)報(bào)告_第4頁(yè)
C-minus語(yǔ)言詞法分析器實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、裝訂線(xiàn) 編譯原理實(shí)驗(yàn)報(bào)告 題目: C_minus語(yǔ)言詞法分析器 學(xué) 院 計(jì)算機(jī)科學(xué)與技術(shù) 專(zhuān) 業(yè) xxxxxxxxxxxxxxxx 學(xué) 號(hào) xxxxxxxxxxxx 姓 名 xxxx 指導(dǎo)教師 xxxx 20xx年xx月xx日C_minus語(yǔ)言詞法分析器一、實(shí)驗(yàn)?zāi)康?1.理解詞法分析器的設(shè)計(jì)方法:利用DFA編寫(xiě)相應(yīng)的程序。2.掌握手工編寫(xiě)詞法分析程序的方法。3.復(fù)習(xí)熟悉以前學(xué)過(guò)的編程語(yǔ)言 4.通過(guò)實(shí)驗(yàn)了解編譯器詞法分析的工作原理二、實(shí)驗(yàn)原理 1.文法的概念,DFA的表示方法。 2.詞法分析程序的輸出和輸入:詞法分析程序的功能是讀入源程序,輸出單詞符號(hào)。單詞符號(hào)是程序設(shè)計(jì)語(yǔ)言的比本語(yǔ)法符號(hào),程序

2、設(shè)計(jì)語(yǔ)言的單詞符號(hào)一般分為如下幾種:關(guān)鍵字,標(biāo)示符,常數(shù),運(yùn)算符,界符,單詞的輸出是二元式的形式,需要知道二元式的表示方法,把得到的二元式寫(xiě)入輸出文件。轉(zhuǎn)化圖如下:源程序詞法分析程序記號(hào)文件 3.熟悉單詞的描述工具,如正規(guī)文法,正規(guī)式,以及知道正規(guī)文法和正規(guī)式的等價(jià)性以及他們之間的互相轉(zhuǎn)化。熟悉把正規(guī)文法轉(zhuǎn)化為正規(guī)式,把正規(guī)式轉(zhuǎn)化為NFA以及把NFA轉(zhuǎn)為相應(yīng)的DFA,最后再把DFA簡(jiǎn)化,DFA的狀態(tài)轉(zhuǎn)化為相應(yīng)的子程序,最后得到詞法分析器4.C語(yǔ)言的基本語(yǔ)法。三、實(shí)驗(yàn)要求1、該個(gè)詞法分析器要求至少能夠識(shí)別以下幾類(lèi)單詞:關(guān)鍵字:elseifintreturnvoidwhile共6個(gè),所有的關(guān)鍵字都

3、是保留字,并且必須是小寫(xiě);標(biāo)識(shí)符:識(shí)別與C語(yǔ)言詞法規(guī)定相一致的標(biāo)識(shí)符,通過(guò)下列正則表達(dá)式定義:ID=letter(letter|digit)*;常數(shù):NUM=digitdigit*(.digitdigit*|)(e(+|-|)digitdigit*|),letter=a|.|z|A|.|Z|,digit=0|.|9,包括整數(shù),如123等;小數(shù),如123.45等;科學(xué)計(jì)數(shù)法表示的常數(shù),如1.23e3,2.3e-9等;專(zhuān)用符號(hào):+-*/=!=,()/*/;2、分析器的輸入為由上述幾類(lèi)單詞構(gòu)成的程序,輸出為該段程序的機(jī)內(nèi)表示形式,即關(guān)鍵字、運(yùn)算符、界限符變?yōu)槠鋵?duì)應(yīng)的機(jī)內(nèi)符,常數(shù)使用二進(jìn)制形式,標(biāo)識(shí)符

4、使用相應(yīng)的標(biāo)識(shí)符表指針表示。3、詞法分析器應(yīng)當(dāng)能夠指出源程序中的詞法錯(cuò)誤,如不可識(shí)別的符號(hào)、錯(cuò)誤的詞法等。四、實(shí)驗(yàn)結(jié)果(程序)及分析#include#include#include#defineN100typedefstruct charname30; intcode; intaddr;token;/存儲(chǔ)剛從文件中讀取的字符typedefstructcharname30;intcode;Keyword;typedefstruct charname30;intcode;intaddr;symbol;Keywordkey6=else,1,if,2,int,3,return,4,void,5,whe

5、re,6;charch;/接受字符FILE*source;/源文件FILE*keytxt;/關(guān)鍵字輸出文件FILE*badgetxt;/標(biāo)識(shí)符輸出文件FILE*othertxt;/其他單詞輸出文件FILE*number;interror_count;/錯(cuò)誤的個(gè)數(shù)intaddr_count;/標(biāo)識(shí)符表的指針intlineof;/行號(hào)tokencurrent;/暫時(shí)存放讀入的字符tokenzancun;symbolcurrentsymbol;symbolsymboltableN;/標(biāo)識(shí)符表voiderror(inti);voidmain()voidscan();error_count=0;addr

6、_count=0;error_count=0;lineof=0;scan();voidscan()inti=0;voidiskeyword();/判斷關(guān)鍵字voidisOthers()/判斷其他單詞voidoutput_1();/關(guān)鍵字輸出文件voidoutput_2();/標(biāo)識(shí)符輸出文件voidoutput_others();/其他單詞輸出文件voidIszhushi();voidisnumber();if(source=fopen(Source.txt,r)=NULL)/打開(kāi)源文件printf(fileopenerror/n);exit(0);if(keytxt=fopen(key.txt

7、,w)=NULL)/打開(kāi)關(guān)鍵字文件printf(fileopenerror/n);exit(0);if(badgetxt=fopen(badge.txt,w)=NULL)/打開(kāi)標(biāo)識(shí)符文件printf(fileopenerror/n);exit(0);if(othertxt=fopen(others.txt,w)=NULL)printf(fileopenerrorn);exit(0); if(number=fopen(number.txt,w)=NULL)printf(fileopenerrorn);exit(0); ch=fgetc(source); while(ch!=EOF) for(i=

8、0;i=a&ch=A&ch=0&ch=a)&(ch=A)&(ch0&ch9)i=ch;i+;ch=fgetc(source);zancun=current;for(i=0;i6;i+)for(j=0;j30;j+)if(j=j)h=0;elseh=1;break; if(h=0)break;if(h=0) current.code=keyi.code;output_1();elsestrcpy(symboltableaddr_,);symboltableaddr_count.code=

9、10;symboltableaddr_count.addr=addr_count; addr_count+;output_2();voidisOthers()charch1;inti; for(i=0;i30;i+) i=0; switch(ch) case+: 0=+; current.code=13; current.addr=-1; output_others(); break; case-: 0=-; current.code=14; current.addr=-1; output_others(); break;

10、 case*: 0=*; current.code=15; current.addr=-1; output_others(); break; case/: 0=/; current.code=16; current.addr=-1; output_others(); break; case: ch1=fgetc(source); if(ch1=) 0=; 1=;current.code=17; output_others(); break; else fseek(source,-1,1); curr

11、0=: ch1=fgetc(source); if(ch1=) 0=; 1=; current.code=19; output_others(); break; else fseek(source,-1,1); 0=; current.code=20;output_others(); break; case=:ch1=fgetc(source);if(ch1=)0=;1=;current.code=21;current.addr=-1;output_other

12、s();break;0=;current.code=22;current.addr=-1;output_others();fseek(source,-1,1);break;case!:ch1=fgetc(source);if(ch1=)0=!;1=;current.code=23;current.addr=-1;output_others();break;elsefseek(source,-1,1);0=!;current.code=24;current.addr=-1;output_oth

13、ers();break;case;:0=;current.code=25;current.addr=-1;output_others();break;case,:0=,;current.code=26;current.addr=-1;output_others();case(:inti=ftell(source);charch1=ch; charch2;while(ch!=)ch=fgetc(source);if(ch=)0=ch1;1=ch;current.code=27;current.addr

14、=-1;output_others();fseek(source,i,0);ch2=fgetc(source);ch2=fgetc(source);break;elseerror_count+;error(1);fseek(source,i,0);ch2=fgetc(source);ch2=fgetc(source);break;case:0=;current.code=28;current.addr=-1;output_others();break;case:0=;current.code=28;current.addr=-1;output_o

15、thers();break;case: 0=; current.code=29;current.addr=-1;output_others();break;case: 0=;current.code=29;current.addr=-1;output_others();break;case10: lineof+; break;voidIszhushi()charch1;ch1=ch;ch=fgetc(source);if(ch=*)for(;)ch=fgetc(source);if(ch=EOF) error(2);break;if(ch=*)c

16、h1=ch;ch=fgetc(source);if(ch=)ch=fgetc(source);break;elseerror_count+;error(2);voidisnumber()intk=0;voidoutput_number();while(ch=0&ch=9)k+=ch;ch=fgetc(source);current.code=11;output_number();voidoutput_1()printf(關(guān)鍵字:,,current.code);putchar(10);fprintf(keytxt,,current.code);voidoutput_2() printf(標(biāo)識(shí)符地址:,,addr_count); putchar(10);fprintf(badgetxt,,addr_count);voidoutput_others()printf(其它單詞:,,current.code);putchar(10);fprintf(othertxt,current.na

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論