天津理工大學編譯原理實驗3:語義分析與中間代碼生成(共16頁)_第1頁
天津理工大學編譯原理實驗3:語義分析與中間代碼生成(共16頁)_第2頁
天津理工大學編譯原理實驗3:語義分析與中間代碼生成(共16頁)_第3頁
天津理工大學編譯原理實驗3:語義分析與中間代碼生成(共16頁)_第4頁
天津理工大學編譯原理實驗3:語義分析與中間代碼生成(共16頁)_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上實驗報告學院(系)名稱:計算機與通信工程學院姓名學號專業(yè)班級實驗項目實驗三:語義分析與中間代碼生成課程名稱編譯原理課程代碼實驗時間實驗地點計算機軟件實驗室7-220計算機軟件實驗室7-215批改意見成績教師簽字: 實驗內(nèi)容:可選擇LL1分析法、算符優(yōu)先分析法、LR分析法之一,實現(xiàn)如下表達式文法的語法制導翻譯過程。文法GE如下所示:EE+T | E-T | TTT*F | T/F | FFPF | PP(E) | i要求構造出符合語義分析要求的屬性文法描述,并在完成實驗二(語法分析)的基礎上,進行語義分析程序設計,最終輸出與測試用例等價的四元式中間代碼序列。實驗目的:1

2、掌握語法制導翻譯的基本功能。2鞏固對語義分析的基本功能和原理的認識。3能夠基于語法制導翻譯的知識進行語義分析。4掌握類高級語言中基本語句所對應的語義動作。5理解并處理語義分析中的異常和錯誤。實驗要求:1在實驗二的基礎上,實現(xiàn)語法制導翻譯功能,輸出翻譯后所得四元式序列;2要求詳細描述所選分析方法進行制導翻譯的設計過程;3完成對所設計分析器的功能測試,并給出測試數(shù)據(jù)和實驗結果;4為增加程序可讀性,請在程序中進行適當注釋說明;5整理上機步驟,總結經(jīng)驗和體會;6認真完成并按時提交實驗報告。【實驗過程記錄(源程序、測試用例、測試結果及心得體會等)】#include<iostream>#inc

3、lude<cstring>#define size 1024using namespace std;int step=0;typedef struct variable_Tchar operate;/操作符 string var1;/變量 1 string var2;/變量 2 int num;/第幾個變量 variable_T;variable_T tsize;/記錄四元式變量的變量 int tsize=-1;/表示是第tsize+1個變量typedef struct char_stackchar content;/當前字符 string endchar;/這個符號代表的中間變量

4、 可以是 i, 也可以是 t1, t2, 等等 int num;/和該字符相關的中間變量的序號 char_stack;string table1913=/ + - * / ) # ( i E T F P /* 0 */ "err","err","err","err","err","err","err", "s5", "s6", "1", "2", "3",

5、"4",/* 1 */ "s7", "s8","err","err","err","err","acc","err","err","err","err","err","err",/* 2 */ "r3", "r3", "s9","s10",

6、"err", "r3", "r3","err","err","err","err","err","err",/* 3 */ "r6", "r6", "r6", "r6","err", "r6", "r6","err","err","

7、;err","err","err","err",/* 4 */ "r8", "r8", "r8", "r8","s11", "r8", "r8","err","err","err","err","err","err",/* 5 */ "err",&q

8、uot;err","err","err","err","err","err", "s5", "s6", "c", "2", "3", "4",/* 6 */ "r10","r10","r10","r10","r10","r10","r10&

9、quot;,"err","err","err","err","err","err",/* 7 */ "err","err","err","err","err","err","err", "s5", "s6","err", "d", "3",

10、 "4",/* 8 */ "err","err","err","err","err","err","err", "s5", "s6","err", "e", "3", "4",/* 9 */ "err","err","err","err",

11、"err","err","err", "s5", "s6","err","err", "f", "4",/* 10*/ "err","err","err","err","err","err","err", "s5", "s6","

12、err","err", "g", "4",/* 11*/ "err","err","err","err","err","err","err", "s5", "s6","err","err", "h", "4",/* 12*/ "s7", "

13、s8","err","err","err","s18","err","err","err","err","err","err","err",/* 13*/ "r1", "r1", "s9","s10","err", "r1", "r1&qu

14、ot;,"err","err","err","err","err","err",/* 14*/ "r2", "r2", "s9","s10","err", "r2", "r2","err","err","err","err","err",&

15、quot;err",/* 15*/ "r4", "r4", "r4", "r4","err", "r4", "r4","err","err","err","err","err","err",/* 16*/ "r5", "r5", "r5", "r5"

16、,"err", "r5", "r5","err","err","err","err","err","err",/* 17*/ "r7", "r7", "r7", "r7","err", "r7", "r7","err","err",&quo

17、t;err","err","err","err",/* 18*/ "r9", "r9", "r9", "r9", "r9", "r9", "r9","err","err","err","err","err","err"int getLength(char strsize

18、)int i=0;while(stri!='0')i+;return i; int getLengthc(char_stack strsize)int i=0;while(stri.content!='0')i+;return i; int getstringLength(string str)int i=0;while(stri!='0')i+;return i; char gettop(char stacksize,int top)if(stacktop!='0')return stacktop;elsereturn '

19、;#'void popstack(char *stack,int *pointer,int times)int p;for(int i=1;i<=times;i+)p=*pointer;stackp='0'(*pointer)-;void popstackc(char_stack *stack,int *pointer,int times)int p;for(int i=1;i<=times;i+)p=*pointer;stackp.content='0'(*pointer)-;void pushstack(char_stack *stack

20、,int *pointer,char *stack_state,int *pointer_state,char str,char sx,int x)int i=0;if(x=0)cout<<"ttt狀態(tài) "<<sx<<" 進狀態(tài)棧 "else if(x=1)cout<<" 狀態(tài) "<<sx<<" 進狀態(tài)棧 "if(str!='#')cout<<str<<" 進字符棧"(*pointer

21、)+;stack(*pointer).content=str;(*pointer_state)+;stack_state(*pointer_state)=sx;int getcol(char top)switch(top)case '+':return 0;case '-':return 1;case '*':return 2;case '/':return 3;case '':return 4;case ')':return 5;case '#':return 6;case 

22、9;(':return 7;case 'i':return 8;case 'E':return 9;case 'T':return 10;case 'F':return 11;case 'P':return 12;default:cout<<"Error! This character string is not this grammers sentence."<<endl;return -1;int getraw(char raw)switch(raw)case

23、 '0':return 0;case '1':return 1;case '2':return 2;case '3':return 3;case '4':return 4;case '5':return 5;case '6':return 6;case '7':return 7;case '8':return 8;case '9':return 9;case 'a':return 10;case 'b':

24、return 11;case 'c':return 12;case 'd':return 13;case 'e':return 14;case 'f':return 15;case 'g':return 16;case 'h':return 17;case 'i':return 18;default:cout<<"Error! This character string is not this grammers sentence."<<en

25、dl;return -1;char getraw_content(string str)if(str="1")return '1'else if(str="2")return '2'else if(str="3")return '3'else if(str="4")return '4'else if(str="c")return 'c'else if(str="d")return 'd&#

26、39;else if(str="e")return 'e'else if(str="f")return 'f'else if(str="g")return 'g'else if(str="h")return 'h'else if(str="i")return 'i'string get_tx(int num)switch(num)case 1:return "t1"case 2:return &q

27、uot;t2"case 3:return "t3"case 4:return "t4"case 5:return "t5"case 6:return "t6"case 7:return "t7"case 8:return "t8"case 9:return "t9"case 10:return "t10"case 11:return "t11"case 12:return "t12"ca

28、se 13:return "t13"case 14:return "t14"case 15:return "t15"case 16:return "t16"/.本程序暫時用到這么多,等有時間編寫合適的可以將數(shù)字轉(zhuǎn)換為字符串的函數(shù)時,即可更改本函數(shù) void show(char strsize,int index)int length=getLength(str);if(index!=-1)cout<<"t"for(int i=index+1;i<length;i+)cout&l

29、t;<stri;void showc(char_stack strsize,int index)int length=getLengthc(str);if(index!=-1)cout<<"t"for(int i=index+1;i<length;i+)cout<<stri.content;void switch_method(char_stack *stack,int *pointer,char *state_stack,int *pointer_state,string production,char *str,int *index)

30、step+;cout<<"n"<<step<<"t"/顯示步驟 show(state_stack,-1);/顯示狀態(tài)棧 cout<<"t"showc(stack,-1);/顯示符號站 cout<<"t"<<str(*index)<<"t"/顯示當前字符 show(str,(*index);/顯示輸入串 char c=str(*index);if(production="err")cout<

31、;<"Error! This character string is not this grammers sentence."<<endl;return ;else if(production="s5")char sx='5'(*index)+;pushstack(stack,pointer,state_stack,pointer_state,c,sx,0);else if(production="s6") char sx='6'(*index)+;pushstack(stack,po

32、inter,state_stack,pointer_state,c,sx,0);else if(production="s7") char sx='7'(*index)+;pushstack(stack,pointer,state_stack,pointer_state,c,sx,0);else if(production="s8") char sx='8'(*index)+;pushstack(stack,pointer,state_stack,pointer_state,c,sx,0);else if(producti

33、on="s9") char sx='9'(*index)+;pushstack(stack,pointer,state_stack,pointer_state,c,sx,0);else if(production="s10") char sx='a'(*index)+;pushstack(stack,pointer,state_stack,pointer_state,c,sx,0);else if(production="s11") char sx='b'(*index)+;pushst

34、ack(stack,pointer,state_stack,pointer_state,c,sx,0);else if(production="s18") char sx='i'(*index)+;pushstack(stack,pointer,state_stack,pointer_state,c,sx,0);else if(production="r1") int po=(*pointer);/用P規(guī)約該表達式,有效變量在E的endchar中,需要找到E的位置,即下面的操作 string st=stackpo.endchar;/對應

35、F po-=2;string se=stackpo.endchar;/在規(guī)約之前記錄下要規(guī)約的字符所代表的變量。對應 T tsize+;/新增臨時變量 ttsize.num=tsize+1;/下面四個表達式是按照上面的規(guī)約式進行的賦值 ttsize.operate='+'ttsize.var1=se;ttsize.var2=st;cout<<"t("<<ttsize.operate<<","<<ttsize.var1<<","<<ttsize.va

36、r2<<",t"<<ttsize.num<<")"int p=(*pointer_state);p-=3;char second=state_stackp;int i=getraw(second);int j=getcol('E');char c_out=getraw_content(tableij);cout<<"tr1:用E->E+T規(guī)約且" popstack(state_stack,pointer_state,3);popstackc(stack,pointe

37、r,3);char c='E'/str(*index);pushstack(stack,pointer,state_stack,pointer_state,c,c_out,1);string s=get_tx(ttsize.num);stack(*pointer).endchar=s;/把保存E+T規(guī)約的結果的變量保存至當前字符的終結符 else if(production="r2")int po=(*pointer);/用P規(guī)約該表達式,有效變量在E的endchar中,需要找到E的位置,即下面的操作 string st=stackpo.endchar;/對

38、應 T po-=2;string se=stackpo.endchar;/在規(guī)約之前記錄下要規(guī)約的字符所代表的變量。對應 E tsize+;/新增臨時變量 ttsize.num=tsize+1;/下面四個表達式是按照上面的規(guī)約式進行的賦值 ttsize.operate='-'ttsize.var1=se;ttsize.var2=st;cout<<"t("<<ttsize.operate<<","<<ttsize.var1<<","<<ttsize.

39、var2<<",t"<<ttsize.num<<")"int p=(*pointer_state);p-=3;char second=state_stackp;int i=getraw(second);int j=getcol('E');char c_out=getraw_content(tableij);cout<<"tr2:用E->E-T規(guī)約且" popstack(state_stack,pointer_state,3);popstackc(stack,poin

40、ter,3);char c='E'/str(*index);pushstack(stack,pointer,state_stack,pointer_state,c,c_out,1);string s=get_tx(ttsize.num);stack(*pointer).endchar=s;/把保存E-T規(guī)約的結果的變量保存至當前字符的終結符 else if(production="r3")string s=stack(*pointer).endchar;/在規(guī)約之前記錄下要規(guī)約的字符所代表的變量 int p=(*pointer_state);p-;char

41、second=state_stackp;int i=getraw(second);int j=getcol('E');char c_out=getraw_content(tableij);cout<<"tttr3:用E->T規(guī)約且" popstack(state_stack,pointer_state,1);popstackc(stack,pointer,1);char c='E'/str(*index);pushstack(stack,pointer,state_stack,pointer_state,c,c_out,1)

42、;stack(*pointer).endchar=s;/將記錄下的變量賦值給規(guī)約后的字符else if(production="r4") int po=(*pointer);/用P規(guī)約該表達式,有效變量在E的endchar中,需要找到E的位置,即下面的操作 string sf=stackpo.endchar;/對應 F po-=2;string st=stackpo.endchar;/在規(guī)約之前記錄下要規(guī)約的字符所代表的變量。對應 T tsize+;/新增臨時變量 ttsize.num=tsize+1;/下面四個表達式是按照上面的規(guī)約式進行的賦值 ttsize.operat

43、e='*'ttsize.var1=st;ttsize.var2=sf;cout<<"t("<<ttsize.operate<<","<<ttsize.var1<<","<<ttsize.var2<<",t"<<ttsize.num<<")"int p=(*pointer_state);p-=3;char second=state_stackp;int i=getraw(se

44、cond);int j=getcol('T');char c_out=getraw_content(tableij);cout<<"tr4:用T->T*F規(guī)約且" popstack(state_stack,pointer_state,3);popstackc(stack,pointer,3);char c='T'/str(*index);pushstack(stack,pointer,state_stack,pointer_state,c,c_out,1);string s=get_tx(ttsize.num);stack(

45、*pointer).endchar=s;/把保存T*F規(guī)約的結果的變量保存至當前字符的終結符 else if(production="r5")int po=(*pointer);/用P規(guī)約該表達式,有效變量在E的endchar中,需要找到E的位置,即下面的操作 string sf=stackpo.endchar;/對應 F po-=2;string st=stackpo.endchar;/在規(guī)約之前記錄下要規(guī)約的字符所代表的變量。對應 T tsize+;/新增臨時變量 ttsize.num=tsize+1;/下面四個表達式是按照上面的規(guī)約式進行的賦值 ttsize.oper

46、ate='/'ttsize.var1=st;ttsize.var2=sf;cout<<"t("<<ttsize.operate<<","<<ttsize.var1<<","<<ttsize.var2<<",t"<<ttsize.num<<")"int p=(*pointer_state);p-=3;char second=state_stackp;int i=getraw(

47、second);int j=getcol('T');char c_out=getraw_content(tableij);cout<<"tr5:用T->T/F規(guī)約且" popstack(state_stack,pointer_state,3);popstackc(stack,pointer,3);char c='T'/str(*index);pushstack(stack,pointer,state_stack,pointer_state,c,c_out,1);string s=get_tx(ttsize.num);stac

48、k(*pointer).endchar=s;/把保存T/F規(guī)約的結果的變量保存至當前字符的終結符 else if(production="r6")string s=stack(*pointer).endchar;/在規(guī)約之前記錄下要規(guī)約的字符所代表的變量 int p=(*pointer_state);p-;char second=state_stackp;int i=getraw(second);int j=getcol('T');char c_out=getraw_content(tableij);cout<<"tttr6:用T-&g

49、t;F規(guī)約且" popstack(state_stack,pointer_state,1);popstackc(stack,pointer,1);char c='T'/str(*index);pushstack(stack,pointer,state_stack,pointer_state,c,c_out,1);stack(*pointer).endchar=s;/將記錄下的變量賦值給規(guī)約后的字符else if(production="r7")int po=(*pointer);/用P規(guī)約該表達式,有效變量在E的endchar中,需要找到E的位置,

50、即下面的操作 string sf=stackpo.endchar;/對應 F po-=2;string sp=stackpo.endchar;/在規(guī)約之前記錄下要規(guī)約的字符所代表的變量。對應 P tsize+;/新增臨時變量 ttsize.num=tsize+1;/下面四個表達式是按照上面的規(guī)約式進行的賦值 ttsize.operate=''ttsize.var1=sp;ttsize.var2=sf;cout<<"t("<<ttsize.operate<<","<<ttsize.var1&l

51、t;<","<<ttsize.var2<<",t"<<ttsize.num<<")"int p=(*pointer_state);p-=3;char second=state_stackp;int i=getraw(second);int j=getcol('F');char c_out=getraw_content(tableij);cout<<"tr7:用F->PF規(guī)約且" popstack(state_stack,poin

52、ter_state,3);popstackc(stack,pointer,3);char c='F'/str(*index);pushstack(stack,pointer,state_stack,pointer_state,c,c_out,1);string s=get_tx(ttsize.num);stack(*pointer).endchar=s;/把保存PF規(guī)約的結果的變量保存至當前字符的終結符 else if(production="r8") int p=(*pointer_state);p-;char second=state_stackp;in

53、t i=getraw(second);int j=getcol('F');char c_out=getraw_content(tableij);cout<<"tttr8:用F->P規(guī)約且" string s=stack(*pointer).endchar;/在規(guī)約之前記錄下要規(guī)約的字符所代表的變量 popstack(state_stack,pointer_state,1);popstackc(stack,pointer,1);char c='F'/str(*index);pushstack(stack,pointer,state_stack,pointer_state,c,c_out,1);stack(*pointer).endchar=s;/將記錄下的變量賦值給規(guī)約后的字符 else if(production="r9")

溫馨提示

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

評論

0/150

提交評論