詞法分析與語(yǔ)法分析程序設(shè)計(jì)(共54頁(yè))_第1頁(yè)
詞法分析與語(yǔ)法分析程序設(shè)計(jì)(共54頁(yè))_第2頁(yè)
詞法分析與語(yǔ)法分析程序設(shè)計(jì)(共54頁(yè))_第3頁(yè)
詞法分析與語(yǔ)法分析程序設(shè)計(jì)(共54頁(yè))_第4頁(yè)
詞法分析與語(yǔ)法分析程序設(shè)計(jì)(共54頁(yè))_第5頁(yè)
已閱讀5頁(yè),還剩49頁(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、精選優(yōu)質(zhì)文檔-傾情為你奉上l 實(shí)驗(yàn)三 詞法分析與語(yǔ)法分析程序設(shè)計(jì)一實(shí)驗(yàn)?zāi)康幕菊莆沼?jì)算機(jī)語(yǔ)言的詞法分析程序和語(yǔ)法分析程序的設(shè)計(jì)方法。二實(shí)驗(yàn)要求、內(nèi)容及步驟實(shí)驗(yàn)要求:1.根據(jù)以下的正規(guī)式,畫(huà)出狀態(tài)圖;標(biāo)識(shí)符:<字母>(<字母>|<數(shù)字字符>)*關(guān)鍵字:if then else while do十進(jìn)制整數(shù):0 | (1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*運(yùn)算符和分隔符:+ - * / > < = ( ) 。2.根據(jù)狀態(tài)圖,設(shè)計(jì)詞法分析函數(shù)int scan( ),從鍵盤(pán)讀入數(shù)據(jù),分析出一個(gè)單詞。3.對(duì)于只含有+

2、、*運(yùn)算的算術(shù)表達(dá)式的如下文法,編寫(xiě)相應(yīng)的語(yǔ)法分析程序,要求用LL(1)分析表實(shí)現(xiàn),并以id+id*id為例進(jìn)行測(cè)試:E TE E +TE| T FTT *FT|F (E)| id實(shí)驗(yàn)步驟:1.根據(jù)狀態(tài)圖,設(shè)計(jì)詞法分析算法;2.采用C+語(yǔ)言,實(shí)現(xiàn)該算法;3.調(diào)試程序:輸入一組單詞,檢查輸出結(jié)果;4.編制給定文法的非遞歸的預(yù)測(cè)分析程序,并加以測(cè)試。 三實(shí)驗(yàn)設(shè)備計(jì)算機(jī)、Windows 操作系統(tǒng)、Visual C+ 程序集成環(huán)境。四 實(shí)驗(yàn)原理1. 詞法分析器讀入輸入串,將其轉(zhuǎn)換成將被語(yǔ)法分析器分析的詞法單元序列。產(chǎn)生下述小語(yǔ)言的單詞序列。這個(gè)小語(yǔ)言的所有的單詞符號(hào),以及它們的種別編碼和內(nèi)部

3、值如下表:?jiǎn)卧~符號(hào)種別編碼助記符內(nèi)碼值DIMIFDOSTOPEND標(biāo)識(shí)符常數(shù)(整)=+*,()1234567891011121314$DIM$IF$DO$STOP$END$ID$INT$ASSIGN$PLUS$STAR$POWER$COMMA$LPAR$RPAR-內(nèi)部字符串標(biāo)準(zhǔn)二進(jìn)形式-對(duì)于這個(gè)小語(yǔ)言,有幾點(diǎn)重要的限制:首先,所有的關(guān)鍵字(如IFWHILE等)都是“保留字”。所謂的保留字的意思是,用戶(hù)不得使用它們作為自己定義的標(biāo)示符。例如,下面的寫(xiě)法是絕對(duì)禁止的:IF(5)=x。 其次,由于把關(guān)鍵字作為保留字,故可以把關(guān)鍵字作為一類(lèi)特殊標(biāo)示符來(lái)處理。也就是說(shuō),對(duì)于關(guān)鍵字不專(zhuān)設(shè)對(duì)應(yīng)的轉(zhuǎn)換圖。但把

4、它們(及其種別編碼)預(yù)先安排在一張表格中(此表叫作保留字表)。當(dāng)轉(zhuǎn)換圖識(shí)別出一個(gè)標(biāo)識(shí)符時(shí),就去查對(duì)這張表,確定它是否為一個(gè)關(guān)鍵字。再次,如果關(guān)鍵字、標(biāo)識(shí)符和常數(shù)之間沒(méi)有確定的運(yùn)算符或界符作間隔,則必須至少用一個(gè)空白符作間隔(此時(shí),空白符不再是完全沒(méi)有意義的了)。例如,一個(gè)條件語(yǔ)句應(yīng)寫(xiě)為IF i>0 i= 1;而絕對(duì)不要寫(xiě)成IFi>0 i=1;因?yàn)閷?duì)于后者,我們的分析器將無(wú)條件地將IFI看成一個(gè)標(biāo)識(shí)符。這個(gè)小語(yǔ)言的單詞符號(hào)的狀態(tài)轉(zhuǎn)換圖,如下圖:2.語(yǔ)法分析是決定如何使用一個(gè)文法生成一個(gè)終結(jié)符串的過(guò)程。語(yǔ)法分析器 能識(shí)別由加+ 減- 乘* 除/ 乘方 括號(hào)()操作數(shù)所組成的算術(shù)表達(dá)式,

5、其文法如下:EE+T|E-T|TTT*F|T/F|FFPF|Pp(E)|i使用的算法可以是:預(yù)測(cè)分析法;遞歸下降分析法;算符優(yōu)先分析法;LR分析法等。分析表格式:id+*()$EE TEE TE EE +TEE E TT FTT FT TT T *FTT T FF idF (E)3.中間代碼生成器 產(chǎn)生上述算術(shù)表達(dá)式的中間代碼(四元式序列)。五實(shí)驗(yàn)代碼及結(jié)果詞法分析代碼:#include<string.h>#include<iostream>using namespace std;char prog100,token10;char ch;int syn,p,m=0,n,

6、row,sum=0;char *rwtab20="dim","if","do","stop","end" ,"and","begin","bool","case","char","false","for","int","not","or","set","then&quo

7、t;,"true","until","while"void scaner()for(n=0;n<9;n+) tokenn=NULL;ch=progp+;while(ch=' ')ch=progp;p+;if(ch>='a'&&ch<='z')|(ch>='A'&&ch<='Z')m=0;while(ch>='0'&&ch<='9')|(

8、ch>='a'&&ch<='z')|(ch>='A'&&ch<='Z')tokenm+=ch;ch=progp+;tokenm+='0'p-;syn=21;for(n=0;n<20;n+)if(strcmp(token,rwtabn)=0)syn=n+1;break;else if(ch>='0'&&ch<='9')sum=0;while(ch>='0'&&

9、ch<='9')sum=sum*10+ch-'0'ch=progp+;p-;syn=7+15;if(sum>32767)syn=-1;else switch(ch) case'=':syn=8+15;token0=ch;break;case'+':syn=9+15;token0=ch;break;case'*':m=0;tokenm+=ch;ch=progp+;if(ch='*')syn=11+15; tokenm+=ch;elsesyn=10+15;p-; break;case'

10、;,':syn=12+15;token0=ch;break;case'(':syn=13+15;token0=ch;break;case')':syn=14+15;token0=ch;break;case'#':syn=0;token0=ch;break;case'<':m=0;tokenm+=ch;ch=progp+;if(ch='>')syn=17+15;tokenm+=ch;else if(ch='=')syn=16+15;tokenm+=ch;elsesyn=15+15;

11、p-;break;case'>':m=0;tokenm+=ch;ch=progp+;if(ch='=')syn=19+15;tokenm+=ch;elsesyn=18+15;p-;break;case':':m=0;tokenm+=ch;ch=progp+;if(ch='=')syn=21+15;tokenm+=ch;elsesyn=20+15;p-;break;case'/':syn=22+15;token0=ch;break;case'-':syn=23+15;token0=ch;brea

12、k;case'':syn=24+15;token0=ch;break;default: syn=-1;break;void main()p=0;row=1;cout<<endl<<endl<<endl;cout<<"詞法分析"<<endl<<endl;cout<<"請(qǐng)輸入一段程序(以#結(jié)束):"docin.get(ch);progp+=ch;while(ch!='#');p=0;cout<<endl<<"詞

13、法分析結(jié)果如下"<<endl;cout<<"種別編碼 自身值"<<endl;doscaner();switch(syn)case 22 : cout<<" ("<<syn<<" , "<<sum<<")"<<endl; break; case -1: cout<< " Error in row"<<row<<"!"<&

14、lt;endl; break; default: cout<<" ("<<syn<<" , "<<token<<")"<<endl;break;while (syn!=0);詞法分析結(jié)果:語(yǔ)法分析代碼:#include<string.h>#include<malloc.h>#include<iostream>using namespace std;typedef struct table /分析表存儲(chǔ)結(jié)構(gòu) char m100;

15、table;table M100100; /定義分析表typedef struct stacknode /定義棧內(nèi)元素節(jié)點(diǎn) (帶頭結(jié)點(diǎn)(為空)的) char data; struct stacknode *next;stackk;void initlink(stackk *&s) /初始化新棧 s=(stackk *)malloc(sizeof(stackk); s->next=NULL;void poplink(stackk *&s) /頂元素出棧 stackk *p;char v; if(s->next!=NULL) p=s->next; v=p->

16、data; s->next=p->next; free(p);void pushlink(stackk *&s,char x) /新 元 素 入 棧 stackk *p; p=(stackk *)malloc(sizeof(stackk); p->data=x; p->next=s->next; s->next=p;void display(stackk *s) /打印 現(xiàn)實(shí)顯示 棧內(nèi)元素 stackk *p; int i=0,j; char st100; p=s->next; while(p!=NULL) sti+=p->data; p

17、=p->next; for(j=i-1;j>=0;j-) printf("%c",stj); for(j=0;j<16-i;j+) /打印 對(duì)齊格式 printf("%c",' '); char gettop(stackk *s) /返 回 棧 頂 元 素 值 if(s->next=NULL) return 0; else return s->next->data; int find(char c,char array) /查找函數(shù),int i;int flag=0;for(i=0;i<100;i

18、+)if(c=arrayi) flag=1;return flag;int location(char c,char array) /定位函數(shù),指出字符所在位置int i;for(i=0;i<100;i+)if(c=arrayi) return i;void error() /出錯(cuò)函數(shù)定義 printf("%15c出錯(cuò)!n",' ');void analyse(char Vn,char Vt) int i,j,m,p,q,length,t,h; char w,X; char str100;opt0: scanf("%s",str);

19、 for(i=0;i<strlen(str);i+) if(!find(stri,Vt) printf("輸入字符串有誤!請(qǐng)重新輸入!"); goto opt0; break; stackk *st; initlink(st); pushlink(st,'#'); pushlink(st,Vn0); /#與識(shí)別符號(hào)入棧 j=0; h=1; w=str0; printf("步驟%-12c分析棧%-24c剩余輸入串%-12c所用產(chǎn)生式n",' ',' ',' ');opt1: printf

20、("%-16d",h); /顯示步驟 h+; display(st); /顯示分析棧中內(nèi)容 X=gettop(st); /上托棧頂符號(hào)放入X poplink(st); for(int k=0;k<14+j;k+) /打印對(duì)齊格式 printf("%c",' '); for(t=j;t<strlen(str);t+) printf("%c",strt); /顯示剩余字符串 if(find(X,Vt)&& X!='#') /分析棧的棧頂元素和剩余輸入串的第一個(gè)元素相比較 if(X

21、=w) printf("%15c匹配n",X); j+; w=strj; goto opt1; else error(); else if(X='#') if(X=w) printf("%8c是該文法的句子!n",' '); else error(); else p=location(X,Vn); q=location(w,Vt); char *S1="null",*S2="NULL" if(strcmp(Mpq.m,S1)=0|strcmp(Mpq.m,S2)=0) /查找產(chǎn)生式

22、error(); else char str0100; strcpy(str0,Mpq.m); printf("%15c->%sn",X,str0); /顯示對(duì)應(yīng)的產(chǎn)生式 if(strcmp(str0,"$")=0) goto opt1; else length=strlen(str0); /逆序進(jìn)棧 for(m=length-1;m>=0;m-) pushlink(st,str0m); goto opt1; int main() int i,k,n,r; char Vn100,Vt100,select; printf("對(duì)任意輸入

23、LL(1)文法的分析表,判斷驗(yàn)證字符串是否為該文法的句子 n"); printf("并能給出分析和演示過(guò)程。 n"); /printf("*n");opt2: printf("請(qǐng)輸入各終結(jié)符(#號(hào)表示結(jié)束 )Vti:n"); for(i=0;i<100;i+) scanf("%c",&Vti); if(Vti='#') r=i; break; printf("請(qǐng)輸入非終結(jié)符個(gè)數(shù):n"); scanf("%d",&n); getc

24、har(); for (i=0;i<n;i+) printf("請(qǐng)輸入非終結(jié)符Vn%d:n",i); scanf("%c",&Vni); getchar(); printf("請(qǐng)輸入此非終結(jié)符對(duì)應(yīng)各終結(jié)符的產(chǎn)生式右部(null或NULL表示出錯(cuò);$表示空串):n"); for(k=0;k<=r;k+) scanf("%s",Mik.m); getchar(); opt3: printf("請(qǐng)輸入要分析的字符串,且以#結(jié)束:n"); analyse(Vn, Vt); print

25、f("請(qǐng)選擇n"); printf("1: 輸入字符串n"); printf("2: 輸入新分析表n"); printf("0: 退 出n");opt4:cin>>select; switch(select) case '1': goto opt3;break; case '2': goto opt2; case '0': break; default: printf("輸入錯(cuò)誤!請(qǐng)重新選擇:"); goto opt4; break;

26、return 0;語(yǔ)法分析結(jié)果:六實(shí)驗(yàn)小結(jié)通過(guò)實(shí)驗(yàn)了解到了詞法分析和語(yǔ)法分析二者的不同:1.詞法規(guī)則通常非常簡(jiǎn)單,不必動(dòng)用強(qiáng)大的文法來(lái)描述;2.對(duì)于詞法記號(hào),正規(guī)式比上下文無(wú)關(guān)文法提供了更簡(jiǎn)潔且易于理解的定義;3.從正規(guī)式可以自動(dòng)的構(gòu)造出有效的詞法分析器,從任何文法都很難構(gòu)造詞法分析器;4.把語(yǔ)言的語(yǔ)法結(jié)構(gòu)分成詞法和非詞法兩部分為編譯器前端的模塊劃分提供了方便的途徑。 一、目的<<編譯技術(shù)>>是理論與實(shí)踐并重的課程,而其實(shí)驗(yàn)課要綜合運(yùn)用一、二年級(jí)所學(xué)的多門(mén)課程的內(nèi)容,用來(lái)完成一個(gè)小型編譯程序。從而鞏固和加強(qiáng)對(duì)詞法分析、語(yǔ)法分析、語(yǔ)義分析、代碼生成和報(bào)錯(cuò)處理等理論的認(rèn)識(shí)和

27、理解;培養(yǎng)學(xué)生對(duì)完整系統(tǒng)的獨(dú)立分析和設(shè)計(jì)的能力,進(jìn)一步培養(yǎng)學(xué)生的獨(dú)立編程能力。二、任務(wù)及要求基本要求:1 詞法分析器 產(chǎn)生下述小語(yǔ)言的單詞序列這個(gè)小語(yǔ)言的所有的單詞符號(hào),以及它們的種別編碼和內(nèi)部值如下表: 單詞符號(hào)種別編碼助記符內(nèi)碼值DIMIFDOSTOPEND標(biāo)識(shí)符常數(shù)(整)=+*,()1234567891011121314$DIM$IF$DO$STOP$END$ID$INT$ASSIGN$PLUS$STAR$POWER$COMMA$LPAR$RPAR-內(nèi)部字符串標(biāo)準(zhǔn)二進(jìn)形式-對(duì)于這個(gè)小語(yǔ)言,有幾點(diǎn)重要的限制:首先,所有的關(guān)鍵字(如IFWHILE等)都是“保留字”。所謂的保留字的意思是,用戶(hù)

28、不得使用它們作為自己定義的標(biāo)示符。例如,下面的寫(xiě)法是絕對(duì)禁止的: IF(5)=x 其次,由于把關(guān)鍵字作為保留字,故可以把關(guān)鍵字作為一類(lèi)特殊標(biāo)示符來(lái)處理。也就是說(shuō),對(duì)于關(guān)鍵字不專(zhuān)設(shè)對(duì)應(yīng)的轉(zhuǎn)換圖。但把它們(及其種別編碼)預(yù)先安排在一張表格中(此表叫作保留字表)。當(dāng)轉(zhuǎn)換圖識(shí)別出一個(gè)標(biāo)識(shí)符時(shí),就去查對(duì)這張表,確定它是否為一個(gè)關(guān)鍵字。再次,如果關(guān)鍵字、標(biāo)識(shí)符和常數(shù)之間沒(méi)有確定的運(yùn)算符或界符作間隔,則必須至少用一個(gè)空白符作間隔(此時(shí),空白符不再是完全沒(méi)有意義的了)。例如,一個(gè)條件語(yǔ)句應(yīng)寫(xiě)為 IF i>0 i= 1;而絕對(duì)不要寫(xiě)成 IFi>0 i=1;因?yàn)閷?duì)于后者,我們的分析器將無(wú)條件地將IFI

29、看成一個(gè)標(biāo)識(shí)符。這個(gè)小語(yǔ)言的單詞符號(hào)的狀態(tài)轉(zhuǎn)換圖,如下圖: 2 語(yǔ)法分析器 能識(shí)別由加+ 減- 乘* 除/ 乘方 括號(hào)()操作數(shù)所組成的算術(shù)表達(dá)式,其文法如下:EE+T|E-T|TTT*F|T/F|FFPF|Pp(E)|i 使用的算法可以是:預(yù)測(cè)分析法;遞歸下降分析法;算符優(yōu)先分析法;LR分析法等。3 中間代碼生成器 產(chǎn)生上述算術(shù)表達(dá)式的中間代碼(四元式序列)三、實(shí)現(xiàn)過(guò)程說(shuō)明給出各題目的詳細(xì)算法描述,數(shù)據(jù)結(jié)構(gòu)和函數(shù)說(shuō)明,流程圖。1、詞法分析器的流程圖2、語(yǔ)法分析器主程序圖3、中間代碼生成器流程圖:四、源程序清單詞法分析器#include "stdafx.h"#include

30、 "Word.h"/構(gòu)造函數(shù),對(duì)數(shù)據(jù)成員初始化,并將關(guān)鍵字以及運(yùn)算符讀入Word:Word()/打開(kāi)關(guān)鍵字文件fstream keywordfile("keyword.txt");if(!keywordfile)cout<<"error ! can't open keywordfile!"<<endl;system("pause");exit(1);/設(shè)置臨時(shí)變量將關(guān)鍵字、符號(hào)文件中的內(nèi)容存儲(chǔ)string tempword;int tempencode;string tempre;i

31、nt tempvalue;/開(kāi)始讀關(guān)鍵字文件while(!(keywordfile.eof() keywordfile>>tempword>>tempencode>>tempre>>tempvalue;keywordlist.push_back(tempword);keywordencode.push_back(tempencode);keywordre.push_back(tempre);keywordcodevalue.push_back(tempvalue);/關(guān)閉關(guān)鍵字文件keywordfile.close();for(int i=0;i

32、<keywordlist.size();i+)cout<<setw(16)<<keywordlisti<<setw(16)<<keywordencodei<<setw(12)<<keywordrei<<setw(12)<<keywordcodevaluei<<endl;fstream signwordfile("signword.txt");if(!signwordfile) cout<<"error ! can't open si

33、gnwordfile!"<<endl;system("pause");exit(1);/開(kāi)始讀符號(hào)文件while(!(signwordfile.eof()signwordfile>>tempword>>tempencode>>tempre>>tempvalue;signlist.push_back(tempword);signencode.push_back(tempencode);signre.push_back(tempre);signcodevalue.push_back(tempvalue);/關(guān)

34、閉符號(hào)文件signwordfile.close();for(int i=0;i<signlist.size();i+)cout<<setw(16)<<signlisti<<setw(16)<<signencodei<<setw(12)<<signrei<<setw(12)<<signcodevaluei<<endl;/將token中的字符串與character中的字符連接作為token中新的字符串void Word:concatentation()for(int i=0;i<

35、100;i+)if(tokeni=NULL)tokeni=s;break;/判斷character中的字符是否為字母和數(shù)字的布爾函數(shù),是則返回true,否則返回falsebool Word:letter() if(s<='z' && s>='a' )return true;else if(s<='Z' && s>='A')return true;elsereturn false;bool Word:digit() if(s<='9' &&

36、 s>='0')return true;return false;/按token數(shù)組中的字符串中的前五項(xiàng)(即判別其是否為保留字),若是保留字則返回它的編碼int Word:reserve()int leng;/記錄token數(shù)組中單詞的長(zhǎng)度f(wàn)or(int i=0;i<100;i+)/計(jì)算token數(shù)組中單詞的長(zhǎng)度if(tokeni=NULL)leng=i;break;for(int i=0;i<keywordlist.size();i+)for(int j=0;j<keywordlisti.length();j+)if(keywordlistij!=to

37、kenj)/若某個(gè)字符不等則終止此次循環(huán)break;if(j+1=keywordlisti.length()/若比較字符全部相等,則判斷兩者是否長(zhǎng)度相等if(leng=keywordlisti.length()return i+1;elsereturn 0;return 0;/將標(biāo)識(shí)符登錄到符號(hào)表中或?qū)⒊?shù)登錄到常數(shù)表中void Word:buildlist()/設(shè)置臨時(shí)變量將標(biāo)識(shí)符的助記符保存string tempword;int tempencode;string tempre;/標(biāo)識(shí)符助記int tempvalue;int tempconstre;/常數(shù)助記s=token0;if(let

38、ter()/第一個(gè)字符如果為字母,則將標(biāo)識(shí)符登錄到符號(hào)表中 fstream chartostring("convert.txt");if(!chartostring)cout<<"Error! Can't open convert file"<<endl;system("pause");for(int i=0;i<100;i+)if(tokeni=NULL)break;elsechartostring<<tokeni;chartostring<<endl;chartostr

39、ing.close();chartostring.open("convert.txt");if(!chartostring)cout<<"Error! Can't open convert file"<<endl;system("pause");chartostring>>tempre;chartostring.close();indentityre.push_back(tempre);tempword="標(biāo)識(shí)符"tempencode=6;tempvalue=indent

40、ityre.size();indentitylist.push_back(tempword);indentityencode.push_back(tempencode);indentitycodevalue.push_back(tempvalue);fstream indentityfile("indentityword.txt");if(!indentityfile) cout<<"Error! Can't open indentityword file"<<endl;system("pause");

41、/先將文件指針移到最后去,再寫(xiě)入一個(gè)endlindentityfile.seekg(0,ios:end);indentityfile<<tempword<<setw(8)<<tempencode<<setw(12)<<tempre<<setw(12)<<tempvalue;indentityfile.seekg(0,ios:end);indentityfile<<endl;indentityfile.close();else/token中存儲(chǔ)的是常數(shù)/將token中的字符數(shù)字轉(zhuǎn)換為int類(lèi)型fstr

42、eam chartoint("convert.txt");if(!chartoint)cout<<"Error! Can't open convert file"<<endl;system("pause");for(int i=0;i<100;i+) if(tokeni=NULL)break;elsechartoint<<tokeni;chartoint<<endl;chartoint.close();chartoint.open("convert.txt&quo

43、t;);if(!chartoint) cout<<"Error! Can't open convert file"<<endl;system("pause");exit(1);chartoint>>tempconstre;chartoint.close();constlist.push_back(tempword);tempword="常數(shù)"tempencode=7;tempvalue=indentityre.size();constencode.push_back(tempencode);

44、constre.push_back(tempconstre);constvalue.push_back(tempvalue);fstream constdigit("constdigit.txt");if(!constdigit)cout<<"Error! Can't open constdigit file!"<<endl;system("pause");exit(1);/先將文件指針移到最后去,再寫(xiě)入一個(gè)endlconstdigit.seekg(0,ios:end);constdigit<&l

45、t;tempword<<setw(8)<<tempencode<<setw(12)<<tempconstre<<setw(12)<<tempvalue;constdigit.seekg(0,ios:end);constdigit<<endl;constdigit.close();cout<<setw(16)<<tempword<<setw(16)<<tempencode<<setw(12)<<tempconstre<<setw(

46、12)<<tempvalue<<endl;/出現(xiàn)非法字符,顯示錯(cuò)誤信息void Word:error()cout<<"Error! Error word!"<<endl;system("pause");void Word:signinfor()/按token數(shù)組中的字符串中的前五項(xiàng)(即判別其是否為保留字),若是保留字則返回它的編碼int leng;/記錄token數(shù)組中單詞的長(zhǎng)度f(wàn)or(int i=0;i<100;i+)/計(jì)算token數(shù)組中單詞的長(zhǎng)度if(tokeni=NULL)leng=i;bre

47、ak;for(int i=0;i<signlist.size();i+)for(int j=0;j<signlisti.length();j+)if(signlistij!=tokenj)/若某個(gè)字符不等則終止此次循環(huán)break;if(j+1=signlisti.length()/若比較字符全部相等,則判斷兩者是否長(zhǎng)度相等if(leng=signlisti.length()cout<<setw(16)<<signlisti<<setw(16)<<signencodei<<setw(12)<<signrei<

48、;<setw(12)<<signcodevaluei<<endl;/詞法分析的函數(shù)void Word:run()cout<<setw(16)<<"單詞符號(hào)"<<setw(16)<<"種別編碼"<<setw(12)<<"助記符"<<setw(12)<<"內(nèi)碼值"<<endl;fstream file("word.txt");if(!file)cout<&l

49、t;"error,can't open file"<<endl;system("pause");exit(1);file.unsetf(ios:skipws);while(s!='#' && !file.eof()for(int i=0;i<100;i+)tokeni=NULL;file>>s;while(s=' ')file>>s;switch(s)case 'a'case 'b':case 'c':case

50、 'd':case 'e':case 'f':case 'g':case 'h':case 'i':case 'j':case 'k':case 'l':case 'm':case 'n':case 'o':case 'p':case 'q':case 'r':case 's':case 't':case 'u'

51、;:case 'v':case 'w':case 'x':case 'y':case 'z':while(letter()|digit()concatentation();/將當(dāng)前讀入的字符送入token數(shù)組file>>s;/繼續(xù)讀字符,直到字符不為數(shù)字或字母為止/掃描指針回退一個(gè)字符file.seekg(-1,ios:cur);code=reserve();if(!code)buildlist();elsecout<<setw(16)<<keywordlistcode-1<

52、;<setw(16)<<keywordencodecode-1<<setw(12)<<keywordrecode-1<<setw(12)<<keywordcodevaluecode-1<<endl;break;case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':while(digit()concatentation();/將當(dāng)前讀入的字符送入token數(shù)組file>>s;/繼續(xù)讀字符,直到字符不為數(shù)字為止/掃描指針回退一個(gè)字符file.seekg(-1,ios:cur);buildlist();break;case '+':concatentation();signinfor();break;case '-':concatentation();s

溫馨提示

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