语法制导翻译与生成中间代码(附代码)

更新时间:2024-04-25 11:16:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《编译系统设计实践》

实验项目三:语法制导翻译与生成中间代码

学号: 姓名: 年级:

学院:数计学院 专业:计算机

本组其它成员:学号姓名

学号姓名

实验时间: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 输入待翻译代码

图2-2 中间代码生成

3.第三组测试:错误待翻译代码

图3-1输入待翻译代码

图3-2中间代码生成

五、实验总结

实验三的重点在于判断关键字,调用相应的产生式分析及处理表达式,转为三地址输出部分,也是很费时间的难点部分,但通过查阅书本及网上资料,还是将其以多个处理函数的递归调用实现了,虽然最后实现结果对错误的分析还不够精确有些差强人意,但毕竟还算有些收获了。另外,通过三次实验下来,对于一个简易编译器的实现已经有了一个整体的构架了,相信在通过自己以后的深入学习,一定能写出属于自己的编译器。

六、附录代码

#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 { } while(b);

reverse(t.begin(),t.end());

t+=b+'0'; b/=10;

//存放从文件读入的字符串 //设置存放数组的长度

//每条分析语句的地址

//表示过程执行到相应位置的地址符号 //用于替换表达式的标识符

}

return a+t;

/*****获取表达式中的元素对象*****/ string element() { }

/*****处理表达式*****/ string expression_1(string &op) {

if(shuru[ip]==\{

op=shuru[ip]; ip++;

string arg1=element();

string op_1=\string arg2=expression_1(op_1); if(op_1==\

if(arg2==\if(shuru[ip]==\{ }

else if(shuru[ip]==\{ }

else puts(\return \

ip++;

string result=biaodashi(); if(shuru[ip]==\else puts(\return result; ip++;

return shuru[ip-1];

else cout<

\ }

/*****处理表达式*****/ string expression() { }

/*****递归---处理表达式,转为三地址输出*****/ string biaodashi_1(string &op) {

string result=\

if(shuru[ip]==\{

op=shuru[ip];

string op=\string arg1=element(); string arg2=expression_1(op); if(op==\{ } if(arg2==\{ } else { }

return result;

cout<

return result;

ip++;

string arg1=expression(); string op_1=\

string arg2=biaodashi_1(op_1); result=link(\ if(op_1==\ { op_1=\

}

if(arg2==\ { cout<

cout<

\

=

\

\ }

}

return result;

}

/*****处理表达式,转为三地址输出*****/ string biaodashi() { string arg1=\

if(shuru[ip]==\ arg1+=expression(); string arg2=biaodashi_1(op); string result=link(\ if(op==\ { op=\ }

if(arg2==\

\

}

{ } else { }

return result;

cout<

/*****判断并获取运算符*****/ string getOperator() { }

/*****输出if语句的条件的三地址代码*****/

void condition(int L1,int L2) //L1,L2分别为if条件为true和false时候的跳转地址 {

string result=link(\

string arg1=biaodashi(); //获得表达式的运算符的左边内容 string op=getOperator(); string arg2=biaodashi(); if(arg2==\{

//获得表达式的运算符

//获得表达式的运算符的右边内容

if(shuru[ip]==\ { } else { } return \

puts(\ip++;

return shuru[ip-1];

shuru[ip]==\

}

} else { }

cout<<\

cout<

cout<

/*****判断关键字,调用相应的产生式分析*****/ void yuyifenxi(int next,int &flag) {

if(shuru[ip]==\{ }

else if(shuru[ip]==\ {

ip++; int L1=LID++; int L2=LID++; if(shuru[ip]==\{

ip++;

condition(L1,L2);

//if的语义子程序

ip++;

if(shuru[ip]==\ { }

else puts(\

ip++;

string arg1=biaodashi(); string arg2=\

if(arg2 == \

//赋值语句转化为四元式

} else { puts(\

}

if(shuru[ip]==\ else { puts(\ }

printf(\ yuyifenxi(next,flag); ip++;

if(shuru[ip]==\ { printf(\ ip++;

yuyifenxi(next,flag); }

}

else if(shuru[ip]==\ { ip++; int L1=LID++; int L2=LID++; if(shuru[ip]==\ { ip++;

printf(\ condition(L2,next);

} else { puts(\ }

if(shuru[ip]==\

//while的语义子程序

}

}

else { }

printf(\yuyifenxi(next,flag); printf(\flag=1;

puts(\

/*****递归---生成并输出条件返回地址*****/ void yuyifenxi_list_1() { }

/*****生成并输出条件返回地址*****/ void yuyifenxi_list() { }

void Modular()

int next=LID++; int flag=0;

yuyifenxi(next,flag); if(flag)printf(\yuyifenxi_list_1(); if(shuru[ip]==\{ }

ip++;

int next=LID++; int flag=0;

yuyifenxi(next,flag); if(flag)printf(\yuyifenxi_list_1();

{ }

/*****文件读入*****/ void readfile() { }

/*****主函数*****/ int main() { }

freopen(\cout<<\语义分析如下:\ readfile(); Modular(); return 0; maxsize=0;

while(cin>>shuru[maxsize])

maxsize++;

//将字符串输入到shuru中

int next=LID++; int flag=0; yuyifenxi_list();

if(flag)printf(\

本文来源:https://www.bwwdw.com/article/4m7p.html

Top