理论教育 编译器设计之路:if语句翻译成果

编译器设计之路:if语句翻译成果

时间:2023-11-04 理论教育 版权反馈
【摘要】:理解了这个结论以后,非终结符“表达式”将不再成为语句翻译的障碍。表达式的翻译通常是独立于语句翻译而存在的,在语句翻译过程中,更多时候只是对表达式的运算结果作一定的类型检查。表5-6 if语句的翻译方案如果省略了else部分,那么只需将翻译方案中第4~6行语句省略,并将第7行的“_L2”替换为“_Ll”即可。

编译器设计之路:if语句翻译成果

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

if语句的标准文法如下:

【文法5-2】

978-7-111-32164-4-Chapter05-18.jpg

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

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

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

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

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

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

978-7-111-32164-4-Chapter05-19.jpg

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

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈