我正在编写一个转译器,可以将源语言翻译成C ++。为此,我使用了flex、bison和clang-AST。我将从空的AST开始,在解析每个语义动作时,我会向clang-AST添加节点。
问题在于,我找不到以编程方式构建AST的方法。假设我想为以下代码生成AST,但不使用RecursiveASTVisitor(因为我的源语言不是C ++)。
因此,可以生成AST的相应代码如下所示。
问题在于,我找不到以编程方式构建AST的方法。假设我想为以下代码生成AST,但不使用RecursiveASTVisitor(因为我的源语言不是C ++)。
#include <iostream>
int main()
{
std::cout << "Hello World " << std::endl;
return 0;
}
因此,可以生成AST的相应代码如下所示。
#include "clang/AST/ASTContext.h"
int main(int argc, const char **argv)
{
//Create an empty context
clang::ASTContext *context = new clang::ASTContext(NULL, NULL, NULL, NULL, NULL);
//Declare a main function
clang::FunctionDecl *FD = clang::FunctionDecl::Create(Context, "main");
//Declare params
std::vector<clang::ParmVarDecl*> NewParamInfo;
NewParamInfo.push_back(clang::ParmVarDecl::Create(Context, FD, "argc"));
NewParamInfo.push_back(clang::ParmVarDecl::Create(Context, FD, "argv"));
//set params to function
FD->setParams(ArrayRef<clang::ParmVarDecl*>(NewParamInfo));
//Declare a compund stament
clang::CompoundStmt *CS = new (Context) clang::CompoundStmt(clang::SourceLocation());
//Declare a Statement to print
clang::Stmt *S = new (Context) clang::ReturnStmt("std::cout << \"Hello World \" << std::endl;");
//Add print statement to compund statement
CS->setStmts(Context, S, 1);
//Add compund statement to body of function
FD->setBody(CS);
return 0;
}
上述代码并不是可用的代码,查看llvm或clang文档非常麻烦,有没有人能帮助我完成类似的工作?
#include <iostream>
正在拉取数万行代码(而您的AST生成程序中没有相应的功能)。 - Basile Starynkevitchclang::ReturnStmt("std::cout << \"Hello World \" << std::endl;")
并不是你想要的。 - Basile Starynkevitch