作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
大家好,我是编译器开发的新手,想知道 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/
我是一名优秀的程序员,十分优秀!