資源描述:
《編譯原理實(shí)驗(yàn)報(bào)告-詞法分析器構(gòu)造》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、編譯原理實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)題目:詞法分析器構(gòu)造指導(dǎo)教師:段青松姓名:班級(jí):學(xué)號(hào):實(shí)驗(yàn)成績(jī):實(shí)驗(yàn)題目詞法分析器構(gòu)造實(shí)驗(yàn)?zāi)康暮鸵罂傮w任務(wù):通過(guò)對(duì)給定源語(yǔ)言詞法分析程序的設(shè)計(jì),加深對(duì)詞法分析原理的理解,掌握源語(yǔ)言的接受、存貯、預(yù)處理和掃描分析,生成正確的單詞符號(hào)串二元式序列。說(shuō)明提示:1.本實(shí)驗(yàn)要求的直接分析法,即從左向右掃描源程序,一旦發(fā)現(xiàn)有獨(dú)立意義的字符串時(shí),即將其改造統(tǒng)一長(zhǎng)度的二元組(t,i)輸出,其中t表示單詞種別,i為相應(yīng)內(nèi)部表示,本題t分為五類(lèi):K(關(guān)鍵字)、I(標(biāo)識(shí)符)、C(常數(shù))、P(界符),L(標(biāo)號(hào))i為特定項(xiàng)的指針值,對(duì)應(yīng)于每一類(lèi)屬性的單詞均設(shè)置相應(yīng)的有貯表格,在識(shí)
2、別過(guò)程中每識(shí)別出一個(gè)單詞,則將其順序放入相應(yīng)的符號(hào)表中。2.源程序利用行編輯錄入,以TEXT文件形式存貯在盤(pán)上,詞法分析程序,先對(duì)源程序作預(yù)處理掃描生成新的TEXT文件。預(yù)處理的功能是剔除無(wú)用的空白、跳格、回車(chē)和換行等編輯性字符;去掉注解部分,連接繼續(xù)行,給出句未符。3.本實(shí)驗(yàn)作為編譯過(guò)程的第一階段和后續(xù)實(shí)驗(yàn)的前提,所有生成結(jié)果都必須作為永久文件存貯。設(shè)計(jì)思想與框架詞法分析時(shí),首先要對(duì)源程序進(jìn)行預(yù)處理,去掉的多余的空格符號(hào)和注釋?zhuān)渲凶⑨屢獎(jiǎng)h除,多個(gè)空格變成一個(gè),并在結(jié)尾加一個(gè)標(biāo)識(shí)符如#,用來(lái)表示結(jié)束。預(yù)處理階段結(jié)束,再進(jìn)行逐詞分析。若第一位是字母,則他可能是關(guān)鍵字、標(biāo)號(hào)、標(biāo)
3、示符;若第一位是數(shù)字,則可能是常數(shù)、標(biāo)號(hào)、非法標(biāo)號(hào);若為其他字符,則可能是界符、運(yùn)算符、關(guān)系符、或非法字符。這樣細(xì)分后再進(jìn)行查表判斷。核心算法定義符號(hào)表:char*keyword[4]={"IF","THEN","ELSE","GOTO"};char*operatornum[4]={"+","-","*","/"};char*comparison[6]={">","<",">=","<=","=","<>"};char*interpunction[4]={",",":","(",")"};主要函數(shù):boolsearch(charsearchstr[],intwordtype)
4、charletterprocess(charch)//isalnum判斷是否為字母或者數(shù)字charnumberprocess(charch)//數(shù)字charotherprocess(charch)//數(shù)字,字母,非括號(hào)charprocess(charch)//讀字符voidpro_process(char*buf)//預(yù)處理voidmain()//主函數(shù)源程序及注釋#include#include#include#include#include#include#i
5、nclude#include#defineNULL0FILE*fp;FILE*out,*in;charch;charfilename[50];char*keyword[4]={"IF","THEN","ELSE","GOTO"};char*operatornum[4]={"+","-","*","/"};char*comparison[6]={">","<",">=","<=","=","<>"};char*interpunction[4]={",",":","(",")"};intx=-1,y=-1,z=-1;#defineKl
6、en10#defineIlen30#defineClen40#definePlen20#defineOlen20#defineLlen10charK[Klen][10],P[Plen][2],I[Ilen][20],O[Olen][2];intC[Clen],L[Llen];boolsearch(charsearchstr[],intwordtype){inti;switch(wordtype){case1:for(i=0;i<=3;i++){if(strcmp(keyword[i],searchstr)==0)returntrue;}case2:for(i=0;i<=3;i
7、++){if(strcmp(operatornum[i],searchstr)==0)returntrue;}case3:for(i=0;i<=5;i++){if(strcmp(comparison[i],searchstr)==0)returntrue;}case4:for(i=0;i<=3;i++){if(strcmp(interpunction[i],searchstr)==0)returntrue;}}returnfalse;}charletterprocess(charch)//isalnum