編譯原理詞法分析報告_第1頁
編譯原理詞法分析報告_第2頁
編譯原理詞法分析報告_第3頁
編譯原理詞法分析報告_第4頁
編譯原理詞法分析報告_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、精選優(yōu)質文檔-傾情為你奉上 年 月 日專心-專注-專業(yè)1、 實驗目的1、為初等函數運算語言構造詞法分析器。2、掌握生成詞法分析器的方法,加深對詞法分析原理的理解。3、掌握設計、編制并調試詞法分析程序的思想和方法2、實驗內容一、根據下面的要求設計初等函數運算語言的詞法模式,并用正則式表達出來1、 初等函數運算語言的常量為實數類型,其定義方式為實數的最一般書寫方式,如:123.321。具體要求:不支持整數部分大于0時首數字為0;不支持小數點后結尾為0;不支持科學記數法;不支持僅為整數時有小數點;支持負數符號,不支持正數符號。2、 初等函數運算語言的變量采用與C語言的標識符定義一樣的方式:首字符為字

2、母或下劃線;其他的為字母、數字及下劃線的混合串;區(qū)分大小寫;變量長度不超過32個字符。3、 初等函數運算語言需要處理的函數僅為表一中所列舉的內容。函數的格式及參數內容也如表一所示。4、 初等函數運算語言支持四則運算,其計算的符號與C語言相同,為:+-*/。5、 初等函數運算語言的合法的分隔符包括:空格、制表符、分行符圓括號(左、右)、分號。其中空格、制表符、分行符可以出現(xiàn)在任何兩個不同的單詞中間;圓括號(左、右)用于表達式中,用于改變運算的優(yōu)先級,以及標識函數的參數;分號用于標識一個語句的結束。6、 初等函數運算語言支持的常量還包括:PI,E。其中,PI為圓周率,E為自然常數。二、將正則式轉化

3、為最小DFA,給出該DFA的形式化表示和圖形表示。三、根據DFA給出狀態(tài)轉換表。四、給出初等函數運算語言的記號表,即詞法分析中,語言中的記號將分為多少類,每一類型的編碼、類型、屬性等內容是什么。五、編寫詞法分析器,將輸入的字符串轉化成為記號流,便于后續(xù)的語法分析工作。要求詞法分析器中能夠識別詞法錯誤。2.1詞法模式設計/正則式分隔符:compart=t|n|(|)|;|空格運算符:operation=+|-|*|/|=|變量:variable=azAZ( azAZ_09)*常量:constant=(|-)(0|(19)(09)*)(.(09)*(19)|)|PI|E2.2DFA注:id表示字母

4、,num表示數字2.3狀態(tài)轉換表id01-9下劃線減號小數點01341281111198283488838888964844896686788878678988888888注:0是初態(tài),2,6是中間狀態(tài),1,3,4,7是終態(tài),其中1表示標示符,3,4,7是實數,8表示不合法的狀態(tài),9表示'-'為減號2.4記號表符號SinCostgctgloglgln();?+記號01234567891011符號-*/=常量變量無法識別的標示符,記號12131415161718192021223、 實驗程序清單#include <iostream>#include<string

5、>using namespace std;#define max 10 char ch =' 'string key7="sin","cos","tg","ctg","log","lg","ln"/關鍵字char compart6='t','n','(',')','',' '/分隔符char operation5='+',&

6、#39;-','*','/','='/運算符/int s8=0,1,2,3,4,6,7,8;/狀態(tài)集合,0是初態(tài),2,6是中間狀態(tài),1,3,4,7是終態(tài), 其中1表示標示符,3,4,7是實數,8表示不合法的狀態(tài) int token23=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22;/0表示sin,1表示cos,2表示tg,3表示ctg,4表示log,5表示lg,6表示ln,7表示(,8表示),9表示;,10表示?,11表示+,12表示-,13表示*,14表示/,15表

7、示=,/16表示常量,17表示變量,18表示不可識別標示符,19表示,20表示逗號,21表示,22表示char arr32; int state=0;int s=0;bool tag=0;/tag=0表示'-'為負數的負號,tag=1表示'-'為減號FILE *fp;int IsKey(string c) /判斷是否為關鍵字 for(int i=0;i<7;i+) if(pare(c)=0) return i;/返回下標,下標和其token記號一致 return -1;bool IsLetter(char c) /判斷是否為字母 if(c&

8、lt;='z')&&(c>='a')|(c<='Z')&&(c>='A') return 1; else return 0;bool IsNum(char c) /判斷是否為1-9的數字 if(c>='1'&&c<='9') return 1; else return 0;bool IsUnderline(char c) /判斷是否為下劃線if(c='_')return 1;elsereturn 0;voi

9、d move(char ch,int s)/在狀態(tài)s接收字符ch后,移動的新狀態(tài)/arr=arr+ch;switch(s)case 0:if(ch='_'|IsLetter(ch) state= 1;else if(ch='0')state=3;elseif(IsNum(ch)state=4;elseif(ch='-')state=2;elsestate=8;break;case 1:if(IsNum(ch)|ch='_'|IsLetter(ch)|ch='0')state=1;elseif(ch='-&#

10、39;) state=9;elsestate=8;break;case 2:if(ch='0')state=3;elseif(IsNum(ch)state=4;elsestate=8;break;case 3:if(ch='.')state=6;elseif(ch='-') state=9;elsestate=8;break;case 4: if(IsNum(ch)|ch='0')state=4;elseif(ch='-') state=9;elseif(ch='.') state=6;else s

11、tate=8;break;case 6: if(ch='0') state=6; else if(IsNum(ch) state=7; else state=8; break; case 7: if(ch='0') state=6; else if(IsNum(ch) state=7; else if(ch='-') state=9;elsestate=8; break; case 8: if(ch='-') state=9; else state=8; break;/switchvoid judge(char arr)if(s=

12、3|s=4|s=7)cout<<"("<<arr<<" "<<token16<<")"<<endl; /常量else if(s=1) if(!strcmp(arr,"PI")|!strcmp(arr,"E")cout<<"("<<arr<<" "<<token16<<")"<<endl; /常量

13、 else if(IsKey(arr)=-1) cout<<"("<<arr<<" "<<token17<<")"<<endl; /普通標示符 else cout<<"("<<arr<<" "<<IsKey(arr)<<")"<<endl; /關鍵字 elseif(s=9)cout<<"("<&l

14、t;arr<<" "<<token12<<")"<<endl;/減號if(s=8) cout<<"("<<arr<<" "<<token18<<")"<<endl; /不可識別標示符標示符 switch(ch) case'+': cout<<"("<<ch<<" "<<tok

15、en11<<")"<<endl;break;/運算符 case'*' : cout<<"("<<ch<<" "<<token13<<")"<<endl;break;/運算符 case'=' : cout<<"("<<ch<<" "<<token15<<")"<<

16、;endl;break;/運算符 case'/' : cout<<"("<<ch<<" "<<token14<<")"<<endl;break;/運算符case'': cout<<"("<<ch<<" "<<token19<<")"<<endl;break;/運算符 case'(' :c

17、out<<"("<<ch<<" "<<token7<<")"<<endl;break;/分隔符 case')' : cout<<"("<<ch<<" "<<token8<<")"<<endl;break;/分隔符 case'' :cout<<"("<<ch&l

18、t;<" "<<token9<<")"<<endl;break;/分隔符 case',' :cout<<"("<<ch<<" "<<token20<<")"<<endl;break;/分隔符 case'' :cout<<"("<<ch<<" "<<token21&l

19、t;<")"<<endl;break;/分隔符 case'' :cout<<"("<<ch<<" "<<token22<<")"<<endl;break;/分隔符case'?':cout<<"("<<ch<<" "<<token10<<")"<<endl;break

20、;/運算開始符case' ':case'/t':case'/n': void analyse(FILE*fp)int i=0;while(ch!='EOF') char arr32='0' while(ch!='('&&ch!=')'&&ch!=' '&&ch!='t'&&ch!='n'&&ch!=''&&ch!='&

21、#39;&&ch!=','&&ch!='?'&&ch!='-'&&ch!=''&&ch!=''&&ch!='+'&&ch!='*'&&ch!='/'&&ch!='='&&ch!='EOF') if (i<32) arri=ch; move(ch,s); s=state; i

22、+; ch=fgetc(fp); /while judge(arr); if(ch='-') char arr32='0' i=0; while(ch!='('&&ch!=')'&&ch!=' '&&ch!='t'&&ch!='n'&&ch!=''&&ch!=''&&ch!=','&&ch!='?

23、9; &&ch!=''&&ch!=''&&ch!='+'&&ch!='*'&&ch!='/'&&ch!='='&&ch!='EOF') move(ch,s); s=state; arri=ch; if(state!=9) i+; ch=fgetc(fp); else /s=9為減號時 char arr32='0' break; /while judge(ar

24、r); s=0; i=0; ch=fgetc(fp); else char arr32='0' ch=fgetc(fp); i=0; s=0; /whilevoid main() char in_fn30; FILE * fp; cout<<"請輸入源文件名(包括路徑和后綴名):" for(;) cin>>in_fn; if(fp=fopen(in_fn,"r")!=NULL)/意思是文件指針fpin在調用fopen打開文件如果失敗,則會成為一個空指針! break; /文件順利打開后,指向該流的文件指針就會被返回

25、。 else cout<<"文件路徑錯誤!請輸入源文件名(包括路徑和后綴名):" cout<<"n*分析如下*"<<endl; ch=fgetc(fp); char arr32='0' arr0=ch; / fseek(fp,-1,1); analyse(fp); fclose(fp); cout<<endl; int a; cin>>a;4、 調試過程和運行結果5、 程序的主要部分及其功能說明由DFN得到的狀態(tài)轉換程序:void move(char ch,int s)/在狀態(tài)s

26、接收字符ch后,移動的新狀態(tài)switch(s)/狀態(tài)0時,當接收到字符ch為字母或下劃線時狀態(tài)S轉移到狀態(tài)1,ch為0時轉移到狀態(tài)3,ch為1-9時轉移到狀態(tài)4,ch為-時,轉移到狀態(tài)2,否則轉移到狀態(tài)8case 0:if(ch='_'|IsLetter(ch) state= 1;else if(ch='0')state=3;elseif(IsNum(ch)state=4;elseif(ch='-')state=2;elsestate=8;break;case 1:if(IsNum(ch)|ch='_'|IsLetter(ch)|

27、ch='0')state=1;elseif(ch='-')state=9;elsestate=8;break;case 2:if(ch='0')state=3;elseif(IsNum(ch)state=4;elsestate=8;break;case 3:if(ch='.')state=6;elseif(ch='-')state=9;elsestate=8;break;case 4: if(IsNum(ch)|ch='0')state=4;elseif(ch='-')state=9

28、;elseif(ch='.') state=6;else state=8;break;case 6: if(ch='0') state=6; else if(IsNum(ch) state=7; else state=8; break; case 7: if(ch='0') state=6; else if(IsNum(ch) state=7; else if(ch='-')state=9;elsestate=8; break; case 8:state=8;/switch從文件讀字符,并進行詞法分析,當讀入的字符不為運算符和界符

29、時就往下讀,并將讀到的字符存入數組arr,當遇到運算符和界符時調用judge(arr)進行分析,輸出arr所存字符串及其屬性,當遇到-時,需要判斷它是表示減號還是表示負數的負號,主要是根據其狀態(tài)來判斷,如果輸入-后,若其狀態(tài)沒有調到狀態(tài)9,則其為負數的負號,否則為減號。主要程序如下: void analyse(FILE*fp)int i=0;while(ch!='EOF') char arr32='0' while(ch!='('&&ch!=')'&&ch!=' '&&ch!='t'&&ch!='n'&&ch!=''&&ch!=''&&ch!=','&&ch!='?'&&ch!='-'&&ch!=''&&ch!=''&&ch!='+'&&ch!='*'&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論