# 中间代码生成
# 一、完成功能
实现了对C—语的中间代码成,能够翻译包含维数组类型的变量可以作为函数参数,可以出现维数组类型的变量的代码,修正了部分语义分析阶段遗留的错误
# 二、实验环境
实验编写在 MacOS 系统下,使flex 2.5.35和bison 2.3编译通过并运。提交之前在ubuntu 16.04环境下编译通过并测试成功
//macOS下编译需要-ll参数而非-lfl参数,在提交前已将Makefile恢复为-lfl
# 三、 实现解释
## 3.1 操作值表示
![](https://www.writebug.com/myres/static/uploads/2022/2/22/a153bd4f062cc51e070754fa2ac92404.writebug)
这是中间代码的变量的数据结构,其中类型分别为临时变量,变量,即数,Label名,函数名,地址(于函数中传识别传地址),空类型。
其中空类型是为了防出现段错误加的,在优化中去去除包含该类型的代码。变量名和函数名和地址名均直接使代码中的名称,临时变量为t0,t1 …., label名为 l1,l2,l3…。
## 3.2 中间代码
![](https://www.writebug.com/myres/static/uploads/2022/2/22/ca46400d3d1c60675d5c8cefcff92cc3.writebug)
中间代码的数据结构如上图,采双向链表记录全部代码,所有类型与书上给的中间代码指令致。
## 3.3 中间代码生成
在语义分析的同时进中间代码成,成式与书上的翻译模板致,此外为了实现要求3.2,实现了额外操作:
- 声明时加数组声明的中间代码
- 检测到多维数组时,对上维度的数组空间*位置得到偏移量,在原地址基础上加上偏移量得到新的地址
- 调⽤函数,压⼊变量时如果是数组变量,则直接压⼊数组的地址
- 在函数内部,若数组变量是本地声明,则要先取地址再操作,若是形参传则需再取地址
## 3.4 特殊思路
- 为了屏蔽掉带有结构体变量的代码,在语义分析之前直接扫描语法树来判断
- 实验中若遇到需要place = NULL的情况,则传kind = O_NULL的变量,先加进中间代码再通过优化去除
- 代码优化思路如下
- 扫描全部代码,去掉所有包含O_NULL的代码
- 创建个与临时变量数相等的数组,扫描全部代码,若遇到形如
“临时变量 := 即数” 或者 “临时变量 := 变量”
在数组中对应临时变量的位置中存相应即数或变量,删除此代码
- 扫描全部代码,对每个临时变量
如果 数组中该临时变量的位置不为空,则将该临时变量改为对应即数或变量。对所有算数表达式代码,如果其两个操作数均为即数,则将该值计算出来并将 原代码变为赋值代码
- 重复ii. iii.步骤直代码中不存在上述形式的代码。
## 3.5 运行效果
![](https://www.writebug.com/myres/static/uploads/2022/2/22/1ce36592ee5036056d2e2deeaf80b932.writebug)
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
完成功能 实现了对C—语的中间代码成,能够翻译包含维数组类型的变量可以作为函数参数,可以出现维数组类型的变量的代码,修正了部分语义分析阶段遗留的错误 实验环境 实验编写在 MacOS 系统下,使flex 2.5.35和bison 2.3编译通过并运。提交之前在ubuntu 16.04环境下编译通过并测试成功
资源推荐
资源详情
资源评论
收起资源包目录
100012433-基于C语言实现中间代码生成.zip (25个子文件)
cmm-compiler
.vscode
settings.json 216B
README 1KB
Code
intercode.c 11KB
type.h 596B
semantic.h 1KB
intercode.h 1KB
Makefile 1KB
myTree.c 2KB
scanner 24KB
semantic.c 37KB
symbolTable.c 3KB
1.ir 613B
lexical.l 2KB
main.c 691B
symbolTable.h 1KB
myTree.h 1KB
syntax.y 6KB
report.pdf 1.11MB
LICENSE 1KB
parser 63KB
Test
test4.cmm 203B
test2.cmm 203B
test3.cmm 282B
test1.cmm 119B
README.md 3KB
共 25 条
- 1
资源评论
神仙别闹
- 粉丝: 2674
- 资源: 7640
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 笔记实验六,spark,大数据分析
- ####蓝桥杯python的详细的信息介绍
- 电子万年历软件仿真(经过多次修改,保证正确性)
- Unity XR 手势射击控制脚本(适用于任何可手势识别的设备)
- 机械设计全自动电表(NB和IC卡表)控制和上壳装配线sw16可编辑非常好的设计图纸100%好用.zip
- 基于matlab的EAN-13条形码识别系统GUI界面.zip代码53
- matlab基于bp神经网络交通信号标志识别GUI界面13个标志.zip代码54
- 电子万年历答辩实物展示视频mp4格式
- 基于python实现的程序,包括哈希感知算法cvHash,图像切割cvsplit,固定目标检测cvRec(附文档ppt)等
- 计算0-10000之间所有偶数的和
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功