仓颉 std.ast 二元表达式节点 BinaryExpr 全解析:构造、属性读写与宏/语法树实战
人工智能AI 技能文档开发工具【免费下载链接】DocAgent项目地址https://gitcode.com/Cangjie-SIG/DocAgent点击查看免费下载BinaryExpr是仓颉标准库std.ast包中表示二元操作表达式如a b、x - y的抽象语法树AST节点类。本文以 BinaryExpr 类文档 为骨架结合该包内 类 API 详解 与 官方示例 源码系统讲解其声明结构、两种构造方式、三个成员属性leftExpr/op/rightExpr的读写语义并给出在宏展开、语法树遍历与节点改写场景下的实战用法帮助读者在解析仓颉源码时准确识别与操作二元表达式。一、BinaryExpr 在 std.ast 中的定位std.ast包是仓颉语言的语法解析器与语法树节点库它可将仓颉源码的词法单元Tokens解析为抽象语法树节点对象包总览 中明确给出了parseExpr、parseDecl、parseProgram等解析入口。BinaryExpr正是表达式中最常见的节点类型之一凡形如a b、a - b的二元运算都会在语法树中以它表示。在节点的继承体系中它的位置如下Node所有仓颉语法树节点的父类Expr所有表达式节点的父类继承自NodeBinaryExpr继承自Expr表示二元操作表达式。BinaryExpr的类声明在 ast_package_classes.md 中给出public class BinaryExpr : Expr { public init() public init(inputs: Tokens) }它只暴露了两个构造函数没有额外的公开成员方法——对节点的操作全部通过三个public mut prop属性完成这体现了 AST 节点“结构化数据 可读写属性”的设计风格。二、两种构造方式默认构造与从词法单元构造1.init()默认构造构造一个空的BinaryExpr对象。创建后三个属性处于默认状态通常用于“自底向上”手工搭建语法树随后通过属性赋值填充左右表达式与操作符。2.init(inputs: Tokens)从词法单元构造public init(inputs: Tokens)传入一组词法单元集合Tokens由构造器内部完成语法解析并生成BinaryExpr节点。文档明确指出当输入的Tokens无法构造为BinaryExpr节点时会抛出 ASTException。例如传入的是一元表达式-a或赋值表达式a b的词法单元构造就会失败因为它们的节点类型分别是UnaryExpr与AssignExpr。三、三个核心属性leftExpr / op / rightExpr属性原型功能类型leftExprpublic mut prop leftExpr: Expr获取或设置操作符左侧的表达式节点Exproppublic mut prop op: Token获取或设置二元操作符TokenrightExprpublic mut prop rightExpr: Expr获取或设置操作符右侧的表达式节点Expr三者均为mut prop即可读可写。这一设计意味着对一个已解析出的BinaryExpr开发者既可以只读地提取其运算结构如宏中判断“这个加法操作符是什么”也可以直接改写其子节点如把a b改成a - b。其中op的类型是词法单元 Token。一个Token由kind词法单元类型见 TokenKind、value字面量值与pos源码位置三部分组成因此判断二元操作符时既可以比对op.value如也可以比对op.kind如ADD。四、op 属性的取值二元操作符与 TokenKind 对照op能承接的运算符种类由 TokenKind 定义。从 TokenKind_enum.md 的枚举值可以归纳出仓颉中常见的二元操作符及其对应的TokenKind如下操作符字面量TokenKind类别加ADD算术减-SUB算术乘*MUL算术除/DIV算术取模%MOD算术幂**EXP算术逻辑与AND逻辑逻辑或\|\|OR逻辑合并??COALESCING空值合并管道\|PIPELINE管道操作函数组合~COMPOSITION组合操作按位与BITAND位运算按位或\|BITOR位运算按位异或^BITXOR位运算左移LSHIFT位运算右移RSHIFT位运算等于EQUAL比较不等于!NOTEQ比较小于LT比较大于GT比较小于等于LE比较大于等于GE比较需要注意的边界情况并非所有二元符号都归BinaryExpr管辖。根据 类 API 详解 中各节点类的说明赋值类操作、等由 AssignExpr 表示区间操作..、..由 RangeExpr 表示类型检查is/as分别由 IsExpr 与 AsExpr 表示。从源码结构可以推断解析器会根据操作符种类分发到不同的节点类型只有“纯二元运算”才落到BinaryExpr。五、实战用 parseExpr 从源码解析出 BinaryExpr在宏或工具代码中最常见的做法是先通过 cangjieLex 或quote得到词法单元再用 parseExpr 解析出表达式节点最后用as类型转换取到BinaryExpr。参考 parse.md 示例 的模式写法如下import std.ast.* main() { let input: Tokens quote( a b * 2 ) let expr parseExpr(input) // 获取一个 Expr 表达式节点 var binExpr match (expr as BinaryExpr) { // 将表达式节点转换为 BinaryExpr case Some(v) v case None throw Exception() } // 读取操作符信息 println(op kind: ${binExpr.op.kind} value: ${binExpr.op.value}) println(left expr toTokens: ${binExpr.leftExpr.toTokens()}) println(right expr toTokens: ${binExpr.rightExpr.toTokens()}) 0 }结合 Token_struct.md 对Token的定义op.kind返回ADD这类枚举值op.value返回原始字符如op.pos则记录了操作符在源码中的行列位置——这些信息在生成诊断信息时非常有用。六、改写 BinaryExpr属性赋值与 toTokens 的括号规则由于三个属性都是mut prop可以直接对已解析的节点做“就地手术”。例如把a * b的左操作数从a改为a 1import std.ast.* main() { let input: Tokens quote( a * b ) let expr parseExpr(input) var binExpr match (expr as BinaryExpr) { case Some(v) v case None throw Exception() } // 改写左侧表达式将 a 替换为 a 1 binExpr.leftExpr parseExpr(quote(a 1)) // 序列化回词法单元并打印 println(binExpr.toTokens()) 0 }这里有一个关键行为Expr 类说明 中专门强调表达式节点的toTokens方法会根据操作符优先级添加括号。文档给出的原始例子是已有BinaryExpr节点a * b把左表达式内容a修改为a 1后toTokens会为左表达式自动补括号输出(a 1) * b从而保证改写后的文本依然保持正确的运算语义。这说明BinaryExpr的节点结构 toTokens序列化构成了“解析—改写—还原”的完整闭环是宏代码生成的重要基础。七、在 Visitor 遍历与宏场景中使用 BinaryExpr1. 继承 Visitor 定向处理traverse.md 示例 展示了通过继承 Visitor 并重写visit函数实现定向遍历的做法。同样的机制适用于BinaryExpr重写visit(binaryExpr: BinaryExpr)即可对语法树中所有二元表达式做统一处理例如统计某个文件中加法运算的个数、或收集所有出现??合并操作符的位置import std.ast.* class BinaryCollector : Visitor { public var count 0 override public func visit(binaryExpr: BinaryExpr) { if (binaryExpr.op.kind TokenKind.ADD) { count } return } } main(): Int64 { let input: Tokens quote( var r a b c ) let decl parseDecl(input) let collector BinaryCollector() decl.traverse(collector) println(ADD count is ${collector.count}) 0 }2. 在宏展开中生成与校验表达式std.ast的宏能力建立在“词法单元Tokens↔ AST 节点”互转之上context.md 示例 展示了宏内quote与parseExpr的配合用法。宏展开时可以先parseExpr拿到BinaryExpr检查其op.kind是否满足预期例如只允许算术运算不满足则通过 diagReport 报错满足后也可改写子表达式再toTokens()输出新的代码文本实现“语义化”的代码生成。八、关联文档与进一步阅读围绕BinaryExpr的更多细节与配套资料可在当前仓库中继续查阅类定义与属性/构造的完整原型std/ast/ast_package_api/ast_package_classes.md机器可读的 API 元数据BinaryExpr_class.json词法单元结构op属性的类型Token_struct.md操作符枚举全集op.kind的取值范围TokenKind_enum.md父类Expr与toTokens括号规则Expr_class.md同类节点对照赋值表达式 AssignExpr_class.md、一元表达式 UnaryExpr_class.md解析、操作、遍历示例parse.md、operate.md、traverse.md、context.md包级 API 总览std/ast/readme.md 与 ast_package_overview.md掌握BinaryExpr的构造、属性读写与toTokens行为即可在仓颉宏与 AST 工具链中自由识别、校验和生成二元运算代码是深入仓颉元编程的第一步。赞分享人工智能AI 技能文档开发工具【免费下载链接】DocAgent项目地址https://gitcode.com/Cangjie-SIG/DocAgent点击查看免费下载相关推荐仓颉 std.ast 语法树节点解析ArrayLiteral 数组字面量节点的构造、属性与实战用法仓颉 std.ast 语法树节点解析ArrayLiteral 数组字面量节点的构造、属性与实战用法 ArrayLiteral 是仓颉标准库 std.ast 包人工智能AI 技能文档开发工具仓颉语言 std.ast 包 AST 节点类全解析语法树类型体系与宏编程实践指南仓颉语言 std.ast 包 AST 节点类全解析语法树类型体系与宏编程实践指南 导读 仓颉编程语言的标准库 std.ast 包提供了源码语法解析器与完整的文档知识库教程OpenHarmony仓颉语言宏开发语法节点std.ast的解析、修改与 quote 插值实战仓颉语言宏开发语法节点std.ast的解析、修改与 quote 插值实战 本文深入讲解仓颉Cangjie编程语言宏体系中最重要的数据类型—— std.文档编程语言上一篇JustAuth中的位运算RandomUtil如何生成高效随机数下一篇WLED固件开发指南从源码编译到OTA更新全流程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

华为绩效管理体系解析:从战略解码到结果应用

华为绩效管理体系解析:从战略解码到结果应用

1. 华为绩效管理的核心逻辑华为的绩效管理体系本质上是一套将企业战略目标层层分解到每个员工的传导机制。这套体系最显著的特点是"以客户为中心"和"以奋斗者为本"的双轮驱动模型。在实际操作中,华为通过三个关键机制确保战略落地:首…

2026/10/14 5:57:19 阅读更多 →
Windows下PHP开发环境搭建与Xdebug调试指南

Windows下PHP开发环境搭建与Xdebug调试指南

1. 开发环境搭建全攻略作为在PHP开发领域摸爬滚打多年的老手,我见过太多开发者卡在环境配置的第一步。今天要分享的这套组合(VSCode Xdebug PHPStudy)是我经过数十个项目验证的黄金搭档,特别适合Windows平台下的PHP开发调试。先…

2026/10/14 5:56:19 阅读更多 →
AMD平台KDE背光故障深度修复指南

AMD平台KDE背光故障深度修复指南

1. 这不是“装完就跑”的系统,而是AMD平台KDE桌面的深度调校起点Manjaro KDE在AMD Ryzen/AMD GPU平台上开箱即用的程度,远比很多人想象中要复杂。标题里那个被轻描淡写带过的“驱动安装后续”,恰恰是绝大多数用户真正卡住、反复重装、甚至放弃…

2026/10/14 5:56:19 阅读更多 →

最新新闻

深度学习框架选型指南:PyTorch、TensorFlow、JAX、PaddlePaddle对比与实战

深度学习框架选型指南:PyTorch、TensorFlow、JAX、PaddlePaddle对比与实战

1. 从“选哪个框架”这个老问题说起如果你在深度学习这个圈子里待过一段时间,大概率会被问到或者问过别人一个问题:“我到底该学哪个框架?”这个问题几乎和“该学Python还是R”一样,属于入门阶段的经典纠结。但有意思的是&#xf…

2026/10/14 12:05:09 阅读更多 →
SQLite+FTS5+BM25实现可落地的上下文管理范式

SQLite+FTS5+BM25实现可落地的上下文管理范式

1. “context-mode”到底是什么?不是新框架,也不是黑科技,而是开发者日常里被忽略的上下文工程实践“context-mode”这个词最近在技术社区突然密集出现,尤其和MCP、SQLite、FTS5、BM25这些词高频共现。它既不是某个开源项目的官方…

2026/10/14 12:05:09 阅读更多 →
轻量大模型智能客服系统落地实践:RAG+状态感知+私有化部署

轻量大模型智能客服系统落地实践:RAG+状态感知+私有化部署

简介:本资源是一套基于大模型构建的智能客服对话系统完整工程实现,面向Java后端开发者、AI应用工程师及NLP方向学习者,解决企业级客服场景中意图理解、多轮对话管理与个性化响应生成等核心问题。项目以SpringAI为关键中间件,封装大…

2026/10/14 12:05:09 阅读更多 →
短视频无水印下载工具:原理与实现详解

短视频无水印下载工具:原理与实现详解

1. 项目背景与需求解析在短视频内容爆发的时代,很多用户都有保存优质视频素材的需求。但直接通过手机录屏会带有平台水印,影响二次创作和收藏体验。市面上虽然存在一些在线解析工具,但往往需要频繁复制链接、操作步骤繁琐,且存在隐…

2026/10/14 12:05:09 阅读更多 →
artcraft:构建创意工具链,实现从灵感到成品的可复用生产流程

artcraft:构建创意工具链,实现从灵感到成品的可复用生产流程

1. 从“artcraft”这个名字说起:它到底想解决什么问题第一次看到“artcraft”这个标题,我脑子里蹦出来的第一反应是——这大概率不是一个单纯的艺术项目,也不是一个纯粹的手工教程。把“art”和“craft”拼在一起,本身就带着一种“…

2026/10/14 12:05:09 阅读更多 →
artcraft 实战:从模糊灵感到可复现的创作流水线

artcraft 实战:从模糊灵感到可复现的创作流水线

1. 从“artcraft”这个名字说起:它到底想解决什么问题第一次看到“artcraft”这个词,我脑子里蹦出来的不是某个具体工具,而是一种很朴素的组合感——art 加 craft,艺术加手艺。这两个词放在一起,本身就带着一种张力&am…

2026/10/14 12:04:09 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →