编译器实验报告
甘肃政法学院
本科学生实验报告
姓名 学院
专业 班级
实验课程名称 编译原理
试验时间 2012 年 12 月 20 日
指导教师及职称
实验成绩
开课时间 2012-2013 学年 1学期
甘肃政法学院实验管理中心印制
实验题目编译器实验报告小组合作否 姓 名班 级学 号一、实验目的:
采用递归下降(自上而下)的语法制导翻译法。
二、实验环境:
需要一台拥有WINDOWS XP 、C++软件的计算机。
三、实验内容与步骤:
一、语法结构定义
::= ::= ‘{‘’}’ //程序用括号括起来
::={;};
::=||
::=ID= //赋值语句用”=”号
::=if
::=do while
::=
::= ::= ::=)
num::= ( +|-|ε ) 数字*(.数字数字* | ε)( e ( +|-|ε ) 数字数字*|ε)
ID::=字母(字母|d数字)*
字母::=a|b|c…|z|A|B|C…|Z
数字::=0|1|2…|9
::= ( 语法分析程序 ( 语义分析程序 (编译器。不断完善,不断改进。渐变的过程。在此给出算法思想。
二、流程图
图 1主函数示意图
三、函数的相关说明
所有函数一览
void lrparser();
void staBlock(int *nChain); //语句块
void staString(int *nChain); //语句串
void sta(int *nChain); //语句
void fuzhi(); //赋值语句
void tiaojian(int *nChain); //条件语句
void xunhuan(); //循环语句
char* E(); //Expresiion表达式
char* T(); //Term项
char* F(); //Factor因子
char *newTemp(); //自动生成临时变量
void backpatch(int p,int t); //回填
int merge(int p1,int p2); //合并p1和p2
void emit(char *res,char *num1,char *op,char *num2); //生成四元式
2、void emit(char *res,char *num1,char *op,char *num2)
该函数的功能是生成一个三地址语句送到四元式表中。
void emit(char *res,char *num1,char *op,char *num2)
{ strcpy(fourCom[q].result,res);
strcpy(fourCom[q].arg1,num1);
strcpy(fourCom[q].opera,op);
strcpy(fourCom[q].arg2,num2);
q++;
}
四元式表中的结构如下:
struct{
char result[10]; //字符串(字符数组)
char arg1[10]; //操作数1
char opera[10]; //运算符
char arg2[10]; //操作数2
}fourCom[20]; //结构体数组
3、char *newTemp()
该函数的功能是会动一个新的临时变量,临时变量名产生的顺序是T1,T2,T3,….
char *newTemp()
{ char *p;
char varTemp[10];
p=(char *)malloc(10);
kk++;
itoa(kk,varTemp,10); //整数转换为字符串
strcp