llvm程序会生成多少个ast?

时间:2018-09-26 11:23:43

标签: llvm

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

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

1 个答案:

答案 0 :(得分:2)

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

那么说代码生成多个AST是否准确?种类-这完全取决于您的意思。

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

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


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

²同样,通过直接在解析器中生成LLVM IR而不编写任何AST,完全有可能编写基于LLVM的编译器。是否以及如何生成AST与LLVM完全无关。