Clang:AST(抽象语法树)是什么样的?

Sri*_*ali 10 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;
} 
Run Code Online (Sandbox Code Playgroud)

生成AST的命令:

clang++ -cc1 -ast-print ~/sum.cpp
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Mat*_* M. 16

各种选择之间存在一些小混淆:

  • -ast-print将相当打印当前的AST,也就是说,它会将它理解的代码尽可能地与它解析的内容进行渲染(但是使一些事物显而易见,就像显示的那样this)
  • -ast-dump 将生成当前AST的类似lisp的表示

漂亮的打印机可以用来检查AST是无损的(即,保留了const这种表达的性质等等),但实际上并不是关于开发.

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


Pas*_*uoq 5

AST是内存中的一个链接结构("树"不公正事物的复杂性,但它是人们使用的名称).什么-ast-print产生的是AST的文本表示.由于设置选项的人已经熟悉类似C/C++的语法,因此它将以遵循该语法的表示形式打印.这是一个设计选择,而不是一个快乐的巧合.

如果你想看看AST在熟悉的语法中没有故意打印时的样子,你可以看看GIMPLE,GCC的内部表示.

  • 警告:GIMPLE难以理解且操作起来很麻烦. (3认同)