天津理工大学编译原理实验3:语义分析与中间代码生成(共16页)

上传人:20022****wzdgj 文档编号:42927561 上传时间:2021-11-29 格式:DOC 页数:16 大小:370.50KB
收藏 版权申诉 举报 下载
天津理工大学编译原理实验3:语义分析与中间代码生成(共16页)_第1页
第1页 / 共16页
天津理工大学编译原理实验3:语义分析与中间代码生成(共16页)_第2页
第2页 / 共16页
天津理工大学编译原理实验3:语义分析与中间代码生成(共16页)_第3页
第3页 / 共16页
资源描述:

《天津理工大学编译原理实验3:语义分析与中间代码生成(共16页)》由会员分享,可在线阅读,更多相关《天津理工大学编译原理实验3:语义分析与中间代码生成(共16页)(16页珍藏版)》请在装配图网上搜索。

1、精选优质文档-倾情为你奉上实验报告学院(系)名称:计算机与通信工程学院姓名学号专业班级实验项目实验三:语义分析与中间代码生成课程名称编译原理课程代码实验时间实验地点计算机软件实验室7-220计算机软件实验室7-215批改意见成绩教师签字: 实验内容:可选择LL1分析法、算符优先分析法、LR分析法之一,实现如下表达式文法的语法制导翻译过程。文法GE如下所示:EE+T | E-T | TTT*F | T/F | FFPF | PP(E) | i要求构造出符合语义分析要求的属性文法描述,并在完成实验二(语法分析)的基础上,进行语义分析程序设计,最终输出与测试用例等价的四元式中间代码序列。实验目的:1

2、掌握语法制导翻译的基本功能。2巩固对语义分析的基本功能和原理的认识。3能够基于语法制导翻译的知识进行语义分析。4掌握类高级语言中基本语句所对应的语义动作。5理解并处理语义分析中的异常和错误。实验要求:1在实验二的基础上,实现语法制导翻译功能,输出翻译后所得四元式序列;2要求详细描述所选分析方法进行制导翻译的设计过程;3完成对所设计分析器的功能测试,并给出测试数据和实验结果;4为增加程序可读性,请在程序中进行适当注释说明;5整理上机步骤,总结经验和体会;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状态 "<<sx<<" 进状态栈 "else if(x=1)cout<<" 状态 "<<sx<<" 进状态栈 "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"/.本程序暂时用到这么多,等有时间编写合适的可以将数字转换为字符串的函数时,即可更改本函数 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);/显示状态栈 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规约该表达式,有效变量在E的endchar中,需要找到E的位置,即下面的操作 string st=stackpo.endchar;/对应

35、F po-=2;string se=stackpo.endchar;/在规约之前记录下要规约的字符所代表的变量。对应 T tsize+;/新增临时变量 ttsize.num=tsize+1;/下面四个表达式是按照上面的规约式进行的赋值 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规约且" 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规约的结果的变量保存至当前字符的终结符 else if(production="r2")int po=(*pointer);/用P规约该表达式,有效变量在E的endchar中,需要找到E的位置,即下面的操作 string st=stackpo.endchar;/对

38、应 T po-=2;string se=stackpo.endchar;/在规约之前记录下要规约的字符所代表的变量。对应 E tsize+;/新增临时变量 ttsize.num=tsize+1;/下面四个表达式是按照上面的规约式进行的赋值 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规约且" 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规约的结果的变量保存至当前字符的终结符 else if(production="r3")string s=stack(*pointer).endchar;/在规约之前记录下要规约的字符所代表的变量 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规约且" 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;/将记录下的变量赋值给规约后的字符else if(production="r4") int po=(*pointer);/用P规约该表达式,有效变量在E的endchar中,需要找到E的位置,即下面的操作 string sf=stackpo.endchar;/对应 F po-=2;string st=stackpo.endchar;/在规约之前记录下要规约的字符所代表的变量。对应 T tsize+;/新增临时变量 ttsize.num=tsize+1;/下面四个表达式是按照上面的规约式进行的赋值 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规约且" 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规约的结果的变量保存至当前字符的终结符 else if(production="r5")int po=(*pointer);/用P规约该表达式,有效变量在E的endchar中,需要找到E的位置,即下面的操作 string sf=stackpo.endchar;/对应 F po-=2;string st=stackpo.endchar;/在规约之前记录下要规约的字符所代表的变量。对应 T tsize+;/新增临时变量 ttsize.num=tsize+1;/下面四个表达式是按照上面的规约式进行的赋值 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规约且" 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规约的结果的变量保存至当前字符的终结符 else if(production="r6")string s=stack(*pointer).endchar;/在规约之前记录下要规约的字符所代表的变量 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规约且" 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;/将记录下的变量赋值给规约后的字符else if(production="r7")int po=(*pointer);/用P规约该表达式,有效变量在E的endchar中,需要找到E的位置,

50、即下面的操作 string sf=stackpo.endchar;/对应 F po-=2;string sp=stackpo.endchar;/在规约之前记录下要规约的字符所代表的变量。对应 P tsize+;/新增临时变量 ttsize.num=tsize+1;/下面四个表达式是按照上面的规约式进行的赋值 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规约且" 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规约的结果的变量保存至当前字符的终结符 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规约且" string s=stack(*pointer).endchar;/在规约之前记录下要规约的字符所代表的变量 popstack(state_stack,pointer_state,1);popstackc(stack,pointer,1);char c='F'/str(*index);pushstack(stack,pointer,sta

54、te_stack,pointer_state,c,c_out,1);stack(*pointer).endchar=s;/将记录下的变量赋值给规约后的字符 else if(production="r9") int p=(*pointer_state);p-=3;char second=state_stackp;int i=getraw(second);int j=getcol('P');char c_out=getraw_content(tableij);cout<<"tttr9:用P->(E)规约且" int po=(

55、*pointer);/用P规约该表达式,有效变量在E的endchar中,需要找到E的位置,即下面的操作 po-;string s=stackpo.endchar;/在规约之前记录下要规约的字符所代表的变量popstack(state_stack,pointer_state,3);popstackc(stack,pointer,3);char c='P'/str(*index);pushstack(stack,pointer,state_stack,pointer_state,c,c_out,1);stack(*pointer).endchar=s;/将记录下的变量赋值给规约后的

56、字符 else if(production="r10") int p=(*pointer_state);p-;char second=state_stackp;int i=getraw(second);int j=getcol('P');char c_out=getraw_content(tableij);cout<<"tttr10:用P->i规约且" popstack(state_stack,pointer_state,1);popstackc(stack,pointer,1);char c='P'/s

57、tr(*index);pushstack(stack,pointer,state_stack,pointer_state,c,c_out,1);stack(*pointer).endchar="i"else if(production="acc") cout<<"tttacc, 分析成功" (*index)+;int main()char strsize;/接受字符串的数组 char_stack stacksize;/进行比对的栈 int pointer=-1;/指向栈顶的指针 int length=0;/记录字符串长度

58、int index=0;/记录输入字符串 char top;char state_stacksize;/状态栈 int pointer_state=-1;/状态栈指针 int i,j;/i表示行,j表示列 string production;bool match=false;cout<<"Please input character string: "cin>>str;length=getLength(str);strlength='#'strlength+1='0'pointer+;stackpointer.cont

59、ent='#'pointer_state+;state_stackpointer_state='0'cout<<"步骤t状态栈t符号栈t当前符号t输入串t四元式tt说明"<<endl; while(strindex!='0')top=gettop(state_stack,pointer_state);/获取状态栈栈顶元素 i=getraw(top);j=getcol(strindex);production=tableij;switch_method(stack,&pointer,state_stack,&pointer_state,production,str,&index);return 0;上面的运行结果是根据文法产生的下面的语法树的语句专心-专注-专业

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!