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è),還剩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)介

1、睡河心孕IIIII編譯原理實(shí)驗(yàn)報(bào)告題目:Cminus語(yǔ)言詞法分析器線I III|學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)xxxxxxxxxxxxxxxx學(xué)號(hào)xxxxxxxxxxxxI姓名xxxxI指導(dǎo)教師xxxx20xx年xx月xx日C_minus語(yǔ)言詞法分析器實(shí)驗(yàn)?zāi)康? .理解詞法分析器的設(shè)計(jì)方法:利用DFA編寫相應(yīng)的程序。2 .掌握手工編寫詞法分析程序的方法。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),程序設(shè)計(jì)語(yǔ)言

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

3、e共6個(gè),所有的關(guān)鍵字都是保留字,弁且必須是小寫;標(biāo)識(shí)符:識(shí)別與C語(yǔ)言詞法規(guī)定相一致的標(biāo)識(shí)符,通過(guò)下列正則表達(dá)式定義:ID=letter(letter|digit)*常數(shù):NUM=digitletter=a|.|z|A|.|Z|digit*(.digitdigit*|&)(e(+|-|&)digitdigit*|&),digit=0|.|9,包括整學(xué)計(jì)數(shù)法表示的常數(shù),如123等;小數(shù),如123.45等;科1.23e3,2.3e-9等;數(shù),如專用符號(hào):+-*/<<=>>=!=,()/*/;2、 分析器的輸入為由上述幾類單詞構(gòu)成的程序,輸出為該段程序

4、的機(jī)內(nèi)表示形式,即關(guān)鍵字、運(yùn)算符、界限符變?yōu)槠鋵?duì)應(yīng)的機(jī)內(nèi)符,常數(shù)使用二進(jìn)制形式,標(biāo)識(shí)符使用相應(yīng)的標(biāo)識(shí)符表指針表示。3、 詞法分析器應(yīng)當(dāng)能夠指出源程序中的詞法錯(cuò)誤,如不可識(shí)別的符號(hào)、錯(cuò)誤的詞法等。四、實(shí)驗(yàn)結(jié)果(程序)及分析#include<stdio.h>#include<stdlib.h>#include<string.h>#defineN100typedefstructcharname30;intcode;intaddr;token;/存儲(chǔ)剛從文件中讀取的字符typedefstructcharname30;intcode;Keyword;typedefst

5、ructcharname30;intcode;intaddr;symbol;Keywordkey6="else”,1,"if",2,"int”,3,"return”,4,"void”,5,"where6;charch;/接受字符FILE*source;/源文件標(biāo)識(shí)符輸出文件 其他單詞輸出文件錯(cuò)誤的個(gè)數(shù) 標(biāo)識(shí)符表的指針暫時(shí)存放讀入的字符FILE*keytxt;/關(guān)鍵字輸出文件FILE*badgetxt;/FILE*othertxt;/FILE*number;interror_count;/intaddr_count;/intl

6、ineof;/行號(hào)tokencurrent;/tokenzancun;symbolcurrentsymbol;標(biāo)識(shí)符表symbolsymboltableN;/voiderror(inti);voidmain()voidscan();error_count=0;addr_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();

7、/其他單詞輸出文件voidIszhushi();voidisnumber();if(source=fopen("Source.txt”,"r")=NULL)printf("fileopenerror/n");exit(0);if(keytxt=fopen("key.txt","w")=NULL)printf("fileopenerror/n");exit(0);/打開(kāi)源文件if(badgetxt=fopen("badge.txt”,"w")=NULL)pr

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

9、lt;30;i+)i='0'if(ch>='a'&&ch<='z')|(ch>='A'&&ch<='Z')|ch='_')iskeyword();if(ch='')Iszhushi();if(ch>='0'&&ch<='9')isnumber();elseisOthers();ch=fgetc(source);fclose(source);fcl

10、ose(keytxt);fclose(badgetxt);fclose(othertxt);fclose(number);voidiskeyword()inti=0,k=0,j=0;inth=0;while(ch>='a')&&(ch<='z')|(ch>='A')&&(ch<='Z')|ch='_'|(ch>'0'&&ch<'9')i=ch;i+;ch=fgetc(sourc

11、e);zancun=current;for(i=0;i<6;i+)for(j=0;j<30;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=10;symboltableaddr_count.addr=addr_count;addr_count+;output_2();vo

12、idisOthers()charch1;inti;for(i=0;i<30;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;case'*':(current.nam

13、e0='*'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_ot

14、hers();break;else(fseek(source,-1,1);0='<'current.code=18;current.addr=-1;output_others();break;case'':ch1=fgetc(source);if(ch1='=')0='>'1='='current.code=19;output_others();break;elsefseek(source,-1,1);0=&

15、#39;>'current.code=20;output_others();break;case'=':ch1=fgetc(source);if(ch1='=')0='='1='='current.code=21;current.addr=-1;output_others();break;0='='current.code=22;current.addr=-1;output_others();fseek(source,-1

16、,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_others();break;case'':0=&#

17、39;'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;cur

18、rent.addr=-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=

19、9;'current.code=28;current.addr=-1;output_others();break;case'':0=''current.code=29;current.addr=-1;output_others();break;case'':0=''current.code=29;current.addr=-1;output_others();break;case'10':lineof+;break;voidIszhushi()charch1;

20、ch1=ch;ch=fgetc(source);if(ch='*')(for(;)(ch=fgetc(source);if(ch=EOF)(error(2);break;if(ch='*')(ch1=ch;ch=fgetc(source);if(ch='')(ch=fgetc(source);break;else(error_count+;error(2);voidisnumber()(intk=0;voidoutput_number();while(ch>='0'&&ch<='9')c

21、k+=ch;ch=fgetc(source);current.code=11;output_number();voidoutput_1()printf("關(guān)鍵字:<%s,%d>”,,current.code);putchar(10);fprintf(keytxt,"<%s,%d>",,current.code);voidoutput_2()printf("標(biāo)識(shí)符地址:<%s,%d>",,addr_count);putchar(10);fprintf(badgetxt,"<%s,%d>",,addr_count);voidoutput_others()printf("其它單詞:<%s,

溫馨提示

  • 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)論