编译器 7. 中间代码 | 5. 程序设计

news/2025/3/14 17:41:09/文章来源:https://www.cnblogs.com/wuoshiwzm/p/18235724

IR 代码中 符号代码( label )沿用不变
int 调用 T_Const(int i )

Tree 模块:


1. patchList:真值/假值 回填表

这里是 patchList 的生成, 至于具体怎么回填后面才会讲

struct patchList_ {Temp_label *head; patchList tail};// 生成 stm
stm = T_Cjump(T_ge, unEx(left), unEx(right), NULL, NULL);or
stm = T_Cjump(T_eq, callEq, T_Const(1), NULL, NULL);// 通过 stm 生成 真/假值 回填表
patchList tlist;
patchList rList;
tlist = PatchList(&stm->u.CJUMP.true, NULL);
flist = PatchList(&stm->u.CJUMP.false, NULL);// 最后通过 stm, 真/假值 回填表 生成 Tr_Exp
Tr_Exp e = Tr_Cx(tlist, flist, stm);

Frame 模块:


1. 片段相关的代码
都在 Frame 模块中, translate 调用 Frame 模块获取

struct F_frag ;
struct F_fragList ;F_frag F_StringFrag(Temp_label, string); // 字符串片段
F_frag F_ProcFrag(T_stm, F_frame); // 流程片段: 栈帧+函数体static F_frag* extendFragList(); // 扫描到新的元素,扩容并返回全局片段表
F_fragList F_getFragList(void); // 获取全局片段表

*2. static F_frag extendFragList(); **
扫描到新的元素,扩容并返回全局片段表

// 重置全局片段表, 返回 head
static F_frag* extendFragList(){// 创建指针变量if (fragList == NULL){fragList = (F_fragList*) checked_malloc(sizeof(F_fragList*));}// 指针变量赋值为一个 fragList 对象*fragList = (F_fragList) checked_malloc(sizeof (struct F_fragList_));if (fragList_head == NULL){fragList_head = *fragList;}// 把全局片段表的 head 拿出来返回,然后全局片段片更新为 NULLF_frag  *curf = &((*fragList)->head);// 除了 head 外剩于的片段表设为 NULLfragList = &((*fragList)->tail);*fragList = NULL;return curf;
}

3. 字符串片段

void F_String(Temp_label label, string str){// 先获取当前片段F_frag *currentFrag = extendFragList();// 再更新片段*currentFrag = F_StringFrag(label, str);
}

4. F_Exp(F_access acc, T_exp framePtr);
在栈帧 framePtr 中 找到 access 对应的地址: frame 地址 + offset 地址
image

// 生成 access 的*访问地址*
T_exp F_Exp(F_access acc, T_exp framePtr){// 判断目标 access 在栈帧中 / 寄存器中if (acc->kind == inFrame){// 地址 = 栈帧地址 + offset(位移)return T_Mem(T_Binop(T_plus, framePtr, T_Const(acc->u.offset)));}else{// 寄存器return T_Temp(acc->u.reg);}
}

Translate 模块

1. 沿静态链往上找变量

Tr_exp Tr_simpleVar(Tr_access acc, Tr_level level){debug("Tr_simpleVar");T_exp texp;F_access access = acc->access;// 判断当前 level 是否和 变量访问的level (acc->level) 一致,一致就直接用, 不一致就沿着***静态连*** 找if (level != acc->level){// 沿着静态链往上找对应的 leveltexp = F_Exp(F_staticLink(), T_Temp(F_FP()));level = level->parent;while (level != acc->level){// 静态链是一个指向其**外部函数**栈帧的指针链// ... todo ...texp = F_Exp(F_staticLink(),texp);// level 没有找到,再往上找父levellevel = level->parent;}texp = F_Exp(acc->access,texp);}else{texp = F_Exp(acc->access, T_Temp(F_FP()))}}

Semant 模块:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/721038.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

入手戴尔R720服务器(1)通过iDRAC查看系统信息

想入手服务器很久了,一直担心功耗太高,今天狠心搞了一台戴尔服务器R720。需求开虚拟机,核心数要多 学习以下Windows云桌面 AD域控 office online server ubuntu试验机 随便折腾不怕玩坏最好两个网口以上稳定四个以上硬盘位‍为什么是R720?1000元预算 买来吃灰的可能性很大,…

jpg转pdf有没有免费的方法?

图片转pdf哪里有免费的?为了方便我们整理一些图片资料或一些证件照图片资料,我们通常会选择将图片转PDF文档进行保存,这样一来更方便存储和传输。图片文件传输,会出现格式不兼容无法传输的问题,而PDF文档就不用担心对方无法打开或无法输出的问题。 那如何jpg转pdf呢?今天…

Netty 快速入门

什么是 Netty Netty的官网: [https://netty.io/ Netty是一个Java NIO技术的开源异步事件驱动的网络编程框架,用于快速开发可维护的高性能协议服务器和客户端。 往通俗了讲,可以将 Netty 理解为:一个将Java NIO进行了大量封装,并大大降低Java NIO使用难度和上手门槛的网络编…

百兆网口和千兆网口指示含义的区别

网口指示灯状态:千兆网口和百兆网口灯的含义不同千兆网口:根据核心板提供给ETH0_LED1、ETH0_LED1的信号 当与其连接的是百兆网口PHY芯片的设备时,LED1(绿灯)亮,LED2(黄灯)不亮当有数据发送或者接收时,闪烁; 当与其连接的是千兆网口PHY芯片的设备时,LED2(黄灯)亮,…

Hershell反向shell生成器+msf加密通信免杀

转自:https://www.cnblogs.com/Chuantouli/p/12298579.html 简介 Hershell1Hershell(<a href="github.com/sysdream/hershell" target="_blank" rel="noopener">github.com/sysdream/hershell</a>)是基于golang开发的一款反向shell…

浏览器在局部区域全屏下,UI部分弹窗组件无法正常显示的问题

import screenfull from screenfull// 全屏 handleScreen() {//screenfull.isEnabled 此方法返回布尔值,判断当前能不能进入全屏if (!screenfull.isEnabled) {return false}//screenfull.toggle 此方法是执行全屏化操作。如果已是全屏状态,则退出全屏screenfull.toggle(this…

word如何转换成pdf?这4种方法超实用!

在处理文档时,将Word文档转换为PDF格式是一种常见的需求。PDF格式具有跨平台、保持原始格式等优点,使得在不同设备和操作系统上查看和打印文档时保持一致性。那么word怎么转换成pdf呢?本文将介绍四种将Word文档转换为PDF的方法,以满足不同用户的需求。 方法一:使用Word自带…

农业科技的丰收革命:农情监测系统引领农业数字化转型的浪潮

在科技飞速发展的今天,农业领域正经历着一场深刻的智能化、数字化变革。在这场变革中,农情监测系统以其独特的优势,成为推动农业转型升级的重要力量。它利用先进的物联网技术和云端平台,实现了对农业环境、病虫害等关键信息的实时、精准监测,为农业生产提供了强大的数据支…

智慧运维,安全无忧:体验全新的机房管理方案

在数字化飞速发展的今天,机房作为信息时代的“心脏”,其稳定运行对于企业的业务连续性至关重要。然而,传统的机房运维模式面临着诸多挑战,如响应速度慢、故障定位难、资源浪费大等问题。智慧机房运维系统,它将以智能化、自动化的方式,为机房运维带来革命性的变革。在数字…

OTA打包

./mk xxxxxxxxxxxx otapackage source build/envsetup.sh 启动编译脚本 lunch xxxxxxxxxxxx ota 升级打包 (项目有特制签名看着改) ./build/tools/releasetools/ota_from_target_files -k device/mediatek/security/releasekey -i a1.zip a2.zip update_8023.zip ./build/t…

戴尔R720服务器(4)虚拟机性能测试

物理机环境机型 戴尔R720系统环境 PVECPU E5-2660V2 2.2GHz 双路内存 1333MHz 单通道内存 1333MHz 双通道硬盘 用6块转速1万的2.5寸盘组的RAID5,使用了H310mini阵列卡‍测试工具:Sysbench。一个跨平台的基准测试工具,用于评估系统性能,包括CPU、内存、文件系统和数据库性…