построение лягушки AST программно - PullRequest
0 голосов
/ 27 декабря 2018

Я пишу транспортер, который может переводить исходный язык на 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, кто-нибудь может мне помочь, кто проделал подобную работу?

...