【摘要】:常量声明部分的语义处理主要完成常量信息表的登记。前面已经讲过,词法分析器可以识别得到字面常量值,并将其登记入常量信息表。不过,词法分析器却无法获得常量的符号信息。程序4-6 semantic.cpp第3行:获取常量的名字标识符。由于文法定义顺序的原因,对于同一级别的过程而言,编译器将在分析完标号声明部分之后,再分析常量声明部分。在讨论词法分析器时,笔者介绍过词法分析器是如何处理字面常量的。
常量声明部分的语义处理主要完成常量信息表的登记。前面已经讲过,词法分析器可以识别得到字面常量值,并将其登记入常量信息表。不过,词法分析器却无法获得常量的符号信息。维护、补充常量信息的工作就必须由语义处理来完成。常量声明的相关文法如下:
【文法4-5】
其中只包含了一个语义子程序semantic004。
程序4-6 semantic.cpp
第3行:获取常量的名字标识符。根据semantic004在候选式中的位置,必须向前搜索3个单词,才能获取常量的名字标识符。根据语法制导的特点,这样的搜索绝对是安全的,所以不必作任何判断。(www.daowen.com)
第4~6行:判断标识符是否已被占用。这里的判定条件与标号声明的判定条件有一定区别。由于文法定义顺序的原因,对于同一级别的过程而言,编译器将在分析完标号声明部分之后,再分析常量声明部分。因此,这里必须增加对标号信息表的重名判断。
第9行:申请一个临时指针指向常量信息表中的相应表项。在讨论词法分析器时,笔者介绍过词法分析器是如何处理字面常量的。首先,将常量值记录在常量信息表中。然后,利用单词的m_szContent属性将该常量值在常量信息表中的位序号传递给后续阶段。这里,就是利用单词的m_szContent属性获取常量信息表中的相应表项,便于更新相关属性。
第11行:更新该常量表项的名字信息。
第12行:更新该常量表项的所属过程信息。不仅在Pascal语言中,大多数程序设计语言都是如此,常量与变量类似,也存在作用域、可见域等。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
有关编译器设计之路的文章