Я пишу транспортер, который может переводить исходный язык на C ++.Для этой цели я использую flex, bison и clang-AST.Я начну с пустого AST и с каждым семантическим действием при разборе я буду добавлять узлы в Clang-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, PITA, кто-нибудь может мне помочь, кто проделал подобную работу?