【问题标题】:How to get the AST of a single cpp file with clang?如何使用 clang 获取单个 cpp 文件的 AST?
【发布时间】:2013-11-13 17:49:22
【问题描述】:

我知道如果没有标题,它永远不会完全准确,因为 C++ 不是上下文无关的。

使用'A B(C);'的经典例子,表示可以识别为函数声明或对象定义。任何一个对我来说都很好。我只需要完全解析的文件。

我对代码的语义分析不感兴趣,只对语法和AFAIK clang 的语法是最好的之一。

问题在于,在某些情况下,clang 会在它不知道类型时避免一些声明,尽管我猜它可以正确解析它。

请参阅以下案例。 class.cpp的内容:

  A::A() { }

  A::~A() { }

  void A::B() { }

  A::C() { }

执行 clang 命令行应用程序:

$ clang -Xclang -ast-dump -fsyntax-only class.cpp

它只是将构造函数和最后一个方法识别为 AST 节点。

 typedef char *__builtin_va_list;

 int A() (CompoundStmt 0x9a6a570 <class.cpp:3:8, col:10>)

 int C() (CompoundStmt 0x9a6a600 <class.cpp:9:8, col:10>)

有没有办法得到完整的 AST 树?

谢谢!

【问题讨论】:

  • 您需要 AST 还是令牌? IE。你需要做什么?
  • @Eugene:我们如何获取令牌信息?

标签: c++ parsing clang libclang


【解决方案1】:

我不确定这是否是您需要的:

test.cpp

class A {
    A();
    ~A();
    void B();
    void C();
};

A::A() {}
A::~A() {}
void A::B() {}
void A::C() {}

要转储 AST,请使用:clang -Xclang -ast-dump -fsyntax-only test.cpp

TranslationUnitDecl 0x204f150 <<invalid sloc>> <invalid sloc>
|-TypedefDecl 0x204f690 <<invalid sloc>> <invalid sloc> implicit __int128_t '__int128'
|-TypedefDecl 0x204f6f0 <<invalid sloc>> <invalid sloc> implicit __uint128_t 'unsigned __int128'
|-TypedefDecl 0x204fab0 <<invalid sloc>> <invalid sloc> implicit __builtin_va_list '__va_list_tag [1]'
|-CXXRecordDecl 0x204fb00 <test.cpp:1:1, line:6:1> line:1:7 class A definition
| |-CXXRecordDecl 0x204fc10 <col:1, col:7> col:7 implicit class A
| |-CXXConstructorDecl 0x204fd10 <line:2:5, col:7> col:5 A 'void (void)'
| |-CXXDestructorDecl 0x2088cc0 <line:3:5, col:8> col:5 ~A 'void (void)'
| |-CXXMethodDecl 0x2088d90 <line:4:5, col:12> col:10 B 'void (void)'
| |-CXXMethodDecl 0x2088e50 <line:5:5, col:12> col:10 C 'void (void)'
| `-CXXConstructorDecl 0x2088f80 <line:1:7> col:7 implicit A 'void (const class A &)' inline noexcept-unevaluated 0x2088f80
|   `-ParmVarDecl 0x20890c0 <col:7> col:7 'const class A &'
|-CXXConstructorDecl 0x2089120 parent 0x204fb00 prev 0x204fd10 <line:8:1, col:9> col:4 A 'void (void)'
| `-CompoundStmt 0x2089218 <col:8, col:9>
|-CXXDestructorDecl 0x2089280 parent 0x204fb00 prev 0x2088cc0 <line:9:1, col:10> col:4 ~A 'void (void)'
| `-CompoundStmt 0x2089368 <col:9, col:10>
|-CXXMethodDecl 0x20893c0 parent 0x204fb00 prev 0x2088d90 <line:10:1, col:14> col:9 B 'void (void)'
| `-CompoundStmt 0x2089498 <col:13, col:14>
`-CXXMethodDecl 0x20894f0 parent 0x204fb00 prev 0x2088e50 <line:11:1, col:14> col:9 C 'void (void)'
  `-CompoundStmt 0x20895c8 <col:13, col:14>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-06
    • 2011-07-05
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 2013-01-31
    • 1970-01-01
    相关资源
    最近更新 更多