天津理工大学编译原理实验3:语义分析与中间代码生成_第1页
天津理工大学编译原理实验3:语义分析与中间代码生成_第2页
天津理工大学编译原理实验3:语义分析与中间代码生成_第3页
天津理工大学编译原理实验3:语义分析与中间代码生成_第4页
天津理工大学编译原理实验3:语义分析与中间代码生成_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、 掌握语法制导翻译的基本功能。2巩固对语义分析的基本功能和原理的认识。3 能够基于语法制导翻译的知识进行语义分析。4掌握类高级语言中基本语句所对应的语义动作。5理解并处理语义分析中的异常和错误。实验要求:1 在实验二的基础上,实现语法制导翻译功能,输出翻译后所得四元式序列;2 要求详细描述所选分析方法进行制导翻译的设计过程;3 完成对所设计分析器的功能测试,并给出测试数据和实验结果;4 为增加程序可读性,请在程序中进行适当注释说明;5.整理上机步骤,总结经验和体会;6 .认真完成并按时提交实验报告。第1页共16页【实验过程记录(源程序、测试用例、测试结果及心得体会等) 】#include#in

3、clude#define size 1024 using namespace std;int step=0;typedef struct variable_Tchar operate;/ 操作符string var1;/ 变量 1string var2;/ 变量 2int num;/ 第几个变量variable_T;variable_T tsize;/ 记录四元式变量的变量int tsize=-1;/ 表示是第 tsize+1 个变量typedef struct char_stackchar content;/ 当前字符stringendchar;/这个符号代表的中间变量可以是 i,也可以是t

4、1, t2,等等int num;/和该字符相关的中间变量的序号char_stack;string table1913=/F P/* 11*/* 12*/* 13*/* 14*/* 15*/* 16*/* 0 */1, 2, 3,/* 1 */err,err,err,err,err,err,err, s5, s6,s7, s8,err,err,err,err,acc,err,err,err,err,err,err,4,/* 2 */* 3 */* 4 */* 5 */* 6 */r3, r3, s9,s10,err, r3, r3,err,err,err,err,err,err,r6, r6,

5、r6, r6,err, r6, r6,err,err,err,err,err,err,r8, r8, r8, r8,s11, r8, r8,err,err,err,err,err,err, err,err,err,err,err,err,err, s5, s6,c,2,3,r10,r10,r10,r10,r10,r10,r10,err,err,err,err,err,err,4,/* 7 */* 8 */err,err,err,err,err,err,err, s5, s6,err,err,err,err,err,err,err,err, s5, s6,err,d,3,e,3,4,4,/* 9

6、 */* 10*/err,err,err,err,err,err,err, s5, s6,err,err,err,err,err,err,err,err,err, s5, s6,err,err,f,g,4,4,/* 11*/* 12*/* 13*/* 14*/* 15*/* 16*/* 11*/* 12*/* 13*/* 14*/* 15*/* 16*/h,4,err,err,err,err,err,err,err, s5, s6,err,err,s7, s8,err,err,err,s18,err,err,err,err,err,err,err, r1, r1, s9,s10,err, r1

7、, r1,err,err,err,err,err,err, r2, r2, s9,s10,err, r2, r2,err,err,err,err,err,err, r4, r4, r4, r4,err, r4, r4,err,err,err,err,err,err,r5, r5, r5, r5,err, r5, r5,err,err,err,err,err,err,第2页 共 16页/* 11*/* 12*/* 13*/* 14*/* 15*/* 16*/* 17*/* 18*/r7, r7, r7, r7,err, r7, r7,err,err,err,err,err,err, r9, r9

8、, r9, r9, r9, r9, r9,err,err,err,err,err,err;int getLength(char strsize) 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

9、)return stacktop;elsereturn #;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

10、,int *pointer,char *stack_state,int *pointer_state,char str,char sx,int x) int i=0;if(x=0)coutttt 状态 sx 进状态栈 ;else if(x=1)cout 状态 sx 进状态栈 ;if(str!=#)coutstr 进字符栈 ;(*pointer)+; stack(*pointer).content=str;(*pointer_state)+; stack_state(*pointer_state)=sx;int getcol(char top)switch(top)case +:return 0

11、;case -:return 1;case *:return 2;case /:return 3;case A:return 4;case ):return 5;case #:return 6;case (:return 7;case i:return 8;case E:return 9;case T:return 10;case F:return 11;case P:return 12;default:coutError! This character stri ng is n ot this grammers senten ce.e ndl; return -1;int getraw(ch

12、ar raw)switch(raw)case 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: return 11;case c: return 12;case d: return 13;case e: return 14;case f: return 15;case g: return

13、16;case h: return 17;case i: return 18;default:coutError! This character stri ng is n ot this grammers senten ce.e ndl; 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;else i

14、f(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 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 t

15、9;case 10: return t10;case 11:return t11; case 12:return t12; case 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)coutt;for(int i=index+1;ilength;i+)coutstri

16、;void showc(char_stack strsize,int index)int length=getLengthc(str);if(index!=-1)coutt;for(int i=index+1;ilength;i+)coutstri.content;void switch_method(char_stack *stack,int *pointer,char *state_stack,int *pointer_state,string production,char *str,int *index)step+;coutnstept;/ 显示步骤show(state_stack,-

17、1);/ 显示状态栈coutt;showc(stack,-1);/ 显示符号站couttstr(*index)t;/ 显示当前字符show(str,(*index);/ 显示输入串char c=str(*index);if(production=err)coutError! This character stri ng is not this grammers senten ce.e ndl; return ;else if(production=s5)char sx=5;(*index)+; pushstack(stack,pointer,state_stack,pointer_state,

18、c,sx,0);else if(production=s6)char sx=6;(*index)+; pushstack(stack,pointer,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_sta

19、te,c,sx,0);else if(production=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)+; pushstack(stack,pointer,state_stack,pointe

20、r_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;/ 对应 Fpo-=2;string se=stackpo.e ndchar;/在规约之前记录下要规约的字符所代表的变量。对应tsize+;/ 新

21、增临时变量ttsize.num=tsize+1;/ 下面四个表达式是按照上面的规约式进行的赋值 ttsize.operate=+;ttsize.var1=se;ttsize.var2=st;coutt(ttsize.operate,ttsize.var1,ttsize.var2,tttsize.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);coutE+T 规约且 ;popstack(

22、state_stack,pointer_state,3); popstackc(stack,pointer,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的位置,

23、即面的操作string st=stackpo.endchar;/ 对应 Tpo-=2;string se=stackpo.e ndchar;/在规约之前记录下要规约的字符所代表的变量。对应Etsize+;新增临时变量ttsize.num=tsize+1;/ 下面四个表达式是按照上面的规约式进行的赋值ttsize.operate=-;ttsize.var1=se;ttsize.var2=st;coutt(ttsize.operate,ttsize.var1,ttsize.var2,tttsize.num);int p=(*pointer_state);p-=3;char second=state

24、_stackp;int i=getraw(second);int j=getcol(E);char c_out=getraw_content(tableij);coutE-T 规约且 ;popstack(state_stack,pointer_state,3);第 10 页 共 16 页popstackc(stack,pointer,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).e

25、ndchar=s;/ 把保存 E-T 规约的结果的变量保存至当前字符的终结符else if(production=r3)string s=stack(*pointer).endchar;/ 在规约之前记录下要规约的字符所代表的变量int p=(*pointer_state);p-;char second=state_stackp;int i=getraw(second);int j=getcol(E);char c_out=getraw_content(tableij); coutT 规约且 ; popstack(state_stack,pointer_state,1);popstackc(s

26、tack,pointer,1);char c=E;/str(*index); pushstack(stack,pointer,state_stack,pointer_state,c,c_out,1);stack(*pointer).endchar=s;/ 将记录下的变量赋值给规约后的字符else if(production=r4)int po=(*pointer);/用P规约该表达式,有效变量在E的endchar中,需要找到 E的位置,即面的操作string sf=stackpo.endchar;/ 对应 Fpo-=2;string st=stackpo.endchar;/ 在规约之前记录下要

27、规约的字符所代表的变量。对应 Ttsize+;新增临时变量ttsize.num=tsize+1;/ 下面四个表达式是按照上面的规约式进行的赋值ttsize.operate=*;ttsize.var1=st;ttsize.var2=sf;coutt(ttsize.operate,ttsize.var1,ttsize.var2,tttsize.num);int p=(*pointer_state);p-=3;char second=state_stackp;int i=getraw(second);int j=getcol(T);char c_out=getraw_content(tableij)

28、; coutT*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(*pointer).endchar=s;/ 把保存 T*F 规约的结果的变量保存至当前字符的终结符else if(production=r5)int po=(*pointer);/用P规约该表达式

29、,有效变量在E的endchar中,需要找到 E的位置,即面的操作string sf=stackpo.endchar;/ 对应 Fpo-=2;string st=stackpo.endchar;/ 在规约之前记录下要规约的字符所代表的变量。对应 Ttsize+;新增临时变量ttsize.num=tsize+1;/ 下面四个表达式是按照上面的规约式进行的赋值 ttsize.operate=/;ttsize.var1=st;ttsize.var2=sf; coutt(ttsize.operate,ttsize.var1,ttsize.var2,tttsize.num);int p=(*pointer

30、_state);p-=3;char second=state_stackp;int i=getraw(second);int j=getcol(T);char c_out=getraw_content(tableij); coutT/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

31、);stack(*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); coutF 规约且 ;popstack(state_stack,pointer_st

32、ate,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的位置,即面的操作string sf=stackpo.endchar;/ 对应 Fpo-=2;string sp=stackpo.

33、endchar;/ 在规约之前记录下要规约的字符所代表的变量。对应 Ptsize+;新增临时变量ttsize.num=tsize+1;/ 下面四个表达式是按照上面的规约式进行的赋值ttsize.operate=A: ttsize.var1=sp; ttsize.var2=sf;coutt(ttsize.operate,ttsize.var1,ttsize.var2,tttsize.num);int p=(*pointer_state);p-=3;char second=state_stackp;int i=getraw(second);int j=getcol(F);char c_out=ge

34、traw_content(tableij);coutPAF 规约且; popstack(state_stack,pointer_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;把保存PAF规约的结果的变量保存至当前字符的终结符else if(production=r8)int p=(*pointer

35、_state);p-;char second=state_stackp;int i=getraw(second);int j=getcol(F);char c_out=getraw_content(tableij); coutP 规约且 ;string s=stack(*pointer).endchar;/ 在规约之前记录下要规约的字符所代表的变量popstack(state_stack,pointer_state,1); popstackc(stack,pointer,1);char c=F;/str(*index); pushstack(stack,pointer,state_stack,

36、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(E) 规约且 ;int po=(*pointer);/用P规约该表达式,有效变量在 E的endchar中,需要找到 E的位置,即 面的操作po-;string s=stackpo.e ndchar;/在规约之前记录下要规约的字符所代表的变量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;/ 将记录下的变量赋值给规约后的字符else if(production=r10)i

温馨提示

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

评论

0/150

提交评论