Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多少ast';什么是llvm程序生成的?_Llvm - Fatal编程技术网

多少ast';什么是llvm程序生成的?

多少ast';什么是llvm程序生成的?,llvm,Llvm,我正在阅读llvm的编译器编写指南: 在该指南中,他们使用了一种叫做“万花筒”的简单语言作为例子。在阅读该指南之前,我的印象是每个程序都会生成一个AST(我假设该程序写在一个文件上,因此不需要链接)。但llvm似乎为每一行(或者更准确地说,为每一个构造)创建了一个单独的AST。因此,对于单个程序,llvm可以创建数百个单独的ast。这个解释正确吗 首先,请注意,本章实际上与LLVM没有太多关系。它只是解释如何为该语言编写解析器和AST。它不使用LLVM库中的任何代码,在一个根本不使用LLVM的

我正在阅读llvm的编译器编写指南:


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

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

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

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

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


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

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

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