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

本文详细介绍了C编译器如何翻译If语句和复合语句的中间代码,包括If语句的两种形式以及复合语句的声明和初始化。在If语句翻译中,利用TranslateBranch函数产生跳转指令,并讨论了局部变量在栈中的动态分配和初始化。在复合语句部分,解释了如何处理局部变量的初始化,特别是数组的初始化,并展示了对应的中间代码和汇编代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

5.3.1   If语句和复合语句的翻译

    我们先简单回顾一下对布尔表达式的翻译,我们通过调用TranslateBranch函数来产生跳转指令,从而实现布尔表达式的语义。在使用函数TranslateBranch(expr, bt, bn)时,有这么两个约定:

    (1) 当expr为真时,跳往bt基本块;

    (2) 紧随“函数TranslateBranch所生成的跳转指令”之后的基本块为bn。

   在表达式的基础上,我们来讨论一下语句的翻译。图5.3.1用于if语句的翻译,第4至8行说明了如何翻译“if(expr) stmt”,我们需要创建trueBB和nextBB这两个基本块;而第12至18行阐述了如何翻译“if(expr)  stmt  else stmt”语句,我们需要创建trueBB、falseBB和nextBB这3个基本块。图5.3.1第29至34行的代码用于翻译“if(expr) stmt”,而第35至43行的代码用于翻译“if(expr) stmt else stmt”。


图5.3.1 TranslateIfStatement()

    由图5.3.1可以发现,在理解了表达式翻译的前提下,if语句的翻译就较容易理解了。而其他的控制流语句,包括do语句、while语句和for语句也与此类似,我们就不再啰嗦。接下来,我们来讨论复合语句的翻译。

    语法上,复合语句的产生式如下所示,由可选的声明列表和语句列表构成。其中的声明可以带有初值。

CompoundStatement  -->  { DeclarationListopt  StatementListopt}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值