Files
endorphin-aster-vm/crates/frontend/editor/ast.ts
T

547 lines
34 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Generated by scripts/generate_ast.py from Endor.asdl. Do not edit.
// 与 Rust wire 共同核对的 ASDL 原文协议身份;生成源码注释不改变此值。
export const AST_SCHEMA_ID = "urn:endor:ast:sha256:21b0349ac295d9bc8cedcad8f07d8e2d45cf220e19e7c2fad10269555fcfd71a" as const;
// 原 UTF-8 半开字节范围;number 类型本身不验证安全整数、顺序或原文边界。
export interface Span { start: number; end: number; }
// 宿主/编辑器传输的版本化语法文档,wire 校验后供 compiler 使用。
// schema: 协议身份,wire 按 AST_SCHEMA_ID 核对;不是源码内容哈希。
// root: 拥有的语法根,文档校验及编译从这里递归。
export type AstDocument = { schema: typeof AST_SCHEMA_ID; root: AstRoot; };
// parse_ast 按模式构造的模块、表达式或交互根,compiler 据此选择生成入口。
// Module: 模块根,包含函数/类声明。
// Module.body: 当前模式选中的模块、表达式或交互根载荷,compiler 按对应构造器生成入口代码。
// Expression: 表达式根,编译后直接返回求值结果。
// Expression.body: 当前模式选中的模块、表达式或交互根载荷,compiler 按对应构造器生成入口代码。
// Interactive: 交互根,包含一次完整提交。
// Interactive.body: 当前模式选中的模块、表达式或交互根载荷,compiler 按对应构造器生成入口代码。
export type AstRoot = { kind: "Module"; data: Program; } | { kind: "Expression"; data: Expr; } | { kind: "Interactive"; data: InteractiveInput; };
// parser 复制的名称文本与位置,用于声明、类型注解或属性名。
// text: 拥有名称文本,不依赖输入缓冲存活。
// span: 原始 UTF-8 文本的半开字节范围,定位与父子范围校验共用;不是字符列。
export type Name = { text: string; span: Span; };
// 模块声明序列,compiler 先注册全部顶层名称再分析各函数体。
// declarations: 按源码顺序的声明;源码模块解析要求非空,文档结构本身不限制数量。
// span: 原始 UTF-8 文本的半开字节范围,定位与父子范围校验共用;不是字符列。
export type Program = { declarations: Array<Decl>; span: Span; };
// 顶层/交互声明的种类及完整范围,compiler 按函数或类分派。
// kind: 函数/类声明载荷,JSON 和类型采用 kind/data 标签。
// span: 原始 UTF-8 文本的半开字节范围,定位与父子范围校验共用;不是字符列。
export type Decl = { kind: DeclKind; span: Span; };
// 函数与类声明的判别载荷,外层 Decl 另外保存完整跨度。
// Function: 显式参数/返回注解与函数体,compiler 生成独立模板及源码签名;解析本身不调用函数。
// Function.definition: 函数或类的完整声明,包含其名称、成员/参数及原文范围。
// Class: 类名、可选基类、字段和方法,compiler 检查成员后生成构类指令。
// Class.definition: 函数或类的完整声明,包含其名称、成员/参数及原文范围。
export type DeclKind = { kind: "Function"; data: Function; } | { kind: "Class"; data: Class; };
// 类名、可选基类、字段和方法,compiler 检查成员后生成构类指令。
// name: 类声明名与精确位置。
// base: 显式基类名,可省略;当前 compiler 对省略项使用 Object。
// fields: 按出现顺序的字段名称/类型注解,不含方法。
// methods: 按出现顺序的方法;显式 self 约束由 compiler 检查。
// span: 原始 UTF-8 文本的半开字节范围,定位与父子范围校验共用;不是字符列。
export type Class = { name: Name; base?: Name | null; fields: Array<Parameter>; methods: Array<Function>; span: Span; };
// 显式参数/返回注解与函数体,compiler 生成独立模板及源码签名;解析本身不调用函数。
// name: 函数/方法名,代码模板沿用为诊断名称。
// parameters: 位置参数列表,compiler 依次分配前部局部槽。
// return_type: 返回类型名,生成源码签名后由运行时解析。
// body: 独立函数作用域的语句体,当前源码不支持嵌套声明闭包。
// span: 原始 UTF-8 文本的半开字节范围,定位与父子范围校验共用;不是字符列。
export type Function = { name: Name; parameters: Array<Parameter>; return_type: Name; body: Block; span: Span; };
// 函数参数或类字段共用的名称/类型注解,实际类型身份由运行时环境解析。
// name: 参数/字段名,用于布局和重复检查。
// type_name: 声明类型名,前端只保留文本与位置。
// span: 原始 UTF-8 文本的半开字节范围,定位与父子范围校验共用;不是字符列。
export type Parameter = { name: Name; type_name: Name; span: Span; };
// 顺序语句块,compiler 检查确定初始化并按语句生成指令。
// statements: 有序语句列表,不引入独立块级局部作用域。
// span: 原始 UTF-8 文本的半开字节范围,定位与父子范围校验共用;不是字符列。
export type Block = { statements: Array<Stmt>; span: Span; };
// 语句种类及原文范围,compiler 处理副作用、控制流或返回。
// kind: 具体语句载荷,外层另存整句范围。
// span: 原始 UTF-8 文本的半开字节范围,定位与父子范围校验共用;不是字符列。
export type Stmt = { kind: StmtKind; span: Span; };
// 语句判别载荷,parser 选择分支,compiler 按绑定、赋值、控制流等规则处理。
// Binding: let 新绑定,compiler 检查重名并分析右值后才标记目标已初始化。
// Binding.binding: let 新绑定,compiler 先分析/求右值,再登记目标初始化。
// Assignment: 普通名称赋值,compiler 按作用域写局部槽或全局环境。
// Assignment.assignment: 普通名称或成员赋值的完整节点,compiler 据构造器选择槽写入或属性写入。
// MemberAssignment: 成员写入的对象、属性名与右值,compiler 生成 StoreAttr。
// MemberAssignment.assignment: 普通名称或成员赋值的完整节点,compiler 据构造器选择槽写入或属性写入。
// If: 条件、then 和可选 else,compiler 合并继续路径的初始化集合并生成跳转。
// If.statement: 条件、循环或返回节点,compiler 按构造器处理路径、跳转或帧出口。
// While: 循环条件与体,compiler 生成回边并处理循环可能零次执行。
// While.statement: 条件、循环或返回节点,compiler 按构造器处理路径、跳转或帧出口。
// Return: 函数返回,compiler 对缺省值补 Nil;当前源码语法要求 return 后有表达式。
// Return.statement: 条件、循环或返回节点,compiler 按构造器处理路径、跳转或帧出口。
// Expression: 表达式载荷及完整范围,compiler 生成留下一个结果的求值序列。
// Expression.expression: 语句位置的表达式;函数块丢弃结果,交互根可把它作为返回值。
// Declaration: 顶层/交互声明的种类及完整范围,compiler 按函数或类分派。
// Declaration.declaration: 交互根中的函数/类声明,compiler 预登记名称;嵌套声明当前被拒绝。
export type StmtKind = { kind: "Binding"; data: Binding; } | { kind: "Assignment"; data: Assignment; } | { kind: "MemberAssignment"; data: MemberAssignment; } | { kind: "If"; data: IfStatement; } | { kind: "While"; data: WhileStatement; } | { kind: "Return"; data: ReturnStatement; } | { kind: "Expression"; data: Expr; } | { kind: "Declaration"; data: Decl; };
// let 新绑定,compiler 检查重名并分析右值后才标记目标已初始化。
// name: let 目标名,重复声明由语义分析拒绝。
// value: 绑定右值,本局部不能在初始化前读取自身。
// span: 原始 UTF-8 文本的半开字节范围,定位与父子范围校验共用;不是字符列。
export type Binding = { name: Name; value: Expr; span: Span; };
// 普通名称赋值,compiler 按作用域写局部槽或全局环境。
// name: 普通赋值目标,函数内首次赋值可预分配局部槽。
// value: 先求右值再更新目标。
// span: 原始 UTF-8 文本的半开字节范围,定位与父子范围校验共用;不是字符列。
export type Assignment = { name: Name; value: Expr; span: Span; };
// 成员写入的对象、属性名与右值,compiler 生成 StoreAttr。
// object: 属性写入接收对象表达式,前端不求值。
// name: 待写属性名,compiler 加入名字表。
// value: 待写右值,当前 compiler 先于接收对象生成求值以匹配 VM 栈布局。
// span: 原始 UTF-8 文本的半开字节范围,定位与父子范围校验共用;不是字符列。
export type MemberAssignment = { object: Expr; name: Name; value: Expr; span: Span; };
// 条件、then 和可选 else,compiler 合并继续路径的初始化集合并生成跳转。
// condition: 条件表达式,运行时按真值协议选择分支。
// body: 条件为真的 then 块。
// otherwise: 可选 else 块,缺省时存在直接继续路径。
// span: 原始 UTF-8 文本的半开字节范围,定位与父子范围校验共用;不是字符列。
export type IfStatement = { condition: Expr; body: Block; otherwise?: Block | null; span: Span; };
// 循环条件与体,compiler 生成回边并处理循环可能零次执行。
// condition: 每轮重新求值的条件,假值退出。
// body: 循环体,可能一次也不执行。
// span: 原始 UTF-8 文本的半开字节范围,定位与父子范围校验共用;不是字符列。
export type WhileStatement = { condition: Expr; body: Block; span: Span; };
// 函数返回,compiler 对缺省值补 Nil;当前源码语法要求 return 后有表达式。
// value: 可选返回表达式,手工 AST 缺省时由 compiler 补 Nil。
// span: 原始 UTF-8 文本的半开字节范围,定位与父子范围校验共用;不是字符列。
export type ReturnStatement = { value?: Expr | null; span: Span; };
// 单次交互提交容器,parser 产生一条语句,compiler 也检查数量,不保存宿主会话环境。
// statements: 当前 parse/compile 约定恰好一个完整提交的语句。
// span: 原始 UTF-8 文本的半开字节范围,定位与父子范围校验共用;不是字符列。
export type InteractiveInput = { statements: Array<Stmt>; span: Span; };
// 表达式载荷及完整范围,compiler 生成留下一个结果的求值序列。
// kind: 求值形状,不缓存名称解析或运行时类型。
// span: 原始 UTF-8 文本的半开字节范围,定位与父子范围校验共用;不是字符列。
export type Expr = { kind: ExprKind; span: Span; };
// 名称、字面量、等待、运算和调用等表达式载荷,范围由外层 Expr 提供。
// Name: 变量引用文本,compiler 决定局部槽或全局索引。
// Name.text: 名称引用原文,由 compiler 名称分析解析到局部槽或全局名字表。
// Number: 原始十进制拼写,保留全部位数、前导零及尾零,不转浮点。
// Number.spelling: 原始数字拼写,compiler 构造精确数值;不把文本先转为二进制浮点。
// String: 已解码受支持转义的拥有文本,原引号范围在外层 Expr。
// String.value: 字符串解码后的拥有文本,原引号和转义仍可通过外层范围读取。
// Symbol: 点开头的符号名,前端可表示,当前 compiler 拒绝生成运行时值。
// Symbol.name: 成员或符号名,不是已解析的运行时属性句柄。
// Await: 等待子表达式,VM 执行上下文决定是否允许停放。
// Await.operand: 一元子表达式,Rust 的递归回边间接存储。
// Unary: 一元取负,可在纯数值链上合并符号。
// Unary.operation: 运算种类,决定算术、比较或取负指令。
// Unary.operand: 一元子表达式,Rust 的递归回边间接存储。
// Binary: 左右操作数及算术/比较种类,保留解析优先级树。
// Binary.operation: 运算种类,决定算术、比较或取负指令。
// Binary.left: 二元左操作数,当前 compiler 先于右侧求值。
// Binary.right: 二元右操作数,与左侧一起被运行时运算消费。
// Member: 接收对象及属性名的读取。
// Member.object: 成员读取接收对象。
// Member.name: 成员或符号名,不是已解析的运行时属性句柄。
// Call: 被调用表达式与位置实参,由 VM 实际求值。
// Call.callee: 调用目标,先于实参求值。
// Call.arguments: 有序位置实参,AST 不隐式添加接收者。
export type ExprKind = { kind: "Name"; data: string; } | { kind: "Number"; data: string; } | { kind: "String"; data: string; } | { kind: "Symbol"; data: Name; } | { kind: "Await"; data: Expr; } | { kind: "Unary"; data: { operation: UnaryOp; operand: Expr; }; } | { kind: "Binary"; data: { operation: BinaryOp; left: Expr; right: Expr; }; } | { kind: "Member"; data: { object: Expr; name: Name; }; } | { kind: "Call"; data: { callee: Expr; arguments: Array<Expr>; }; };
// 一元运算种类,compiler 合并纯数值负号或生成运行时取负。
// Negate: 一元取负。
export type UnaryOp = "Negate";
// 二元算术/比较种类,parser 保留优先级树,compiler 映射为对应 VM 操作。
// Add: 加法。
// Subtract: 减法。
// Multiply: 乘法。
// Divide: 除法。
// Equal: 相等比较。
// NotEqual: 不等比较。
// Less: 小于比较。
// LessEqual: 小于等于比较。
// Greater: 大于比较。
// GreaterEqual: 大于等于比较。
export type BinaryOp = "Add" | "Subtract" | "Multiply" | "Divide" | "Equal" | "NotEqual" | "Less" | "LessEqual" | "Greater" | "GreaterEqual";
// 编辑器可选节点回调;walk<Type> 先回调,返回 false 只剪掉当前子树,其他值继续递归。
export interface Visitor {
// 跨度叶子回调没有子结构,其返回值不参与后续剪枝。
visitSpan?(node: Span): boolean | void;
// walkAstDocument 到达 AstDocument 时调用,false 跳过该节点的后续子字段。
visitAstDocument?(node: AstDocument): boolean | void;
// walkAstRoot 到达 AstRoot 时调用,false 跳过该节点的后续子字段。
visitAstRoot?(node: AstRoot): boolean | void;
// walkName 到达 Name 时调用,false 跳过该节点的后续子字段。
visitName?(node: Name): boolean | void;
// walkProgram 到达 Program 时调用,false 跳过该节点的后续子字段。
visitProgram?(node: Program): boolean | void;
// walkDecl 到达 Decl 时调用,false 跳过该节点的后续子字段。
visitDecl?(node: Decl): boolean | void;
// walkDeclKind 到达 DeclKind 时调用,false 跳过该节点的后续子字段。
visitDeclKind?(node: DeclKind): boolean | void;
// walkClass 到达 Class 时调用,false 跳过该节点的后续子字段。
visitClass?(node: Class): boolean | void;
// walkFunction 到达 Function 时调用,false 跳过该节点的后续子字段。
visitFunction?(node: Function): boolean | void;
// walkParameter 到达 Parameter 时调用,false 跳过该节点的后续子字段。
visitParameter?(node: Parameter): boolean | void;
// walkBlock 到达 Block 时调用,false 跳过该节点的后续子字段。
visitBlock?(node: Block): boolean | void;
// walkStmt 到达 Stmt 时调用,false 跳过该节点的后续子字段。
visitStmt?(node: Stmt): boolean | void;
// walkStmtKind 到达 StmtKind 时调用,false 跳过该节点的后续子字段。
visitStmtKind?(node: StmtKind): boolean | void;
// walkBinding 到达 Binding 时调用,false 跳过该节点的后续子字段。
visitBinding?(node: Binding): boolean | void;
// walkAssignment 到达 Assignment 时调用,false 跳过该节点的后续子字段。
visitAssignment?(node: Assignment): boolean | void;
// walkMemberAssignment 到达 MemberAssignment 时调用,false 跳过该节点的后续子字段。
visitMemberAssignment?(node: MemberAssignment): boolean | void;
// walkIfStatement 到达 IfStatement 时调用,false 跳过该节点的后续子字段。
visitIfStatement?(node: IfStatement): boolean | void;
// walkWhileStatement 到达 WhileStatement 时调用,false 跳过该节点的后续子字段。
visitWhileStatement?(node: WhileStatement): boolean | void;
// walkReturnStatement 到达 ReturnStatement 时调用,false 跳过该节点的后续子字段。
visitReturnStatement?(node: ReturnStatement): boolean | void;
// walkInteractiveInput 到达 InteractiveInput 时调用,false 跳过该节点的后续子字段。
visitInteractiveInput?(node: InteractiveInput): boolean | void;
// walkExpr 到达 Expr 时调用,false 跳过该节点的后续子字段。
visitExpr?(node: Expr): boolean | void;
// walkExprKind 到达 ExprKind 时调用,false 跳过该节点的后续子字段。
visitExprKind?(node: ExprKind): boolean | void;
// walkUnaryOp 到达 UnaryOp 时调用,false 跳过该节点的后续子字段。
visitUnaryOp?(node: UnaryOp): boolean | void;
// walkBinaryOp 到达 BinaryOp 时调用,false 跳过该节点的后续子字段。
visitBinaryOp?(node: BinaryOp): boolean | void;
}
// 上层 walker/宿主调用的跨度叶子入口,仅通知 visitSpan,不验证输入或修改节点。
export function walkSpan(node: Span, visitor: Visitor): void { visitor.visitSpan?.(node); }
// 上层 walker 或宿主调用,先通知 AstDocument 回调,再按 ASDL 顺序访问子结构;不修改树。
export function walkAstDocument(node: AstDocument, visitor: Visitor): void {
// 仅显式 false 剪枝,未提供回调或返回 void 则继续访问。
if (visitor.visitAstDocument?.(node) === false) return;
// 递归访问 node.root 的 AstRoot 子结构或跨度。
walkAstRoot(node.root, visitor);
}
// 上层 walker 或宿主调用,先通知 AstRoot 回调,再按 ASDL 顺序访问子结构;不修改树。
export function walkAstRoot(node: AstRoot, visitor: Visitor): void {
// 仅显式 false 剪枝,未提供回调或返回 void 则继续访问。
if (visitor.visitAstRoot?.(node) === false) return;
// 判别 kind 只选择当前载荷,普通文本/数字拼写没有进一步语法子结构。
switch (node.kind) {
// 模块根,包含函数/类声明。
case "Module":
// 递归访问 node.data 的 Program 子结构或跨度。
walkProgram(node.data, visitor);
break;
// 表达式根,编译后直接返回求值结果。
case "Expression":
// 递归访问 node.data 的 Expr 子结构或跨度。
walkExpr(node.data, visitor);
break;
// 交互根,包含一次完整提交。
case "Interactive":
// 递归访问 node.data 的 InteractiveInput 子结构或跨度。
walkInteractiveInput(node.data, visitor);
break;
}
}
// 上层 walker 或宿主调用,先通知 Name 回调,再按 ASDL 顺序访问子结构;不修改树。
export function walkName(node: Name, visitor: Visitor): void {
// 仅显式 false 剪枝,未提供回调或返回 void 则继续访问。
if (visitor.visitName?.(node) === false) return;
// 递归访问 node.span 的 span 子结构或跨度。
walkSpan(node.span, visitor);
}
// 上层 walker 或宿主调用,先通知 Program 回调,再按 ASDL 顺序访问子结构;不修改树。
export function walkProgram(node: Program, visitor: Visitor): void {
// 仅显式 false 剪枝,未提供回调或返回 void 则继续访问。
if (visitor.visitProgram?.(node) === false) return;
// 按声明顺序访问 node.declarations 列表中的每个 Decl 子节点。
for (const value of node.declarations) walkDecl(value, visitor);
// 递归访问 node.span 的 span 子结构或跨度。
walkSpan(node.span, visitor);
}
// 上层 walker 或宿主调用,先通知 Decl 回调,再按 ASDL 顺序访问子结构;不修改树。
export function walkDecl(node: Decl, visitor: Visitor): void {
// 仅显式 false 剪枝,未提供回调或返回 void 则继续访问。
if (visitor.visitDecl?.(node) === false) return;
// 递归访问 node.kind 的 DeclKind 子结构或跨度。
walkDeclKind(node.kind, visitor);
// 递归访问 node.span 的 span 子结构或跨度。
walkSpan(node.span, visitor);
}
// 上层 walker 或宿主调用,先通知 DeclKind 回调,再按 ASDL 顺序访问子结构;不修改树。
export function walkDeclKind(node: DeclKind, visitor: Visitor): void {
// 仅显式 false 剪枝,未提供回调或返回 void 则继续访问。
if (visitor.visitDeclKind?.(node) === false) return;
// 判别 kind 只选择当前载荷,普通文本/数字拼写没有进一步语法子结构。
switch (node.kind) {
// 显式参数/返回注解与函数体,compiler 生成独立模板及源码签名;解析本身不调用函数。
case "Function":
// 递归访问 node.data 的 Function 子结构或跨度。
walkFunction(node.data, visitor);
break;
// 类名、可选基类、字段和方法,compiler 检查成员后生成构类指令。
case "Class":
// 递归访问 node.data 的 Class 子结构或跨度。
walkClass(node.data, visitor);
break;
}
}
// 上层 walker 或宿主调用,先通知 Class 回调,再按 ASDL 顺序访问子结构;不修改树。
export function walkClass(node: Class, visitor: Visitor): void {
// 仅显式 false 剪枝,未提供回调或返回 void 则继续访问。
if (visitor.visitClass?.(node) === false) return;
// 递归访问 node.name 的 Name 子结构或跨度。
walkName(node.name, visitor);
// node.base 可缺省或为 null,只有存在时才访问该子节点。
if (node.base != null) walkName(node.base, visitor);
// 按声明顺序访问 node.fields 列表中的每个 Parameter 子节点。
for (const value of node.fields) walkParameter(value, visitor);
// 按声明顺序访问 node.methods 列表中的每个 Function 子节点。
for (const value of node.methods) walkFunction(value, visitor);
// 递归访问 node.span 的 span 子结构或跨度。
walkSpan(node.span, visitor);
}
// 上层 walker 或宿主调用,先通知 Function 回调,再按 ASDL 顺序访问子结构;不修改树。
export function walkFunction(node: Function, visitor: Visitor): void {
// 仅显式 false 剪枝,未提供回调或返回 void 则继续访问。
if (visitor.visitFunction?.(node) === false) return;
// 递归访问 node.name 的 Name 子结构或跨度。
walkName(node.name, visitor);
// 按声明顺序访问 node.parameters 列表中的每个 Parameter 子节点。
for (const value of node.parameters) walkParameter(value, visitor);
// 递归访问 node.return_type 的 Name 子结构或跨度。
walkName(node.return_type, visitor);
// 递归访问 node.body 的 Block 子结构或跨度。
walkBlock(node.body, visitor);
// 递归访问 node.span 的 span 子结构或跨度。
walkSpan(node.span, visitor);
}
// 上层 walker 或宿主调用,先通知 Parameter 回调,再按 ASDL 顺序访问子结构;不修改树。
export function walkParameter(node: Parameter, visitor: Visitor): void {
// 仅显式 false 剪枝,未提供回调或返回 void 则继续访问。
if (visitor.visitParameter?.(node) === false) return;
// 递归访问 node.name 的 Name 子结构或跨度。
walkName(node.name, visitor);
// 递归访问 node.type_name 的 Name 子结构或跨度。
walkName(node.type_name, visitor);
// 递归访问 node.span 的 span 子结构或跨度。
walkSpan(node.span, visitor);
}
// 上层 walker 或宿主调用,先通知 Block 回调,再按 ASDL 顺序访问子结构;不修改树。
export function walkBlock(node: Block, visitor: Visitor): void {
// 仅显式 false 剪枝,未提供回调或返回 void 则继续访问。
if (visitor.visitBlock?.(node) === false) return;
// 按声明顺序访问 node.statements 列表中的每个 Stmt 子节点。
for (const value of node.statements) walkStmt(value, visitor);
// 递归访问 node.span 的 span 子结构或跨度。
walkSpan(node.span, visitor);
}
// 上层 walker 或宿主调用,先通知 Stmt 回调,再按 ASDL 顺序访问子结构;不修改树。
export function walkStmt(node: Stmt, visitor: Visitor): void {
// 仅显式 false 剪枝,未提供回调或返回 void 则继续访问。
if (visitor.visitStmt?.(node) === false) return;
// 递归访问 node.kind 的 StmtKind 子结构或跨度。
walkStmtKind(node.kind, visitor);
// 递归访问 node.span 的 span 子结构或跨度。
walkSpan(node.span, visitor);
}
// 上层 walker 或宿主调用,先通知 StmtKind 回调,再按 ASDL 顺序访问子结构;不修改树。
export function walkStmtKind(node: StmtKind, visitor: Visitor): void {
// 仅显式 false 剪枝,未提供回调或返回 void 则继续访问。
if (visitor.visitStmtKind?.(node) === false) return;
// 判别 kind 只选择当前载荷,普通文本/数字拼写没有进一步语法子结构。
switch (node.kind) {
// let 新绑定,compiler 检查重名并分析右值后才标记目标已初始化。
case "Binding":
// 递归访问 node.data 的 Binding 子结构或跨度。
walkBinding(node.data, visitor);
break;
// 普通名称赋值,compiler 按作用域写局部槽或全局环境。
case "Assignment":
// 递归访问 node.data 的 Assignment 子结构或跨度。
walkAssignment(node.data, visitor);
break;
// 成员写入的对象、属性名与右值,compiler 生成 StoreAttr。
case "MemberAssignment":
// 递归访问 node.data 的 MemberAssignment 子结构或跨度。
walkMemberAssignment(node.data, visitor);
break;
// 条件、then 和可选 else,compiler 合并继续路径的初始化集合并生成跳转。
case "If":
// 递归访问 node.data 的 IfStatement 子结构或跨度。
walkIfStatement(node.data, visitor);
break;
// 循环条件与体,compiler 生成回边并处理循环可能零次执行。
case "While":
// 递归访问 node.data 的 WhileStatement 子结构或跨度。
walkWhileStatement(node.data, visitor);
break;
// 函数返回,compiler 对缺省值补 Nil;当前源码语法要求 return 后有表达式。
case "Return":
// 递归访问 node.data 的 ReturnStatement 子结构或跨度。
walkReturnStatement(node.data, visitor);
break;
// 表达式载荷及完整范围,compiler 生成留下一个结果的求值序列。
case "Expression":
// 递归访问 node.data 的 Expr 子结构或跨度。
walkExpr(node.data, visitor);
break;
// 顶层/交互声明的种类及完整范围,compiler 按函数或类分派。
case "Declaration":
// 递归访问 node.data 的 Decl 子结构或跨度。
walkDecl(node.data, visitor);
break;
}
}
// 上层 walker 或宿主调用,先通知 Binding 回调,再按 ASDL 顺序访问子结构;不修改树。
export function walkBinding(node: Binding, visitor: Visitor): void {
// 仅显式 false 剪枝,未提供回调或返回 void 则继续访问。
if (visitor.visitBinding?.(node) === false) return;
// 递归访问 node.name 的 Name 子结构或跨度。
walkName(node.name, visitor);
// 递归访问 node.value 的 Expr 子结构或跨度。
walkExpr(node.value, visitor);
// 递归访问 node.span 的 span 子结构或跨度。
walkSpan(node.span, visitor);
}
// 上层 walker 或宿主调用,先通知 Assignment 回调,再按 ASDL 顺序访问子结构;不修改树。
export function walkAssignment(node: Assignment, visitor: Visitor): void {
// 仅显式 false 剪枝,未提供回调或返回 void 则继续访问。
if (visitor.visitAssignment?.(node) === false) return;
// 递归访问 node.name 的 Name 子结构或跨度。
walkName(node.name, visitor);
// 递归访问 node.value 的 Expr 子结构或跨度。
walkExpr(node.value, visitor);
// 递归访问 node.span 的 span 子结构或跨度。
walkSpan(node.span, visitor);
}
// 上层 walker 或宿主调用,先通知 MemberAssignment 回调,再按 ASDL 顺序访问子结构;不修改树。
export function walkMemberAssignment(node: MemberAssignment, visitor: Visitor): void {
// 仅显式 false 剪枝,未提供回调或返回 void 则继续访问。
if (visitor.visitMemberAssignment?.(node) === false) return;
// 递归访问 node.object 的 Expr 子结构或跨度。
walkExpr(node.object, visitor);
// 递归访问 node.name 的 Name 子结构或跨度。
walkName(node.name, visitor);
// 递归访问 node.value 的 Expr 子结构或跨度。
walkExpr(node.value, visitor);
// 递归访问 node.span 的 span 子结构或跨度。
walkSpan(node.span, visitor);
}
// 上层 walker 或宿主调用,先通知 IfStatement 回调,再按 ASDL 顺序访问子结构;不修改树。
export function walkIfStatement(node: IfStatement, visitor: Visitor): void {
// 仅显式 false 剪枝,未提供回调或返回 void 则继续访问。
if (visitor.visitIfStatement?.(node) === false) return;
// 递归访问 node.condition 的 Expr 子结构或跨度。
walkExpr(node.condition, visitor);
// 递归访问 node.body 的 Block 子结构或跨度。
walkBlock(node.body, visitor);
// node.otherwise 可缺省或为 null,只有存在时才访问该子节点。
if (node.otherwise != null) walkBlock(node.otherwise, visitor);
// 递归访问 node.span 的 span 子结构或跨度。
walkSpan(node.span, visitor);
}
// 上层 walker 或宿主调用,先通知 WhileStatement 回调,再按 ASDL 顺序访问子结构;不修改树。
export function walkWhileStatement(node: WhileStatement, visitor: Visitor): void {
// 仅显式 false 剪枝,未提供回调或返回 void 则继续访问。
if (visitor.visitWhileStatement?.(node) === false) return;
// 递归访问 node.condition 的 Expr 子结构或跨度。
walkExpr(node.condition, visitor);
// 递归访问 node.body 的 Block 子结构或跨度。
walkBlock(node.body, visitor);
// 递归访问 node.span 的 span 子结构或跨度。
walkSpan(node.span, visitor);
}
// 上层 walker 或宿主调用,先通知 ReturnStatement 回调,再按 ASDL 顺序访问子结构;不修改树。
export function walkReturnStatement(node: ReturnStatement, visitor: Visitor): void {
// 仅显式 false 剪枝,未提供回调或返回 void 则继续访问。
if (visitor.visitReturnStatement?.(node) === false) return;
// node.value 可缺省或为 null,只有存在时才访问该子节点。
if (node.value != null) walkExpr(node.value, visitor);
// 递归访问 node.span 的 span 子结构或跨度。
walkSpan(node.span, visitor);
}
// 上层 walker 或宿主调用,先通知 InteractiveInput 回调,再按 ASDL 顺序访问子结构;不修改树。
export function walkInteractiveInput(node: InteractiveInput, visitor: Visitor): void {
// 仅显式 false 剪枝,未提供回调或返回 void 则继续访问。
if (visitor.visitInteractiveInput?.(node) === false) return;
// 按声明顺序访问 node.statements 列表中的每个 Stmt 子节点。
for (const value of node.statements) walkStmt(value, visitor);
// 递归访问 node.span 的 span 子结构或跨度。
walkSpan(node.span, visitor);
}
// 上层 walker 或宿主调用,先通知 Expr 回调,再按 ASDL 顺序访问子结构;不修改树。
export function walkExpr(node: Expr, visitor: Visitor): void {
// 仅显式 false 剪枝,未提供回调或返回 void 则继续访问。
if (visitor.visitExpr?.(node) === false) return;
// 递归访问 node.kind 的 ExprKind 子结构或跨度。
walkExprKind(node.kind, visitor);
// 递归访问 node.span 的 span 子结构或跨度。
walkSpan(node.span, visitor);
}
// 上层 walker 或宿主调用,先通知 ExprKind 回调,再按 ASDL 顺序访问子结构;不修改树。
export function walkExprKind(node: ExprKind, visitor: Visitor): void {
// 仅显式 false 剪枝,未提供回调或返回 void 则继续访问。
if (visitor.visitExprKind?.(node) === false) return;
// 判别 kind 只选择当前载荷,普通文本/数字拼写没有进一步语法子结构。
switch (node.kind) {
// 变量引用文本,compiler 决定局部槽或全局索引。
case "Name":
break;
// 原始十进制拼写,保留全部位数、前导零及尾零,不转浮点。
case "Number":
break;
// 已解码受支持转义的拥有文本,原引号范围在外层 Expr。
case "String":
break;
// 点开头的符号名,前端可表示,当前 compiler 拒绝生成运行时值。
case "Symbol":
// 递归访问 node.data 的 Name 子结构或跨度。
walkName(node.data, visitor);
break;
// 等待子表达式,VM 执行上下文决定是否允许停放。
case "Await":
// 递归访问 node.data 的 Expr 子结构或跨度。
walkExpr(node.data, visitor);
break;
// 一元取负,可在纯数值链上合并符号。
case "Unary":
// 递归访问 node.data.operation 的 UnaryOp 子结构或跨度。
walkUnaryOp(node.data.operation, visitor);
// 递归访问 node.data.operand 的 Expr 子结构或跨度。
walkExpr(node.data.operand, visitor);
break;
// 左右操作数及算术/比较种类,保留解析优先级树。
case "Binary":
// 递归访问 node.data.operation 的 BinaryOp 子结构或跨度。
walkBinaryOp(node.data.operation, visitor);
// 递归访问 node.data.left 的 Expr 子结构或跨度。
walkExpr(node.data.left, visitor);
// 递归访问 node.data.right 的 Expr 子结构或跨度。
walkExpr(node.data.right, visitor);
break;
// 接收对象及属性名的读取。
case "Member":
// 递归访问 node.data.object 的 Expr 子结构或跨度。
walkExpr(node.data.object, visitor);
// 递归访问 node.data.name 的 Name 子结构或跨度。
walkName(node.data.name, visitor);
break;
// 被调用表达式与位置实参,由 VM 实际求值。
case "Call":
// 递归访问 node.data.callee 的 Expr 子结构或跨度。
walkExpr(node.data.callee, visitor);
// 按声明顺序访问 node.data.arguments 列表中的每个 Expr 子节点。
for (const value of node.data.arguments) walkExpr(value, visitor);
break;
}
}
// 上层 walker 或宿主调用,先通知 UnaryOp 回调,再按 ASDL 顺序访问子结构;不修改树。
export function walkUnaryOp(node: UnaryOp, visitor: Visitor): void {
// 仅显式 false 剪枝,未提供回调或返回 void 则继续访问。
if (visitor.visitUnaryOp?.(node) === false) return;
}
// 上层 walker 或宿主调用,先通知 BinaryOp 回调,再按 ASDL 顺序访问子结构;不修改树。
export function walkBinaryOp(node: BinaryOp, visitor: Visitor): void {
// 仅显式 false 剪枝,未提供回调或返回 void 则继续访问。
if (visitor.visitBinaryOp?.(node) === false) return;
}