天津理工大学编译原理实验3:语义分析及中间代码生成 联系客服

发布时间 : 星期一 文章天津理工大学编译原理实验3:语义分析及中间代码生成更新完毕开始阅读aec879ababea998fcc22bcd126fff705cc175ccc

实验报告

学院(系)名称:计算机与通信工程学院

姓名 班级 课程名称 学号 实验项目 专业 实验三:语义分析与中间代码生成 编译原理 课程代码 计算机软件实验室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.认真完成并按时提交实验报告。

【实验过程记录(源程序、测试用例、测试结果及心得体会等)】

#include #include #define size 1024 using namespace std;

int step=0;

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*/ \

/* 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 '#'; }

void popstack(char *stack,int *pointer,int times) {

int p;

for(int i=1;i<=times;i++) { p=*pointer; stack[p]='\\0'; (*pointer)--; } }

void popstackc(char_stack *stack,int *pointer,int times) {

int p;

for(int i=1;i<=times;i++) { p=*pointer; stack[p].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) cout<<\状态 \进状态栈 \ else if(x==1) cout<<\状态 \进状态栈 \ if(str!='#') { cout<

(*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;