C编译器剖析_5.2.6 中间代码生成及优化_一元表达式及其他表达式的翻译

C编译器剖析_5.2.1 中间代码生成及优化_布尔表达式的翻译 5.2  中间代码生成与优化_布尔表达式的翻译     我们仍然按照语法分析和语义检查时的思路,先讨论表达式的翻译,再处理语句。表达式从概念上来说,可分为算术表达式和布尔表达式,在一些编程语言(例如Java)中对这两者是有严格区分的,算术表达式的结果是整数或浮点数,而布尔表达式的结果是逻辑上的真或假。布尔是英国数学家,由于布尔较早进行了关于“与或非”逻辑运算的研究,为了纪念这位先驱,在Java中 阅读详情

5.2.6  一元表达式及其他表达式的翻译

    在这一小节中,我们先来讨论一下一元表达式的翻译,我们先举个例子来说明一下。在以下C程序中,符号arr被声明为int[3][5]的数组类型,UCC编译器在语义检查后,为表达式“**arr=30;”构造的语法树为“(= ([]([] arr  0) 0) 30)”,在中间代码生成阶段,对应的中间代码为“arr[0] = 30;”。由这个例子可见,并不是所有出现在C程序中的“*”运算符都会对应“提领操作Dereference”,即间接寻址。

         int  arr[3][5];

         int * ptr = &arr[0][0];

         void f(void){

                   ** arr = 30;               

                   *ptr = 50;

         }

    对于C表达式“*ptr=50;”,UCC编译器在语义检查后构造的语法树为“(=  (* ptr) 50)”,在中间代码生成阶段,UCC编译器需要为该语法树中的“*”运算符产生“提领Dereference指令”。一元表达式的翻译如图5.2.17所示,第4行调用TranslateBranchExpression函数来计算形如“!a”的布尔表达式的算术值(0或者1),第7行调用我们在第5.2.4节中介绍过的TranslateIncrement函数来翻译表达式“++a”或者“--a”,第14行调用的AddressOf用于产生“取地址指令”,第16行的Deref函数用于产生“提领Dereference指令”,我们也在前面的章节中已分析过这几个函数,这里不再重复。


图5.2.17 TranslateUnaryExpression()

    图5.2.17第12行调用TranslateCast来为形如“(int) a”的表达式产生转型指令,该函数并不复杂,我们也从略。第17至19行用于翻译形如“-a”和“~a”的表达式,我们在第19行调用Simplify函数做一些编译时的代数简化,该函数也已在前面的章节中做过分析。

    接下来我们再分析条件表达式的翻译,以下给出了一段C程序及其对应的中间代码,我们生成临时一个临时变量t0用来存放b+2或b+3的值,然后再把t0赋值给变量c。

         int  a ,b,c;

         c = a > 0? b+2: b+3;

         //////////////////对应的中间代码////////////////////////////

         if(a <= 0) goto BB7;

BB6:    //trueBB

        t1 : b + 2;

         t0= t1;

         gotoBB8;

BB7:    //falseBB

        t2 : b + 3;

         t0= t2;

BB8:    //nextBB

        c = t0;

    UCC编译器中的函数TranslateConditionalExpression用于产生上述中间代码,如图5.2.18

所示,第6行调用的CreateTemp函数用于产生上述临时变量t0,第8行的trueBB对应“BB6”,而第9行的falseBB对应上述“BB7”,第10行的nextBB对应“BB8”。第11行调用TranslateBranch函数来产生上述跳转指令“if (a <= 0) goto BB7;”,第13行递归地调用TranslateExpression函数用来翻译“b+2”,而第15行的GenerateMove用来产生MOV指令“t0 = t1;”,第17行产生无条件跳转指令“goto BB8;”。第18至22行的代码用于翻译“b+3”并产生相应的标号“BB7”和“BB8”。


图5.2.18 TranslateConditionalExpression

    我们已在第5.2.1节时介绍过用于二元表达式的翻译函数TranslateBinaryExpression,而逗号表达式的翻译,可由以下TranslateCommaExpression函数来实现。例如,对逗号表达式“a,b,c”而言,按照C语言的语义,最后一个表达式“c”的值即为整个逗号表达式的值,UCC编译器在语义检查后为“a,b,c”产生的语法树为“(, (, a  b)  c)”。我们只要递归地调用TranslateExpression函数来翻译其左子树和右子树即可。

         // 翻译逗号表达式,我们面对的是形如“(, (, a  b)  c)”的语法树

         static SymbolTranslateCommaExpression(AstExpression expr){

            //翻译左子树(, a  b)

            TranslateExpression(expr->kids[0]);       

            //翻译右子树c

            returnTranslateExpression(expr->kids[1]);    

        }

    至此,我们完成了对表达式的翻译,在下一节中,我们要讨论语句的翻译。


C编译器剖析_5.2.2 中间代码生成及优化_再论符号symbol与公共子表达式 5.2.2    再论符号symbol与公共子表达式     在介绍算术表达式的翻译前,让我们简单重温一下第2.5节中的“图2.5.4 公共子表达式”及“图2.5.5 valueDef和valueUse”。为阅读方便,我们再次给出这两张图,更详细的说明请参见第2.5节。对于图2.5.4第2行的a+b,我们会由第7行的中间代码来对a+b进行求值,其结果存于临时变量t1中,之后在第3行中再次遇到表达 阅读详情

相关推荐

C编译器剖析_5.3.1 中间代码生成及优化_If语句和复合语句的翻译

5.3.1   If语句和复合语句的翻译     我们先简单回顾一下对布尔表达式的翻译,我们通过调用TranslateBranch函数来产生跳转指令,从而实现布尔表达式的语义。在使用函数TranslateBranch(expr, bt, bn)时,有这么两个约定:     (1) 当expr为真时,跳往bt基本块;     (2) 紧随“函数TranslateBranch所生成的跳转指令”之

SheIsC的专栏 2050

shell报错:-bash: [: ==: 期待一元表达式 解决方法

如上代码, 执行shell报错:line 1: [: ==: unary operator expected【翻译过来就是:-bash: [: ==: 期待一元表达式】1. 当 if 语句中使用 [ ] 条件修饰符时, $flag 变量必须加上引号。2. 当 if 语句中使用 [[]] 条件修饰符时,$flag 变量的引号可有可无。...

qq_23251505的博客 7695

一元表达式(将中缀表达式变为后缀表达式)

输入一元表达式和自变量,可计算一元表达式的值,算法支持的运算符有+、-、*、/、%、^、ln、sin、cos.

shell报错:-bash: [: ==: 期待一元表达式 解决方法 ([: ==: unary operator expected)

shell报错:-bash: [: ==: 期待一元表达式 解决方法 ([: ==: unary operator expected) blogdaren2015-02-26抢沙发 14916人次 问题背景: if [ $flag == '1' ]; then mode='--dev' else mode='--test' fi 如上代码, 执行shell报...

weixin_33978044的博客 1万+

中间代码生成代码(中缀表达式转换为四元式)

Python实现的编译原理中间代码生成程序,使用了PyQt5写图形界面 题目:设计一个程序,该程序能够将形如x=y op z的简单赋值语句翻译为对应的四元式序列,其中op可为+、-、*、/等二元运算符。要求用图形界面方式编程. 例如:若输入赋值语句a=b+c,则输出如下四元式序列: (+,b,c,t1) (=,t1,-,a)

词法分析及四元式代码生成C语言代码

词法分析,递归下降的语法分析及四元式代码生成的C语言代码

Bash脚本的空格和“期待一元表达式”错误

很少自己写Bash脚本,一写就出现了一些奇怪的问题,主要还是对Bash脚本的语法不够熟悉,毕竟很少使用。 当做记录一下吧,今天因为空格导致的一些脚本问题: 1、Bash脚本中的赋值符号“=”前后不能有空格。例如给变量number赋值要写成“number=1”,不能写成“number = 1”。大多数编程语言都会忽略掉一些没有意义的空格,例如对于Java语言上面两种写法在语法上都是正确,

琴弦第七 3万+

中间代码生成四元式设计

中间代码生成四元式设计 实验报告,从文件中读入表达式,输出其四元式的结果序列 本程序只能生成赋值语句及算数表达式中间代码的四元式 不能生成逻辑表达式及其他复杂语句中间代码的四元式,其功能还需要进一步完善

shell编程

shell编程 概述 Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核 Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强。 注:Centos默认解析器时bash shell脚本入门 #!/root/bash echo "hello Word!!" 执行: **方式一:**采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限) **方式二:**采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x) 变量 系统变量:使用工具查看

qq_43325476的博客 1588

恒玄BES2700ZP开发实战:从零搭建嵌入式音频系统

本文详细介绍了恒玄BES2700ZP蓝牙音频SoC的开发实战,从环境搭建、SDK架构解析到蓝牙音频、AI语音集成及低功耗优化。重点探讨了如何利用其多核架构实现高性能音频处理和LE Audio支持,为开发者提供从零构建嵌入式音频系统的完整指南。

o1p2q3r的博客 918

使用Python下载ECMWF的ERA-5数据

一、注册账号 [官网]https://www.ecmwf.int/ 二、登录后获取下载key https://cds.climate.copernicus.eu/api-how-to 如图右侧红色框中的内容复制保存为TXT文件,并重命名为“.cdsapirc”,注意前面有点,保存在 C:\Users\username\.cdsapirc,(WINDOWS系统),username指当前电脑登录账户。 三、安装cdsapi库 以pycharm为例: 在pycharm中依次打开:File>setting

wise_sun的博客 7703

C编译器剖析_5.2.4 中间代码生成及优化_后缀表达式的翻译

5.2.4 后缀表达式的翻译     在前面的章节中,我们介绍了用于对数组元素和结构体成员进行访问的函数Offset,其接口如下所示,参数addr代表了基地址,参数voff代表可变偏移,而参数coff则代表常量偏移。          Symbol Offset(Type ty, Symbol addr,Symbol voff, int coff);     函数Offset的基本想法是产生

SheIsC的专栏 1566

C语言实验——各位数字之和排序

C语言实验——各位数字之和排序Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Description给定n个正整数,根据各位数字之和从小到大进行排序。 Input输入数据有多组,每组数据占一行,每行的第一个数正整数n,表示整数个数,后面...

aiLMengi000的博客 1242

C编译器剖析_5.2.5 中间代码生成及优化_赋值表达式的翻译

5.2.5 赋值表达式的翻译     在这一小节中,我们来讨论一下赋值表达式的翻译,例如“a=a-b;”或者“a += b;”等。在图5.2.13的下方我们给出了表达式“a+=b;”在语义检查前后的语法树,右下侧的语法树相当于是表达式a = a’+b,但表达式中的a和a’对应同一个语法树结点。按C的语义,语句“a+=b;”中的a只能被求值一次,而不能求值两次。例如,若a结点对应一个函数调用(*f

SheIsC的专栏 1246

优化Cartographer重定位速度:从子图筛选到参数调优的完整思路

本文详细介绍了优化Cartographer重定位速度的完整方法,从子图筛选到参数调优,帮助工程师在已知初始位姿的前提下将重定位耗时降低50%以上。重点分析了性能瓶颈、子图筛选策略、匹配算法选择及环境自适应的参数优化策略,并通过实战案例展示了显著效果提升。

weixin_28704565的博客 463

实测OV5640 DVP/MIPI接口720p@60fps配置,为什么我的Zynq-7020开发板只有30帧?

本文深入解析了OV5640摄像头在Zynq-7020开发板上帧率减半的问题,从寄存器配置到硬件链路进行全面排查。重点分析了DVP/MIPI接口的720p@60fps配置,提供了关键寄存器设置、时序参数调整及硬件带宽验证方法,帮助开发者快速定位并解决帧率下降问题。

weixin_42634811的博客 344

从零实现类C语言编译器:布尔表达式的回填拉链优化技巧

本文深入解析了在构建类C语言编译器时,如何运用回填拉链技术高效翻译布尔表达式并实现短路运算。通过剖析真链、假链和表达式假链三条核心链的管理机制,结合递归下降分析法的实战代码,详细阐述了如何生成精炼且正确的控制流代码,是攻克编译器实现中布尔表达式翻译难题的关键技巧。

moss5的博客 461

BDD测试用例:Playwright的MCP Server实战

Playwright MCP Server建立了大模型和真实的浏览环境之间的桥梁,可以让大模型操作多款浏览器完成测试任务。

Criss@陈磊 443

编译原理实战:从声明到控制流,中间代码生成全解析

本文深入解析编译原理中的中间代码生成过程,从声明语句到控制流翻译,详细介绍了三地址码的生成与应用。通过实际案例展示如何将高级语言转换为平台无关的中间表示,帮助开发者理解编译器内部工作原理,优化代码生成与调试效率。

weixin_29224309的博客 352

【动态导通电阻】GaN HEMT动态导通电阻的精确测量

2023年7月,瑞士洛桑联邦理工学院的Hongkeng Zhu和Elison Matioli在《IEEE Transactions on Power Electronics》期刊发表文章,提出了一种稳态测量方法,用于研究氮化镓(GaN)高电子迁移率晶体管(HEMT)的动态导通电阻(Ron)。实验结果显示,商业GaN器件在稳态下的动态Ron变化显著,稳定时间可达数分钟且与电压相关。传统的脉冲测量方法由于测试时间不足,可能导致结果不准确。该

荷塘阅色 1376

Linux 下 OpenClaw 安装全记录:从零到一的保姆级图文教程

本文主要介绍了Linux 下 OpenClaw 安装全记录:从零到一的保姆级图文教程,希望能对学习使用OpenClaw 的同学们有所帮助。 文章目录 1. 背景 2. 实战教程 2.1 步骤一 安装Node.js 2.2 步骤二:安装git 2.3 步骤三:安装并配置OpenClaw 2.4 步骤四:配置OpenClaw 2.5 步骤五:配置模型 2.6 步骤六:对话 3. 后续使用步骤 4. 报错解决方案 5. OpenClaw的卸载

weixin_43178406的博客 10万+

二.编译器和代码优化技术

编译器是将高级编程语言(如C、C++、Java、Python)编写的源代码,转化为计算机可直接执行的机器语言(或字节码、中间代码)的程序,核心价值是“翻译+优化”,让代码能高效在硬件上运行。词法分析:拆分源代码为最小语法单元(如关键字、变量名、运算符,称为“Token”),比如把int a=1+2;拆为inta12;。语法分析:基于Token构建抽象语法树(AST),校验语法合法性(如是否漏写分号、括号不匹配),AST是源代码的结构化表示,便于后续处理。语义分析。

cscs2020ll的博客 855

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

预测市场跟单机器人入门:认识 Polymarket Copy Trading Bot 完全指南

Polymarket Copy Trading Bot(预测市场跟单机器人)是一款免费开源的自动跟单交易工具,它能 7×24 小时监控 Polymarket 平台上优秀交易者的最新操作,并根据你的资金规模自动计算仓位、实时下单复制。对于想在预测市场"跟着高手学交易"却没时间盯盘的新手来说,这款跟单机器人可以把人工跟单变成全自动流程。 [![Polymarket预测市场横幅图](https://r

gitblog_00510的博客 197

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

万字长文!带你吃透语义分析与中间代码生成(七)——语法制导翻译实战:从赋值到控制流

本文深入探讨了语法制导翻译在编译原理中的应用,详细解析了从赋值语句到控制流的语义分析与中间代码生成过程。通过实战案例展示了三地址代码生成、布尔表达式优化、控制语句翻译等关键技术,帮助开发者掌握编译器前端设计的核心方法。

weixin_34326429的博客 410

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: C编译器剖析_5.2.5 中间代码生成及优化_赋值表达式的翻译
下一篇: C编译器剖析_5.3.1 中间代码生成及优化_If语句和复合语句的翻译
SheIsC
博客等级 码龄12年 224粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值