先简单介绍一下各相关语义子程序的功能,以便读者理解和阅读源代码。
semantic071: 1、生成入口标号语句,即翻译方案中的第一个LABEL语句。
semantic073: 1、判断表达式的结果是否为布尔类型。
2、生成JNT语句,目标标号为出口标号。
semantic072: 1、生成JMP语句,目标标号为入口标号。
2、生成出口标号语句,即翻译方案中的第二个LABEL语句。
下面,就来看看while语句相关的语义子程序。(www.daowen.com)
程序5-7 semantic.cpp
semantic071的语义动作比较简单,就不再逐行分析。这里,读者应该注意一个要点,那就是严格区别入口标号与出口标号。相对而言,while结构比if结构更容易处理,因为并不需要区别类似于else的子句。Pascal的while是遵循经典while结构设置的,当然,在某些现代程序设计语言中,while结构可能会稍复杂,读者也应该注意。
程序5-8 semantic.cpp
这里,读者应注意有效性检查,主要是判断表达式结果的类型是否为布尔类型。这是Pascal语义强制规定的,不必评说其优劣。对于编译器设计者,这是应当遵守的设计准则。
程序5-9 semantic.cpp
在很多情况下,语句翻译的语义子程序是存在一定的相似的。从while语句与if语句翻译的语义子程序中,就不难得到这一结论。实际上,这种现象在翻译控制结构时较为常见。例如,for、while、repeat、if等都存在一定的雷同,即使它们本身的语义存在着较大的差异。因此,针对这几类控制结构的翻译,笔者不再对源代码进行逐行解释。在理解了while语句翻译的基础上,相信读者应该可以顺利地阅读相关源代码。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。