c++ - 解析 Clang AST - 缩进级别和起始符号

标签 c++ parsing clang

我必须手动解析 Clang AST,但是我在理解用于描述节点之间链接的缩进规则时遇到了一些困难。让我们举一个简单的例子。对于以下代码,

int f(int x) {
  int result = (x / 42);
  return result;
}

生成的 AST 为

... cutting out internal declarations of clang ...
`-FunctionDecl 0x5aeab50 <test.cc:1:1, line:4:1> f 'int (int)'
  |-ParmVarDecl 0x5aeaa90 <line:1:7, col:11> x 'int'
  `-CompoundStmt 0x5aead88 <col:14, line:4:1>
    |-DeclStmt 0x5aead10 <line:2:3, col:24>
    | `-VarDecl 0x5aeac10 <col:3, col:23> result 'int'
    |   `-ParenExpr 0x5aeacf0 <col:16, col:23> 'int'
    |     `-BinaryOperator 0x5aeacc8 <col:17, col:21> 'int' '/'
    |       |-ImplicitCastExpr 0x5aeacb0 <col:17> 'int' <LValueToRValue>
    |       | `-DeclRefExpr 0x5aeac68 <col:17> 'int' lvalue ParmVar 0x5aeaa90 'x' 'int'
    |       `-IntegerLiteral 0x5aeac90 <col:21> 'int' 42
    `-ReturnStmt 0x5aead68 <line:3:3, col:10>
      `-ImplicitCastExpr 0x5aead50 <col:10> 'int' <LValueToRValue>
        `-DeclRefExpr 0x5aead28 <col:10> 'int' lvalue Var 0x5aeac10 'result' 'int'

注意:为了避免引号符号出现格式问题,我将其替换为 \

  • 我真的不明白什么时候我们可以判断两个节点具有相同的父节点。我显然明白这取决于识别级别,但例如第三行以 \- 开头,所以我猜 \ 意味着 CompoundStmt > 是ParmVarDecl 的子级。然而,缩进级别是相同的。

  • 第 4 行,DeclStmt 比上一行缩进更多,但没有 \ 符号,因此它被视为 的子节点compoundStmt 或其子项?

  • 最后,在DeclStmt中,我们有越来越多的以\-开头的缩进行,这和第3行(从\- 也是如此,但缩进级别与上一行相同)?

有人可以向我解释一下这个起始符号和缩进级别的语义吗?

最佳答案

将它们的角符号(它们限制为 ASCII)替换为 unicode U+2514 方框图会亮起并向右,您会看得更清楚:

... cutting out internal declarations of clang ...
└─FunctionDecl 0x5aeab50 <test.cc:1:1, line:4:1> f 'int (int)'
  ├─ParmVarDecl 0x5aeaa90 <line:1:7, col:11> x 'int'
  └─CompoundStmt 0x5aead88 <col:14, line:4:1>
    ├─DeclStmt 0x5aead10 <line:2:3, col:24>
    │ └─VarDecl 0x5aeac10 <col:3, col:23> result 'int'
    │   └─ParenExpr 0x5aeacf0 <col:16, col:23> 'int'
    │     └─BinaryOperator 0x5aeacc8 <col:17, col:21> 'int' '/'
    │       ├─ImplicitCastExpr 0x5aeacb0 <col:17> 'int' <LValueToRValue>
    │       │ └─DeclRefExpr 0x5aeac68 <col:17> 'int' lvalue ParmVar 0x5aeaa90 'x' 'int'
    │       └─IntegerLiteral 0x5aeac90 <col:21> 'int' 42
    └─ReturnStmt 0x5aead68 <line:3:3, col:10>
      └─ImplicitCastExpr 0x5aead50 <col:10> 'int' <LValueToRValue>
        └─DeclRefExpr 0x5aead28 <col:10> 'int' lvalue Var 0x5aeac10 'result' 'int'

使用了更多的画框字符来美化线条...

关于c++ - 解析 Clang AST - 缩进级别和起始符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28118769/

相关文章:

c++ - 在模板实例化期间重载查找

C++ 友元运算符重载嵌套枚举的模板参数

c++ - 有没有办法,或者说 'accepted'是什么办法让所有windows都运行在当前进程下?

c++ - 添加多个相同类型的 boost::error_infos 到一个 boost::exception

c - 我如何在 AWK 中解析 C switch-case 和 for Statement?

python - 获取 element.tagName 的问题。使用 Python 和 xml.dom.minidom 解析 XML

c++ - 如何使用 ostream_iterator 显示对象的属性。?

c++ - 顶部内存泄漏分析

java - 部分读取xml文件

gcc - x86_64 上的软浮点