《编译系统设计实践》
实验项目三:语法制导翻译与生成中间代码
学号:
姓名:
年级:
学院:数计学院
专业:计算机
本组其它成员:学号姓名
学号姓名
实验时间:2016-2017 学年第一学期
任课教师:
一、实验目的
通过语法制导或翻译模式生成中间代码。
二、实验内容
在自底向上语法分析基础上设计语义规则(语法制导翻译),将源程序翻译为四
元式输出,若有错误将错误信息输出。
三、设计思路
1. 分析过程
主函数,读取文件,存入字符串数组,调用语义分析,判断关键字,调用相应的
语义规则(这里只有 if 和 while 和赋值语句),赋值语句调用表达式处理,if
语句调用条件表达式处理,while 也是调用表达式处理,然后是一个递归过程,
不断的递归调用,按序输出三地址语句。在本例程序中选用 expr 及 num 作为运
算数。
2. 主要函数
string link()//字符串和数字的连接
string element()
string expression()//处理表达式
string expression_1()//处理表达式
//获取表达式中的元素对象
//处理表达式,转为三地址输出
string biaodashi()
string biaodashi_1()//递归---处理表达式,转为三地址输出
string getOperator()//判断并获取运算符
void condition(int L1,int L2)
//输出 if 语句的条件的三地址代码
void yuyifenxi_list()
//生成并输出条件返回地址
void yuyifenxi_list_1()
void yuyifenxi(int next,int &flag)
void readfile()//文件读入
//递归---生成并输出条件返回地址
//判断关键字,调用相应的产生式分析
四、测试报告
1. 第一组测试:
图 1-1 输入待翻译代码
图 1-2 中间代码生成
2. 第二组测试:
图 2-1 输入待翻译代码
五、实验总结
实验三的重点在于判断关键字,调用相应的产生式分析及处理表达式,转为三地
址输出部分,也是很费时间的难点部分,但通过查阅书本及网上资料,还是将其
以多个处理函数的递归调用实现了,虽然最后实现结果对错误的分析还不够精确
有些差强人意,但毕竟还算有些收获了。另外,通过三次实验下来,对于一个简
易编译器的实现已经有了一个整体的构架了,相信在通过自己以后的深入学习,
一定能写出属于自己的编译器。
六、附录代码
#include
#include
#include
using namespace std;
int address=100;
int LID=0;
int tID=0;//用于替换表达式的标识符
int ip=0;
string shuru[666];
int maxsize;
//设置存放数组的长度
//每条分析语句的地址
//表示过程执行到相应位置的地址符号
//存放从文件读入的字符串
string biaodashi();
/*****字符串和数字的连接*****/
string link(string a,int b)
{
string t="";
do
{
t+=b%10+'0';
b/=10;
}
while(b);
reverse(t.begin(),t.end());
return a+t;
}
/*****获取表达式中的元素对象*****/
string element()
{
if(shuru[ip]=="expr"||shuru[ip]=="num")
{
ip++;
return shuru[ip-1];
}
else if(shuru[ip]=="(")
{
ip++;
string result=biaodashi();
if(shuru[ip]==")")ip++;
else puts("Lack)");
return result;
}
else puts("error");
return "";
}
/*****处理表达式*****/
string expression_1(string &op)
{
if(shuru[ip]=="*"||shuru[ip]=="/")
{
op=shuru[ip];
ip++;
string arg1=element();
string op_1="",result=link("t",tID++);
string arg2=expression_1(op_1);
if(op_1=="")op_1="=";
if(arg2=="") cout<
else cout<
string arg1=expression();
string op_1="";
string arg2=biaodashi_1(op_1);
result=link("t",tID++);
if(op_1=="")
{
op_1="=";
}
if(arg2=="")
{
cout<