Compiler construction Clang中的语义分析步骤是编译器的重要部分吗?

Compiler construction Clang中的语义分析步骤是编译器的重要部分吗?,compiler-construction,clang,semantic-analysis,Compiler Construction,Clang,Semantic Analysis,我试图理解Clang的来龙去脉,但我对“Sema”库不是很确定。语义分析是否在编译器编译程序的路径中?或者它只是程序员用来分析他/她的代码 据我所知,解析器构建了一个AST,然后有一些“AST消费者”使用AST做不同的事情。因此,代码生成库将AST转换为IR。语义分析库使用AST分析代码。这种理解正确吗?还是语义分析器也用于编译?语义分析是编译分析过程的一部分,通常在词法和语法分析之后进行。语义分析器检查所用数据类型的有效性,进行类型转换等,如果有错误,则报告错误 换句话说,当涉及到语义分析时,

我试图理解Clang的来龙去脉,但我对“Sema”库不是很确定。语义分析是否在编译器编译程序的路径中?或者它只是程序员用来分析他/她的代码


据我所知,解析器构建了一个AST,然后有一些“AST消费者”使用AST做不同的事情。因此,代码生成库将AST转换为IR。语义分析库使用AST分析代码。这种理解正确吗?还是语义分析器也用于编译?

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

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


我对编译过程的了解更多的是关于Clang的,而不是具体的,但我认为语义分析肯定存在于代码分析中。

Clang有点奇怪:Sema不仅检查AST并插入隐式强制转换/声明/任何东西,而且还负责构建AST本身。对于编译器来说,这不是一种非常典型的安排。@SK逻辑它负责构建AST?但是解析器做什么呢?解析器如何与语义分析器交流它的发现呢?对于每个完整的表达式或语句,解析器都会直接调用Sema。涉及到一些中间结构(例如,用于表示已解析但尚未解析的类型),但最终的Clang AST是由Sema生成的。@SK logic这是一个非常巧妙的想法。因此,如果解析器单独构建AST,“解析树”是一个更好的术语吗?是的,它通常被称为“解析树”,所有进一步转换的中间表示形式都被称为“AST”。尽管这一区别相当模糊。在CLAN中,没有明显的解析树,它直接构建了语义验证(并且有点转换)AST(可能是出于性能原因)。如果C++语法完全独立于类型,那么这是正确的。不幸的是,你甚至不能解析
a*ba
是否为类型的情况下,代码>正确。