【问题标题】:how many ast's a llvm program generate?一个llvm程序生成多少个ast?
【发布时间】:2018-09-26 21:46:41
【问题描述】:

我正在阅读 llvm 的编译器编写指南: https://llvm.org/docs/tutorial/LangImpl02.html

在该指南中,他们使用一种称为“万花筒”的简单语言作为示例。在阅读该指南之前,我的印象是每个程序都会生成一个 AST(我假设程序是写在一个文件上的,因此不需要链接)。但似乎 llvm 为每一行(或者更准确地说,为每个构造)创建了一个单独的 AST。因此,对于单个程序,llvm 可以创建数百个单独的 ast。这种解释正确吗?

【问题讨论】:

  • 阅读trees。 AST 是一个抽象语法 ,因此每个节点本身就是一个(子)树。

标签: llvm


【解决方案1】:

首先,请注意本章与 LLVM 并没有太大关系。它只是解释如何为该语言编写解析器和 AST。它不使用 LLVM 库中的任何代码¹,并且在根本不使用 LLVM 的项目中看起来也没有什么不同²。 LLVM 特定部分仅在您将 AST 转换为 LLVM IR 时才会出现。因此,如果有的话,不是 LLVM 生成“多个 AST”,而是教程中的代码生成了“多个 AST”。

那么说代码生成多个 AST 准确吗?有点 - 这完全取决于你的意思。

与任何树一样,AST 由多个子树组成。每个子树本身就是一棵有效的树。所以你可以说每棵非平凡树实际上都是多棵树的集合,这也适用于本教程中的 AST。

但重要的是要注意所有子树都是较大树的一部分。如果您的想法是这样,那么代码创建多个彼此不连接的树是不正确的。


¹ 除了 llvm::make_unique,如果您的编译器支持 C++14,也可以用 std::make_unique 替换,如果不支持,也可以使用您自己的实现。

² 类似地,通过直接在解析器中生成 LLVM IR 而根本不创建任何 AST 来编写基于 LLVM 的编译器也是完全可能的。您是否以及如何生成 AST 完全独立于 LLVM。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多