資源描述:
《【精品】詞法分析實驗報告》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、實驗1詞法分析實驗報吿一、實驗?zāi)康耐ㄟ^編寫并上機調(diào)試一個詞法分析程序,掌握在對程序設(shè)計語言的源程序進行掃描的過程中,將其分解后各類單詞的詞法分析方法。二、實驗內(nèi)容輸入:據(jù)教學(xué)要求和學(xué)生貝體情況,從具有代表性的高級程序設(shè)計語言中,選取一個適當(dāng)大小的子集,例如可以選取一類典型單詞,也可以盡可能使各種類型的單詞都能兼顧到。輸出:單詞串的輸出形式,所輸出的每一單詞均按形如(CLASS,VALUE)的二元式編碼。對于變量和常數(shù),CLASS字段為相應(yīng)的類別碼,VALUE字段則是該標(biāo)識符、常數(shù)在其符號表中登記項的序號(要求在變量名表登記項屮
2、存放該標(biāo)識符的字符串;常數(shù)表登記項屮則存放該常數(shù)的二進制形式)。對于關(guān)鍵字和分隔符,采用一詞一類的編碼形式。由于采用一?詞一類的編碼方式,所以僅需在二元式的CLASS字段上放置和應(yīng)的單詞的類別碼,VALUE字段則為“空”。不過,為便于查看由詞法分析程序所輸出的單詞串,要求在CLASS字段上直接放置單詞符號串本身。三、實驗要求K待分析的簡單語言的詞法(1)關(guān)鍵字:beginifthenwhiledoend所有關(guān)鍵字都是小寫。(2)運算符和界符::=+-*/<<=<>>>==;()#(3)其他單詞是標(biāo)識符(ID)和整型常數(shù)(NUM
3、),通過以下正規(guī)式定義:ID=letter(letterldigit)*NUM=digitdigit*(4)空格由空白、制表符和換行符組成。空格-?般用來分隔ID、NUM,運算符、界符和關(guān)鍵字,詞法分析階段通常被忽略。2、各種單詞符號對應(yīng)的種別碼單詞符乃種別碼單詞符號種別碼begin1■■17if2■—■—18then3>20while4<>21do5<=22end6<23letter(letterldigit)*10>=24digitdigit*1125*13■q26/14(27+15)28■16#()3、詞法分析程序的功能
4、輸入:所給文法的源程序字符吊。輸Hh二元組(syn,token或sum)構(gòu)成的序歹ij。其中:syn為單詞種別碼;token為存放的單詞□身字符串;sum為整型常數(shù)。四、源程序代碼:#include#include#includecharprog[80],token[8];charch;intsyn,p,m=0,n,row,sum=0;char*rwtab[6]={“begin”,”if”,“then",“while”,“do”,“end"};voidscaner(){
5、for(n=0;n<&n++)token[nJ=NULL;ch=prog[p++];while(ch==,')ch=prog[p];P++;}if((ch>=*a'&&ch<=,z')ll(ch>=,A'&&ch<='Z,)){m=0;while((ch>=,0,&&ch<=,9,)ll(ch>=,a,&&ch<=,z,)ll(ch>=,A,&&ch<='Z,)){tokenfm++]=ch;ch=prog[p++];}token[m++]=W;p--;syn=10;for(n=0;n<6;n++)if(strcmp(toke
6、n,rwtab[n])==0){syn=n+l;break;}}elseif((ch>='()'&&chv=9)){{sum=0;while((ch>='0'&&chv=9)){sum二sum*10+ch-'O';ch=progfp++];}}P??;syn=11;if(sum>32767)syn=-l;elseswitch(ch){case,<,:m=0;token[iTi++]=ch;ch=prog[p++l;if(ch==*>'){syn=21;tokenfm++]=ch;}elseif(ch=='='){syn=22;
7、token[m++l=ch;}else{syn=23;p--;}break;case,>f:m=0;token[m++]=ch;ch=prog[p++J;if(ch==*='){syn=24;token[m++]=ch;}else{syn=20;P-sbreak;casc,:r:m=0;tokcn[m++]=ch;ch=prog[p++];if(ch==,='){syn=18;token[m++]=ch;}else{syn=17;p--;}break;case,*,:syn=13;token[0]=ch;break;casel
8、/,:syn=14;token[0]=ch;break;case屮:syn=15;tokcn[0]=ch;brcak;case-r:syn=16;token[0]=ch;break;case=,:syn=25;tokenf()l=ch;break;casel;l:syn=26