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生成一个直接映射已解析代码的内存表示的输出.
| 归档时间: |
|
| 查看次数: |
9813 次 |
| 最近记录: |