当前位置: 首页 > backend >正文

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
http://www.xdnf.cn/news/15829.html

相关文章:

  • string【下】- 补充
  • MySQL中的排序和分页
  • 集群与高可用
  • Facebook 开源多季节性时间序列数据预测工具:Prophet 饱和预测 Saturating Forecasts
  • Go并发聊天室:从零构建实战
  • Shell脚本-tee工具
  • 小程序和H5数据mock配置过程
  • 前端环境搭建---基于SpringBoot+MySQL+Vue+ElementUI+Mybatis前后端分离面向小白管理系统搭建
  • LLM 的Top-P参数 是在LLM中的每一层发挥作用,还是最后一层?
  • SpringBoot五分钟快速入门指南
  • NW993NX584美光固态闪存NX559NX561
  • [故障诊断方向]基于二维时频图像和数据增强技术的轴承故障诊断模型
  • 数据分析综合应用 30分钟精通计划
  • 动态规划——数位DP经典题目
  • 量子计算与AI融合的技术突破与实践路径
  • 6. 装饰器模式
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘pillow’问题
  • 小架构step系列19:请求和响应
  • Java行为型模式---中介者模式
  • [故障诊断方向]SNNs:针对小样本轴承故障诊断的孪生神经网络模型
  • Selenium 中 findElement 方法全解析:定位网页元素的 7 种方式
  • BeanFactory 和 FactoryBean 的区别
  • Java行为型模式---访问者模式
  • 用Dynamic chunk去干掉tokenizer?
  • 从零入门:云迁移原理详解与华为Rainbow实战指南
  • 数据结构 队列
  • 信息系统风险的安全技术防范思路
  • 教育科技内容平台的破局之路:从组织困境到 UGC 生态的构建
  • CCF编程能力等级认证GESP—C++7级—20250628
  • [FFmpeg] AVFormatContext、AVInputFormat、AVOutputFormat | libavformat