LLVM中AST节点类型
Clang 的抽象语法树(AST)由多种节点类型组成,主要分为 Decl(声明)、Stmt(语句) 和 **Expr(表达式)
1. Decl(声明节点)
表示程序中的各种声明(如函数、变量、类型等)。
- FunctionDecl: 函数声明或定义(如 int foo(int x);)
- VarDecl:变量声明(如 int a = 10;)
- ParmVarDecl: 函数参数声明(如 void bar(int param); 中的 param)
- CXXRecordDecl: C++ 类/结构体/联合体声明(如class MyClass {};
- CXXMethodDecl: C++ 类成员函数声明(如 void MyClass::method())
- EnumDecl: 枚举类型声明(如 enum Color { Red, Green };)
- TypedefDecl: 类型别名声明(如 typedef int MyInt;)
- NamespaceDecl: 命名空间声明(如 namespace NS {})
- TemplateDecl: 模板声明(如 template class Vector;)
2. Stmt(语句节点)
表示程序中的语句(如控制流、复合语句等)。
- CompoundStm:复合语句(由{} 包裹的代码块)
- ReturnStmt:return 语句(如 return 0;)
- IfStmt:if 条件语句(包含条件、then 分支、else 分支)
- ForStmt:for` 循环语句
- WhileStmt:while` 循环语句
- DoStmt:do-while` 循环语句
- SwitchStmt:switch` 语句
- CaseStmt:case标签(如 case 1: …)
- BreakStmt:break语句
- ContinueStmt:continue 语句
- DeclStmt: 变量声明语句(如 int x;)
3. Expr(表达式节点)
表示程序中的表达式(如运算、函数调用等)。
- CallExpr:函数调用表达式(如 func(10))
- BinaryOperator:二元运算符表达式(如 a + b、x > y)
- UnaryOperator:一元运算符表达式(如 -x、!flag)
- DeclRefExpr:对已声明实体的引用(如变量、函数名)
- IntegerLiteral:整数字面量(如 `42)
- FloatingLiteral:浮点数字面量(如 3.14)
- StringLitera:字符串字面量(如 “Hello”)
- ImplicitCastExpr: 隐式类型转换(如 int → double)
- ArraySubscriptExpr: 数组下标访问(如 arr[5])
- MemberExpr:类成员访问(如 obj.member)
- ConditionalOperator:三目运算符(如 a ? b : c)
4. C++ 特有节点
针对 C++ 特性的扩展节点:
- CXXConstructExpr: 构造函数调用(如 MyClass obj;)
- CXXNewExpr:new表达式(如 new MyClass()`)
- CXXDeleteExpr:delete 表达式(如 delete ptr)
- LambdaExpr:Lambda 表达式(如 { … })
- TemplateArgument:模板参数(如 std::vector 中的 int)
5. 其他重要节点
- Type:表示类型信息(如 int、float),非 AST 节点,但与节点关联。
- QualType`** | 带有修饰符的类型(如 const int&
查看 AST 节点结构
使用 Clang 命令生成 AST 转储:
clang -Xclang -ast-dump -fsyntax-only code.cpp