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