计算机if语句翻译,5.4.1 if 语句的翻译

5.4  if 语句

5.4.1  if 语句的翻译

if语句是现代程序设计语言最基本的语句结构之一。从结构化语言到面向对象语言,从脚本语言到非过程式语言,从命令式语言到函数式语言,通常都能见到if语句的身影。至于if语句的基本结构与功能,笔者觉得没有任何必要在此重复了。

if语句的标准文法如下:

【文法5-2】其他语句 →  if 表达式 068 then 语句 if语句后部 070

if语句后部  → else 069 语句 | ε

从文法上来看,if语句的文法并不复杂,结构相对也比较清晰。这里,一个话题是值得思考的,那就是如何处理非终结符"表达式"。

不难发现,文法中存在非终结符"表达式"。其目的是显而易见的,希望通过这个非终结符推导各种复杂的表达式。当然,它也确实达到了这一目标,而具体的实现细节正是下一章的核心论点。不过,由于if语句的翻译将涉及其他内容,这里不得不作简单说明。

实际上,表达式翻译的实现是各不相同的,有些表达式翻译借助于栈实现,而有些表达式翻译可能借助于抽象语法树实现。前者是比较常见的实现方案,也是一种比较经典的方法,其核心思想在一些数据结构教材中亦有描述。虽然这种实现方案简单灵活,但并不是万能的。在一些特殊的应用场合,前者的实现可能并不简单,甚至会大大增加实现的复杂度。关于利用栈结构实现表达式处理的算法,读者应该并不陌生。编译器应用栈结构翻译表达式的过程与数据结构的相关算法是比较类似的,只是编译器并不一定直接将计算结果常量压栈,而是可能将产生的临时变量压栈。这样,可以得到一个结论:编译器处理完一个表达式后,栈顶元素可能是一个常量或者变量。如果栈顶元素是常量,则表示该表达式的运算结果。如果栈顶元素是变量,则意味着该变量所存储的值就是表达式的运算结果。理解了这个结论以后,非终结符"表达式"将不再成为语句翻译的障碍。

表达式的翻译通常是独立于语句翻译而存在的,在语句翻译过程中,更多时候只是对表达式的运算结果作一定的类型检查。当然,这并不是绝对的,正如前面所说的,某些语言特性可能要求编译器将表达式与语句翻译统一规划。

根据if语句的语义,可以得到如表5-6所示的翻译方案。

表5-6  if语句的翻译方案

if语句

翻译方案

if then

else

(JNT, , null , __L1 )

(JMP, __L2 , null , null )

(LABEL, __L1 , null , null )

(LABEL, __L2 , null , null )

如果省略了else部分,那么只需将翻译方案中第4~6行语句省略,并将第7行的"__L2"替换为"__L1"即可。semantic068、semantic069、semantic070主要的功能就是根据翻译方案翻译输入的if语句。也就是说,试图依靠这三个语义子程序,完成翻译方案中黑体语句的生成。在上述翻译方案中,可以暂且将"__L1"称为"假分支标号",而将"__L2"称为"出口标号"。另外,需注意一点,当输入语句是if-then结构时,第7行语句的标号不应该取出口标号,而应该取假分支标号,因为此时并不存在真正意义的假分支,因此,可以将假分支标号当作出口标号使用。

【责任编辑:book TEL:(010)68476606】

点赞 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值