c++ - AST(抽象语法树)是由语言还是由前端定义的?
问题描述
在过去的几周里,我一直在试验 AST 和 Clang,尤其是 clang-tidy。
Clang 提供了一些类和与 AST 交互的方式,但我不明白我经常使用的clang::VarDecl是否是由 Clang 的创建者或语言的创建者命名和创建的。
谁决定将其称为 VarDecl?
我的意思是,AST(及其所有元素)是否来自语言发明者的思想,各种前端只是创建以他/她编写的文档命名的类,或者每个前端都可能创建给定的 AST源代码等 Clang 和 GCC 的不同?
解决方案
是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
。
推荐阅读
- node.js - 是否可以从使用 Express 创建的 CRUD 中删除锚标记?
- html - 如何通过 Chrome 扩展附加 HTML 标记而不会将主机页面的样式泄漏到附加元素?
- android - 如何修复在华为和三星设备中加载 GPS 位置
- android - 通过修改将视图转换为位图
- html - 添加必需属性后,选择框验证出现问题
- c - 编译一个简单的 C lua5.0 程序,未定义的引用
- python - 为什么继承另一个类的类不会产生与“另一个类”相同的结果?
- neo4j - neo4j中的pattern和shape有什么区别
- javascript - 在 JavaScript 中深度嵌套对象中获取对象的完整路径
- json - 转发器字段上 .csv 导入/导出的 Octobercms 问题