天津理工大学编译原理实验3语义分析与中间代码生成
实验报告 学院(系)名称:计算机与通信工程学院
姓名 学号 专业 班级 实验项目 实验三:语义分析与中间代码生成 课程名称 编译原理 课程代码
计算机软件实验室7-220 实验时间 实验地点 计算机软件实验室7-215 批改意见 成绩
教师签字: 实验内容:
可选择LL1分析法、算符优先分析法、LR分析法之一,实现如下表达式文法的语法制导翻译过程。文法G[E]如下所示:
E?E+T | E-T | T T?T*F | T/F | F F?P^F | P P?(E) | i
要求构造出符合语义分析要求的属性文法描述,并在完成实验二(语法分析)的基础上,进行语义分析程序设计,最终输出与测试用例等价的四元式中间代码序列。
实验目的:
1(掌握语法制导翻译的基本功能。
2(巩固对语义分析的基本功能和原理的认识。 3(能够基于语法制导翻译的知识进行语义分析。 4(掌握类高级语言中基本语句所对应的语义动作。 5(理解并处理语义分析中的异常和错误。
实验要求:
1(在实验二的基础上,实现语法制导翻译功能,输出翻译后所得四元式序列; 2(要求详细描述所选分析方法进行制导翻译的设计过程;
3(完成对所设计分析器的功能测试,并给出测试数据和实验结果; 4(为增加程序可读性,请在程序中进行适当注释说明; 5(整理上机步骤,总结经验和体会; 6(认真完成并按时提交实验报告。 第1页 共16页
【实验过程记录(源程序、测试用例、测试结果及心得体会等)】 #include
typedef struct variable_T {
char operate;//操作符 string var1;//变量 1 string var2;//变量 2 int num;//第几个变量 }variable_T;
variable_T t[size];//记录四元式变量的变量 int tsize=-1;//表示是第tsize+1个变量 typedef struct char_stack
{
char content;//当前字符
string endchar;//这个符号代表的中间变量 可以是 i, 也可以是 t1, t2, 等等
int num;//和该字符相关的中间变量的序号 }char_stack;
string table[19][13]={// + - * / ^ ) # ( i E T F P
/* 0 */ \\
/* 1 */ \
\
/* 2 */ \\
/* 3 */ \\
/* 4 */ \\
/* 5 */ \\
/* 6 */
\\
/* 7 */ \\
/* 8 */ \\
/* 9 */ \\
/* 10*/ \\
/* 11*/ \\
/* 12*/ \
\
/* 13*/ \\
/* 14*/ \\
/* 15*/ \\
/* 16*/ \\
第2页 共16页
/* 17*/ \\
/* 18*/ \\
int getLength(char str[size]) {
int i=0;
while(str[i]!='\\0') i++; return i; }
int getLengthc(char_stack str[size]) { int i=0;
while(str[i].content!='\\0') i++; return i; }
int getstringLength(string str) { int i=0;
while(str[i]!='\\0') i++; return i; }
char gettop(char stack[size],int top) {
if(stack[top]!='\\0') return stack[top]; else return '#';