天津理工大学编译原理实验3:语义分析与中间代码生成(1).doc
《天津理工大学编译原理实验3:语义分析与中间代码生成(1).doc》由会员分享,可在线阅读,更多相关《天津理工大学编译原理实验3:语义分析与中间代码生成(1).doc(86页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date天津理工大学编译原理实验3:语义分析与中间代码生成(1)天津理工大学实验报告实验报告学院(系)名称:计算机与通信工程学院姓名学号专业班级实验项目实验三:语义分析与中间代码生成课程名称编译原理课程代码实验时间实验地点计算机软件实验室7-220计算机软件实验室7-215批改意见成绩教师签字: 实验内容:可选择LL1分析法、算符优先分析法、LR分析法之一,实现如下表达式文法
2、的语法制导翻译过程。文法GE如下所示:EE+T | E-T | TTT*F | T/F | FFPF | PP(E) | i要求构造出符合语义分析要求的属性文法描述,并在完成实验二(语法分析)的基础上,进行语义分析程序设计,最终输出与测试用例等价的四元式中间代码序列。实验目的:1掌握语法制导翻译的基本功能。2巩固对语义分析的基本功能和原理的认识。3能够基于语法制导翻译的知识进行语义分析。4掌握类高级语言中基本语句所对应的语义动作。5理解并处理语义分析中的异常和错误。实验要求:1在实验二的基础上,实现语法制导翻译功能,输出翻译后所得四元式序列;2要求详细描述所选分析方法进行制导翻译的设计过程;3
3、完成对所设计分析器的功能测试,并给出测试数据和实验结果;4为增加程序可读性,请在程序中进行适当注释说明;5整理上机步骤,总结经验和体会;6认真完成并按时提交实验报告。【实验过程记录(源程序、测试用例、测试结果及心得体会等)】#include#include#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;/记
4、录四元式变量的变量 int tsize=-1;/表示是第tsize+1个变量typedef struct char_stackchar content;/当前字符 string endchar;/这个符号代表的中间变量 可以是 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, 4,/* 1 */ s7, s8,err,err,err,err,ac
5、c,err,err,err,err,err,err,/* 2 */ r3, r3, s9,s10,err, r3, r3,err,err,err,err,err,err,/* 3 */ r6, r6, r6, r6,err, r6, r6,err,err,err,err,err,err,/* 4 */ r8, r8, r8, r8,s11, r8, r8,err,err,err,err,err,err,/* 5 */ err,err,err,err,err,err,err, s5, s6, c, 2, 3, 4,/* 6 */ r10,r10,r10,r10,r10,r10,r10,err,e
6、rr,err,err,err,err,/* 7 */ err,err,err,err,err,err,err, s5, s6,err, d, 3, 4,/* 8 */ err,err,err,err,err,err,err, s5, s6,err, e, 3, 4,/* 9 */ err,err,err,err,err,err,err, s5, s6,err,err, f, 4,/* 10*/ err,err,err,err,err,err,err, s5, s6,err,err, g, 4,/* 11*/ err,err,err,err,err,err,err, s5, s6,err,err
7、, h, 4,/* 12*/ s7, s8,err,err,err,s18,err,err,err,err,err,err,err,/* 13*/ r1, r1, s9,s10,err, r1, r1,err,err,err,err,err,err,/* 14*/ r2, r2, s9,s10,err, r2, r2,err,err,err,err,err,err,/* 15*/ r4, r4, r4, r4,err, r4, r4,err,err,err,err,err,err,/* 16*/ r5, r5, r5, r5,err, r5, r5,err,err,err,err,err,er
8、r,/* 17*/ r7, r7, r7, r7,err, r7, r7,err,err,err,err,err,err,/* 18*/ r9, r9, 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;wh
9、ile(stri!=0)i+;return i; char gettop(char stacksize,int top)if(stacktop!=0)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
10、=*pointer;stackp.content=0;(*pointer)-;void pushstack(char_stack *stack,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
11、(*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 (: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 strin
12、g is not this grammers sentence.endl;return -1;int getraw(char 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:retu
13、rn 13;case e:return 14;case f:return 15;case g:return 16;case h:return 17;case i:return 18;default:coutError! This character string is not this grammers sentence.endl;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
14、if(str=c)return c;else if(str=d)return d;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 t2;case 3:return t3;case 4:return t4;case 5:return t5;case 6:return t6;case 7:re
15、turn t7;case 8:return t8;case 9:return t9;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;f
16、or(int i=index+1;ilength;i+)coutstri;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+
17、;coutnstept;/显示步骤 show(state_stack,-1);/显示状态栈 coutt;showc(stack,-1);/显示符号站 couttstr(*index)t;/显示当前字符 show(str,(*index);/显示输入串 char c=str(*index);if(production=err)coutError! This character string is not this grammers sentence.endl;return ;else if(production=s5)char sx=5;(*index)+;pushstack(stack,poi
18、nter,state_stack,pointer_state,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,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 天津 理工大学 编译 原理 实验 语义 分析 中间 代码 生成
限制150内