【问题标题】:Is the AST, abstract syntax tree, defined by the language or by the frontend?AST(抽象语法树)是由语言定义的还是由前端定义的?
【发布时间】:2021-12-22 00:24:01
【问题描述】:

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

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

谁决定将其称为 VarDecl?

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

【问题讨论】:

  • github.com/llvm/llvm-project/commit/… by the creators of Clang, or by the creators of the language 你指的是什么/哪种“语言”?你是说 C++ 编程语言?
  • 您正在查看特定编译器的内部结构。名称和含义不必与其他任何人协调。 gcc 的内部结构会非常不同。
  • 语法(或文法)是语言的一部分。编译器在处理过程中是否使用树不是语言关心的。您也可以在自然语言(如英语)上定义 AST(至少其中大多数 - 有些语言没有非常分层的语法结构)。
  • @KamilCuk 对不起,你是对的,我指的是 C++。
  • 而“前端”指的是编译器?

标签: c++ gcc compiler-construction clang clang-tidy


【解决方案1】:

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

不完全。 C++ 语言标准中的每个定义都带有一个简短的syntax notation,并且有一个带有语法摘要的信息性附件。但附件说明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 是不同的?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多