语法制导翻译与生成中间代码(附代码)
更新时间:2023-03-10 13:57: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(\






正在阅读:
语法制导翻译与生成中间代码(附代码)03-10
2018年3月17日宁夏回族自治区青铜峡市纪委监察委遴选公务员笔试06-09
起重机械安全管理人员和作业人员考核大纲01-19
黑河市处置重特大森林火灾应急预案04-14
2019版北师大版五年级上册3.3分数与除法练习题及答案11-10
开学第一周值周的工作总结(精彩6篇)03-28
班级环创与幼儿发展的作用 - 图文02-03
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 代码
- 制导
- 语法
- 生成
- 中间
- 翻译
- 老君堂煤矿机电装备及管理水平考核评价对标活动总结
- 计算机社团章程
- 如何去除word档中那些多余的……-2011.12.5
- 三下思品第1--4单元教案 - 图文
- “书香茶社”茶馆可行性研究报告 - 图文
- 双色磁浮子液位计项目可行性研究报告(发改立项备案+2013年最新案例范文)详细编制方案
- 高一数学周周练(3)
- 2011年指导性施工组织设计
- 浅谈高速公路工程档案工作存在的问题和建议
- 武汉市政府批复的《武汉临空经济区总体发展规划》
- 护基练习题
- 专题05 圆锥曲线-2016年高考+联考模拟理数试题分项版解析(解析版) Word版含解析
- 全国2016年10月00051《管理系统中计算机应用》真题及答案 - 图文
- 2018新苏教版三年级上册语文第8单元(课文、习作8、练习8)表格教案(有学情分析)
- 餐饮桑拿手册v3.1
- 收银员技能试题
- 都江堰市服务业综合改革试点建设工作汇报
- 自考《商品流通概论》历年真题分章节汇编(第九章)
- 防撞护栏施工总结
- 电气事故心得体会总结