编译器(通常)如何进行语义分析?
我在上次考试中不得不回答这个问题,这对教授来说还不够。
我在回答中包含了 BNF(带有示例)和句法卡,他问我:“当编译器找到类似 的语句时会发生什么int i;
?”
编译器(通常)如何进行语义分析?
我在上次考试中不得不回答这个问题,这对教授来说还不够。
我在回答中包含了 BNF(带有示例)和句法卡,他问我:“当编译器找到类似 的语句时会发生什么int i;
?”
是时候仔细阅读 Aho&Ullman/Dragon 的书了。
语义分析是编译器确定各种值的类型是什么、这些类型如何在表达式中交互以及这些交互在语义上是否合理的活动。例如,您不能合理地将字符串乘以类名,尽管没有编辑器会阻止您编写
"abc" * MyClass
为此,编译器必须首先识别声明和范围,并且通常将此步骤的结果记录在一组符号表中。这告诉它特定标识符在特定上下文中的含义。它还必须确定各种文字常量的类型;“abc”是与 12.2e-5 不同的类型。
然后它必须访问所有使用标识符和文字的位置,并验证标识符/文字的使用以及计算的结果是否与语言定义兼容(如上例所示)。
至于如何做到这一点:通常会解析源代码,构建程序的一些表示(语法树非常流行),然后逐个元素地遍历(“访问”)表示以收集/验证语义信息。符号表通常只是一组与表示范围的语法树相关联的哈希表,从标识符散列到包含类型声明的结构。