首页 > 解决方案 > AST(抽象语法树)是由语言还是由前端定义的?

问题描述

在过去的几周里,我一直在试验 AST 和 Clang,尤其是 clang-tidy。

Clang 提供了一些类和与 AST 交互的方式,但我不明白我经常使用的clang::VarDecl是否是由 Clang 的创建者或语言的创建者命名和创建的。

谁决定将其称为 VarDecl?

我的意思是,AST(及其所有元素)是否来自语言发明者的思想,各种前端只是创建以他/她编写的文档命名的类,或者每个前端都可能创建给定的 AST源代码等 Clang 和 GCC 的不同?

标签: c++gcccompiler-constructionclangclang-tidy

解决方案


是AST,抽象语法树,由语言定义

没有充分。C++ 语言标准中的每个定义都带有一个简短的语法符号,并且有一个带有语法摘要的信息性附件。但附件说明https://eel.is/c++draft/gram

此 C++ 语法摘要旨在帮助理解。这不是该语言的准确表述。特别是,这里描述的语法接受有效 C++ 结构的超集。[...]

该语法中没有VarDecl标准的变量声明,只是对simple-declaration的一种解释。

还是前端?

编译器的内部,如果它有前端,或者没有,它有 3 或 1000 个阶段,是编译器实现的一部分。从语言的角度来看,编译器可以以任何它想要的方式实现,只要它正确地翻译有效的程序。假设一般来说,语言指定什么时候应该发生什么,而不是如何发生。

因此,要回答这个问题,AST(如果以任何形式使用的话)是由编译器定义的。

谁决定将其称为 VarDecl?

我很可能在https://github.com/llvm/llvm-project/commit/a11999d83a8ed1a2661feb858f0af786f2b829ad怀疑 Chris Lattner 。

这来自语言发明者的想法,各种前端只是创建以他/她编写的文档命名的类,或者每个前端都可能创建给定源代码的 AST,所以 Clang 和 GCC 是不同的?

当然,它们会受到标准中的内容的影响,但每个编译器都有自己的内部结构。好吧,简而言之,ClangVarDecl和 GCCVAR_DECL是不同的,它们在概念上也是不同的——比如说 GCC 使用switch(...) case VAR_DECL:和 Clang 使用 classes clang::VarDecl


推荐阅读