【问题标题】:Is the semantic analysis step in Clang an essential part of the compiler?Clang 中的语义分析步骤是编译器的重要组成部分吗?
【发布时间】: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


【解决方案1】:

语义分析是编译分析过程的一部分,通常在词法和语法分析之后进行。语义分析器检查使用的数据类型的有效性,进行类型转换等,并在有错误时报告。

换句话说,当涉及到语义分析时,编译器已经确定程序中使用了有效的词(词法),并且根据给定的语言语法(句法)正确地构建了句子。只剩下检查这些句子是否有意义 - 检查数据类型、返回值、大小边界、未初始化的变量等。

我对编译过程的了解对于 Clang 比较笼统而非具体,但我认为语义分析肯定存在于代码分析中。

【讨论】:

  • 如果 C++ 语法完全独立于类型,那将是正确的。不幸的是,如果不知道 a 是否是一个类型,您甚至无法正确解析 a * b;。
猜你喜欢
  • 2012-02-01
  • 2011-02-02
  • 2010-10-09
  • 2011-06-15
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
相关资源
最近更新 更多