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