编译器中的语义分析

时间:2012-01-03 14:18:10

标签: compiler-construction semantics compiler-theory semantic-analysis

编译器(通常)如何完成语义分析?

我在上次考试时不得不回答这个问题,这对教授来说还不够。

我在答案中包含了BNF(带有示例)和语法卡片,他问我:“当编译器找到像int i;这样的语句时会发生什么?”

1 个答案:

答案 0 :(得分:7)

时间仔细阅读Aho& Ullman / Dragon书。

语义分析是编译器的活动,用于确定各种值的类型是什么,这些类型如何在表达式中交互,以及这些交互在语义上是否合理。例如,您不能合理地将字符串乘以类名,尽管没有编辑器会阻止您编写

 "abc" * MyClass

为此,编译器必须首先识别声明和范围,并且通常将此步骤的结果记录在一组符号表中。这告诉它特定标识符在特定上下文中的含义。它还必须确定各种文字常数的类型; “abc”与12.2e-5不同。

然后它必须访问使用标识符和文字的所有位置,并验证标识符/文字的使用以及计算的结果是否与语言定义兼容(如上例所示)。

至于如何这样做:通常解析源代码,构造程序的某些表示(语法树非常流行),并且该表示是步行(“访问”)元素按元素收集/验证语义信息。符号表通常只是一组与表示范围的语法树相关联的哈希表,从标识符到包含类型声明的结构的散列。