compiler-construction - 编译器中的语义分析

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

编译器(通常)如何进行语义分析?

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

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

最佳答案

是时候仔细阅读 Aho&Ullman/Dragon 的书了。

语义分析是编译器确定各种值的类型、这些类型如何在表达式中交互以及这些交互在语义上是否合理的事件。例如,您无法合理地将字符串与类名相乘,尽管没有编辑器会阻止您编写

 "abc" * MyClass

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

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

至于如何完成此操作:通常会解析源代码,构造程序的某种表示(语法树非常流行),然后遍历(“访问”)元素来表示该表示按元素收集/验证语义信息。符号表通常只是一组与表示范围的语法树关联的哈希表,从标识符哈希到包含类型声明的结构。

关于compiler-construction - 编译器中的语义分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8713613/

相关文章:

optimization - 是否有优化浮点运算以提高精度(而不是速度)的编译器?

c++ - 右值参数如何工作?

uml - UML 中的语义关系

regex - 生成与某些输入集匹配的正则表达式是否是一个可解决的问题?

compiler-construction - 如果我从其字母表中删除一个字符,我如何证明一种语言是上下文无关的?

c# - 当对象设置为 null 时,针对 CLR 的编译器能否生成 Dispose 方法调用?

java - 在 block 中连续使用相同的方法会重新计算该方法吗?

design-patterns - 窥孔优化模式

xml - 如何使用受控词汇表或分类法来定义 XML 元素名称或属性名称?

assembly - P6 架构 - 除了寄存器重命名之外,有限的用户寄存器是否会导致更多的操作花费在溢出/加载上?