语法制导翻译与生成中间代码(附代码)
更新时间: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
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(\
正在阅读:
语法制导翻译与生成中间代码(附代码)04-25
松下摄像P2HD说明书04-12
党支部工作报告10-23
期中考试教学质量分析08-12
有关青春的句子 青春时代是一个短暂的美梦 - 图文03-20
二级学院本科教学质量保障体系构建研究03-02
可爱的小鸭作文350字07-13
2010-2011学年四川省宜宾市宜宾县九年级(上)期中数学试卷06-03
华为并购港湾案例分析09-08
- Win7 安装MySql图示
- 计算器课程设计报告
- 部编版八年下语文第三单元第六单元古诗文理解默写练习及答案
- 13质量通病防治方案和施工措施
- 土力学试题~~~~
- 公务员打印资料
- 传热膜系数测定实验报告 - 图文
- 新时期煤矿协管安全工作的创新与实践
- 第五章 习题及参考答案
- 220kV架空线路强条执行记录表
- 音乐欣赏读后感
- 高炉
- 劳动教育需要新的时代内涵
- 10建筑地面工程施工质量验收规范GB50209-20021
- 银行会计练习题2答案
- 2013年七年级地理上册知识点复习提纲湘教版
- 人教版三年级语文上册第四单元测试题(A卷)(有答案)
- 营养师第九章练习题
- 湖北省武汉市2018届高三毕业生二月调研 理综化学
- 行业分析2018-2023年中国男性护肤品行业市场发展分析及投资前景
- 代码
- 制导
- 语法
- 生成
- 中间
- 翻译
- 老君堂煤矿机电装备及管理水平考核评价对标活动总结
- 江西省新增的17个历史文化名镇名村简介
- 防撞护栏施工总结
- 如何去除word档中那些多余的……-2011.12.5
- 活体动物光学成像系统在活体荧光成像中的应用
- 人教版高一历史必修期中测试题(附答案) - 图文
- 会计类工作个人简历
- 中国国际海洋运输货物保险发展论文
- 2018山东申论B卷答案
- 苏州吴中区金庭镇总体规划现状调查报告 - 图文
- 五年级下册数学思维训练一
- --贵州黔东南苗族斗牛的社会功能及文化内涵研究
- 区推行新型农村合作医疗制度经验材料-精选word文档(4
- 航海学补充题
- 2016中国房企品牌价值50强揭晓 中海恒大万科蝉联三强 - 图文
- 采购管理题库(附答案)
- 水工环采样(赵松江)
- 2009年全国外贸业务员考试外贸业务基础理论试卷理论(B)及答案
- 关于2017上半年学生购买和充值火车票优惠卡的通知
- 安全究竟为了谁