c++ - clang : What does AST (abstract syntax tree) look like?

标签 c++ clang abstract-syntax-tree

大家好,我是编译器开发的新手,想知道 AST 是什么样子的。我有一小段代码,我使用 Clang 生成 AST。我没有从中得到太多信息。 从外观上看,语法树与源代码完全相同,除了添加到我测试的几乎所有示例中的一个结构。

来源:

class A {
public:
  int *a, *b, *c;
  int i;
  void sum() {
    a = new int[5];
    b = new int[5];
    c = new int[5];
    for (i = 0; i < 5; i++) {
      a[i] = i;
      b[i] = i;
    }
    for (i = 0; i < 5; i++) {
      c[i] = a[i] + b[i];
    }
    delete[] a;   delete[] b;   delete[] c;
  }
};

class B : public A {
};

int main() {
  B bclass; 
  bclass.sum();
  return 0;
} 

生成AST的命令:

clang++ -cc1 -ast-print ~/sum.cpp

AST 输出:

struct __va_list_tag {
    unsigned int gp_offset;
    unsigned int fp_offset;
    void *overflow_arg_area;
    void *reg_save_area;
};
typedef struct __va_list_tag __va_list_tag;
class A {
public:
    int *a;
    int *b;
    int *c;
    int i;
    void sum()     {
        this->a = new int [5];
        this->b = new int [5];
        this->c = new int [5];
        for (this->i = 0; this->i < 5; this->i++) {
            this->a[this->i] = this->i;
            this->b[this->i] = this->i;
        }
        for (this->i = 0; this->i < 5; this->i++) {
            this->c[this->i] = this->a[this->i] + this->b[this->i];
        }
        delete [] this->a;
        delete [] this->b;
        delete [] this->c;
    }


};
class B : public A {
};
int main() {
    B bclass;
    bclass.sum();
    return 0;
}

谢谢

最佳答案

各种可用选项之间存在一个小的混淆:

  • -ast-print 将漂亮地打印当前的 AST,也就是说,它将呈现它理解的代码,尽可能接近它解析的代码(但使某些事情明确,例如幻影这个)
  • -ast-dump 将生成当前 AST 的类似 lisp 的表示

pretty-print 可用于检查 AST 是否无损(即,保留了此类表达式的 const 特性等...),但与开发无关。

如果你想破解编译器,你需要 -ast-dump,它将生成一个输出,直接映射已解析代码的内存表示。

关于c++ - clang : What does AST (abstract syntax tree) look like?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7935008/

相关文章:

python - 向抽象语法树中插入一个节点

Python 的 AST 函数

c++ - Fortran C++ 链接库

c++11 - 如何处理由空模板参数包扩展引起的未使用警告?

c++ - C++ 编译错误消息中的 __tpdsc__ 是什么意思?

通过标记连接创建包含通用字符名称的标识符

javascript - 什么是 JSXIdentifier 以及它与 AST 中的 Identifier 有何不同?

c++ - 具体卡牌组合指数如何计算

c++ - libevent:为什么 evutil_make_socket_nonblocking 在他们的例子中调用了两次

c++ - Qt:更改 centralWidget 时崩溃