【发布时间】:2012-07-16 19:00:28
【问题描述】:
我试图了解 Clang 的来龙去脉,但我不太确定“Sema”库。语义分析是否在编译器编译程序的路径中?还是只是程序员用来分析他/她的代码?
据我所知,解析器构建了一个 AST,然后有“AST 消费者”使用 AST 做不同的事情。因此,代码生成库将 AST 转换为 IR。语义分析库使用 AST 来分析代码。这种理解是否正确,还是语义分析器也用于编译?
【问题讨论】:
-
Clang 有点奇怪:Sema 不仅检查 AST 并插入隐式强制转换/声明/任何东西,而且还负责构建 AST 本身。对于编译器来说,这不是一个非常典型的安排。
-
@SK-logic 它负责构建 AST?但是解析器做了什么?解析器如何与语义分析器交流其发现?
-
解析器对每个完整的表达式或语句立即调用 Sema。涉及到一些中间结构(例如,用于表示已解析但尚未解析的类型),但最终的 Clang AST 由 Sema 生成。
-
@SK-logic 这是一个非常巧妙的想法。那么如果解析器单独构建 AST,“解析树”会是一个更好的术语吗?
-
是的,它通常被称为“解析树”,所有进一步转换的中间表示被称为“AST”。虽然这种区别相当模糊。在 clang 中,没有不同的解析树,它会立即构建经过语义验证(并且经过一定程度转换)的 AST(可能是出于性能原因)。
标签: compiler-construction clang semantic-analysis