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

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.dtcms.com/a/289771.html

相关文章:

  • RGB颜色值如何转到灰度值
  • [每日随题14] 递推 - 滑动窗口 - 数学
  • JavaScript 中Object、Array 和 String的常用方法
  • java抗疫物质管理系统设计和实现
  • 【超分辨率专题】OSEDiff:针对Real-World ISR的单步Diffusion
  • [FDBUS 4.2]fdbus消息发送失败后的流程处理
  • SigLIP和SigLIP2
  • 题单【循环结构】
  • maven构建Could not transfer artifact失败原因
  • 系统思考:整体论
  • 【成品设计】基于STM32的家庭用水检测系统设计
  • 2025《艾诺提亚失落之歌》新手攻略
  • 看板中如何处理跨职能任务协作?
  • 大模型词表设计与作用解析
  • Autosar RTE实现观测量生成-基于ETAS软件
  • [Python] -项目实践2- 用Python快速抓取网页内容(爬虫入门)
  • python网络爬虫小项目(爬取评论)超级简单
  • 阶段1--Linux中的计划任务
  • 调试Claude code的正确姿势
  • 类型混淆、越界写入漏洞
  • 基于单片机出租车计价器设计
  • 重塑优化建模与算法设计:2024上半年大模型(LLM)在优化领域的应用盘点
  • Java入门-【3】变量、字符串、条件、循环、数组的简单总结
  • python 字典中取值
  • SQL189 牛客直播各科目同时在线人数
  • MySQL事物相关
  • Logback简单使用
  • 什么是SEO关键词优化的实战提升指南?
  • 如何系统化掌握角色设计与提示工程的深度整合
  • 基于Event Sourcing和CQRS的微服务架构设计与实战