增加注释

This commit is contained in:
Luke 2025-05-11 23:37:29 +08:00
parent fddfab6904
commit 88c749067b
19 changed files with 226 additions and 122 deletions

View File

@ -4,20 +4,31 @@ import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode;
import org.jcnc.snow.compiler.parser.ast.base.StatementNode;
/**
* 表示赋值语句的 AST抽象语法树节点例如 {@code x = expr}
* {@code AssignmentNode} 表示抽象语法树AST中的赋值语句节点
* <p>
* 赋值语句用于将右侧表达式的值存储到左侧指定的变量中
* 通常形式为 {@code x = expression}其中 {@code x} 是目标变量
* {@code expression} 是用于计算赋值结果的表达式
* </p>
* <p>
* 该节点作为语句节点的一种实现适用于语义分析类型检查IR 构建等多个阶段
* </p>
*
* @param variable 赋值语句左侧的变量名
* @param value 赋值语句右侧的表达式节点表示要赋给变量的值
* @param variable 左值变量名即赋值目标
* @param value 表达式右值即赋值来源
*/
public record AssignmentNode(String variable, ExpressionNode value) implements StatementNode {
/**
* 返回赋值语句的字符串表示形式例如 {@code x = y + 1}
* 返回赋值语句的字符串形式便于调试与日志输出
* <p>
* 典型格式形如 {@code x = y + 1}
* </p>
*
* @return 表示赋值语句的字符串
* @return 表示赋值语句的字符串形式
*/
@Override
public String toString() {
return variable + " = " + value;
}
}
}

View File

@ -3,20 +3,27 @@ package org.jcnc.snow.compiler.parser.ast;
import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode;
/**
* 表示二元运算表达式的 AST 节点例如 {@code a + b}
* 该节点包含一个左操作数一个操作符字符串和一个右操作数
* {@code BinaryExpressionNode} 表示抽象语法树AST中的二元运算表达式节点
* <p>
* 二元表达式通常由两个操作数和一个中间操作符构成例如 {@code a + b}
* 此结构广泛用于数学计算逻辑判断字符串拼接等语法结构中
* </p>
*
* @param left 表达式左侧的子表达式
* @param operator 运算符字符串例如 "+""-""*""/"
* @param right 表达式右侧的子表达式
* @param left 左操作数子表达式
* @param operator 运算符字符串 "+", "-", "*", "/"
* @param right 右操作数子表达式
*/
public record BinaryExpressionNode(ExpressionNode left, String operator,
ExpressionNode right) implements ExpressionNode {
/**
* 返回该二元表达式的字符串表示形式例如 {@code a + b}
* 返回该二元运算表达式的字符串表示形式
* <p>
* 输出格式为{@code left + " " + operator + " " + right}
* 适用于调试或打印语法树结构
* </p>
*
* @return 表达式的字符串形式
* @return 示该二元表达式的字符串
*/
@Override
public String toString() {

View File

@ -5,18 +5,25 @@ import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode;
import java.util.List;
/**
* 表示函数调用表达式的 AST 节点例如 {@code foo(arg1, arg2)}
* 包含一个被调用的表达式callee和一个参数列表arguments
* {@code CallExpressionNode} 表示抽象语法树AST中的函数调用表达式节点
* <p>
* 函数调用表达式用于表示函数或过程的调用操作
* 包括被调用对象callee以及一组参数表达式arguments
* </p>
*
* @param callee 被调用的表达式通常是一个标识符或成员访问表达式
* @param arguments 函数调用的参数列表每个参数都是一个表达式节点
* @param callee 被调用的表达式节点通常为函数标识符或成员访问表达式
* @param arguments 参数表达式列表依照调用顺序排列
*/
public record CallExpressionNode(ExpressionNode callee, List<ExpressionNode> arguments) implements ExpressionNode {
/**
* 返回函数调用表达式的字符串表示形式例如 {@code foo(x, y)}
* 返回函数调用表达式的字符串形式
* <p>
* 该格式将输出为类似 {@code foo(a, b, c)} 的形式
* 便于调试与语法树可视化
* </p>
*
* @return 表达式的字符串形式
* @return 示函数调用的字符串表示
*/
@Override
public String toString() {

View File

@ -6,20 +6,29 @@ import org.jcnc.snow.compiler.parser.ast.base.StatementNode;
import java.util.Optional;
/**
* 表示变量声明语句的 AST 节点例如 {@code int x = 5;}
* 该节点包含变量名称类型以及可选的初始化表达式
* {@code DeclarationNode} 表示抽象语法树AST中的变量声明语句节点
* <p>
* 变量声明用于在语法层引入新的标识符及其类型信息
* 通常格式为 {@code type name = initializer;}其中初始化表达式可省略
* </p>
*/
public class DeclarationNode implements StatementNode {
/** 声明的变量名称 */
private final String name;
/** 变量的数据类型(如 "int", "string" */
private final String type;
/** 可选的初始化表达式 */
private final Optional<ExpressionNode> initializer;
/**
* 构造一个变量声明节点
* 构造一个 {@code DeclarationNode} 实例
*
* @param name 变量名称
* @param type 变量类型 "int", "string"
* @param initializer 可选初始化表达式若为 null 表示未初始化
* @param name 变量名称
* @param type 变量类型字符串 "int""string"
* @param initializer 可选初始化表达式若为 {@code null} 表示未初始化
*/
public DeclarationNode(String name, String type, ExpressionNode initializer) {
this.name = name;
@ -30,21 +39,27 @@ public class DeclarationNode implements StatementNode {
/**
* 获取变量名称
*
* @return 变量名字符串
* @return 变量名字符串
*/
public String getName() { return name; }
public String getName() {
return name;
}
/**
* 获取变量类型
* 获取变量类型字符串
*
* @return 变量类型字符串
* @return 类型名称 "int"
*/
public String getType() { return type; }
public String getType() {
return type;
}
/**
* 获取可选的初始化表达式
*
* @return 包含初始化表达式的 Optional 对象可能为空
* @return 一个 Optional 包装的初始化表达式对象可能为空
*/
public Optional<ExpressionNode> getInitializer() { return initializer; }
}
public Optional<ExpressionNode> getInitializer() {
return initializer;
}
}

View File

@ -4,10 +4,13 @@ import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode;
import org.jcnc.snow.compiler.parser.ast.base.StatementNode;
/**
* 表示一条独立的表达式语句例如 {@code foo();} {@code x = 1;}
* 该节点将一个表达式作为语句出现
* {@code ExpressionStatementNode} 表示抽象语法树AST中的表达式语句节点
* <p>
* 表达式语句通常由一个单独的表达式组成并以语句形式出现
* 例如{@code foo();}{@code x = 1;}{@code print("hello");}
* </p>
*
* @param expression 表达式内容通常是函数调用或赋值操作
* @param expression 表达式主体通常为函数调用赋值方法链式调用等可求值表达式
*/
public record ExpressionStatementNode(ExpressionNode expression) implements StatementNode {
}
}

View File

@ -6,14 +6,18 @@ import org.jcnc.snow.compiler.parser.ast.base.StatementNode;
import java.util.List;
/**
* 表示函数定义的 AST 节点包含函数名参数返回类型和函数体
* {@code FunctionNode} 表示抽象语法树AST中的函数定义结构
* <p>
* 函数定义通常包含函数名形参列表返回类型以及函数体
* 在语义分析类型检查与代码生成等阶段具有核心地位
* 示例{@code int add(int a, int b) { return a + b; }}
* </p>
*
* @param name 函数名称
* @param parameters 参数列表个参数是一个 {@link ParameterNode}
* @param returnType 返回值类型表示函数的返回类型 "int""void"
* @param body 函数体由若干语句组成的列表
* @param name 函数名称标识符
* @param parameters 参数列表项为 {@link ParameterNode} 表示一个形参定义
* @param returnType 函数的返回类型 "int""void"
* @param body 函数体语句块由一组 {@link StatementNode} 构成
*/
public record FunctionNode(String name, List<ParameterNode> parameters, String returnType,
List<StatementNode> body) implements Node {
}
}

View File

@ -3,16 +3,20 @@ package org.jcnc.snow.compiler.parser.ast;
import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode;
/**
* 表示标识符的表达式节点例如变量名 {@code x}函数名 {@code foo}
* {@code IdentifierNode} 表示抽象语法树AST中的标识符表达式节点
* <p>
* 该节点用于表示变量名函数名字段名等符号引用
* 在语义分析中通常需要将此类节点绑定到其声明位置或符号表项
* </p>
*
* @param name 标识符的名称
* @param name 标识符的文本名称如变量名 "x"函数名 "foo"
*/
public record IdentifierNode(String name) implements ExpressionNode {
/**
* 返回标识符的字符串表示形式即其名称
* 返回标识符节点的字符串形式通常为其名称本身
*
* @return 标识符名称字符串
* @return 标识符名称字符串
*/
@Override
public String toString() {

View File

@ -6,25 +6,33 @@ import org.jcnc.snow.compiler.parser.ast.base.StatementNode;
import java.util.List;
/**
* 表示 if 语句的 AST 节点
* 包含条件表达式then 分支语句列表以及可选的 else 分支
* 示例
* {@code IfNode} 表示抽象语法树AST中的条件语句结构if-else
* <p>
* 该节点包含一个条件表达式condition一个 then 分支语句列表
* 以及一个可选的 else 分支语句列表
* </p>
* <p>
* 条件表达式为布尔类型决定是否执行 then 分支
* condition 为假则执行 else 分支如果提供
* </p>
* <p>
* 示例语法结构
* </p>
* <pre>{@code
* if (x > 0) {
* if (x > 0) {
* print("Positive");
* } else {
* } else {
* print("Negative");
* }
* }
* }</pre>
*
* @param condition 条件表达式控制是否进入 thenBranch
* @param thenBranch 条件为真时执行的语句列表
* @param elseBranch 条件为假时执行的语句列表可为空
* @param condition 控制分支执行的条件表达式
* @param thenBranch 条件为 true 时执行的语句块
* @param elseBranch 条件为 false 时执行的语句块可为空
*/
public record IfNode(
ExpressionNode condition,
List<StatementNode> thenBranch,
List<StatementNode> elseBranch
) implements StatementNode {
}
}

View File

@ -3,11 +3,17 @@ package org.jcnc.snow.compiler.parser.ast;
import org.jcnc.snow.compiler.parser.ast.base.Node;
/**
* 表示 import 语句的 AST 节点
* 该节点仅包含被导入模块的名称
* 示例{@code import my.module;}
* {@code ImportNode} 表示抽象语法树AST中的 import 语句节点
* <p>
* import 语句用于引入外部模块或库文件其语法形式一般为
* {@code import my.module;}
* </p>
* <p>
* 本节点仅存储导入目标模块的名称不包含路径解析或绑定逻辑
* 这些通常由语义分析器或模块加载器处理
* </p>
*
* @param moduleName 被导入的模块名称
* @param moduleName 被导入的模块名称通常为点分层次结构 "core.utils"
*/
public record ImportNode(String moduleName) implements Node {
}
}

View File

@ -6,20 +6,18 @@ import org.jcnc.snow.compiler.parser.ast.base.StatementNode;
import java.util.List;
/**
* 表示循环语句loop AST 节点结构类似于传统的 for 循环
* 包含初始化语句循环条件更新语句和循环体
* 示例
* {@code
* for (int i = 0; i < 10; i++) {
* print(i);
* }
* }
* {@code LoopNode} 表示抽象语法树AST中的循环语句结构
* <p>
* 该节点建模了类似传统 {@code for} 循环的控制结构
* 包含初始化语句循环条件更新语句及循环体
* 每一部分均对应为 AST 中的子节点便于进一步语义分析与代码生成
* </p>
*
* @param initializer 循环开始前执行的初始化语句
* @param condition 每次迭代前都会评估的条件表达式
* @param update 次迭代结束时执行的更新语句
* @param body 循环体内的语句列表
* @param initializer 在循环开始前执行的初始化语句
* @param condition 每次迭代前评估的条件表达式控制循环是否继续
* @param update 轮迭代完成后执行的更新语句
* @param body 循环体语句列表表示循环主体执行逻辑
*/
public record LoopNode(StatementNode initializer, ExpressionNode condition, StatementNode update,
List<StatementNode> body) implements StatementNode {
}
}

View File

@ -3,21 +3,27 @@ package org.jcnc.snow.compiler.parser.ast;
import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode;
/**
* 表示成员访问的表达式节点例如 {@code obj.prop}
* 包含一个对象表达式和成员名称
* {@code MemberExpressionNode} 表示抽象语法树AST中的成员访问表达式节点
* <p>
* 用于表示对象字段或方法的访问操作语法形式如 {@code object.member}
* 成员访问常见于结构体模块对象导入等上下文中是表达式链中常见的构件之一
* </p>
*
* @param object 表达式左侧的对象部分通常是一个标识符或更复杂的表达式
* @param member 成员名称表示要访问的字段或方法
* @param object 左侧对象表达式表示成员所属的作用域或容器
* @param member 要访问的成员名称字段名或方法名
*/
public record MemberExpressionNode(ExpressionNode object, String member) implements ExpressionNode {
/**
* 返回成员访问表达式的字符串表示形式例如 {@code obj.prop}
* 返回成员访问表达式的字符串形式
* <p>
* 输出格式为 {@code object.member}用于调试或语法树可视化
* </p>
*
* @return 成员访问表达式的字符串形式
* @return 成员访问表达式的字符串形式
*/
@Override
public String toString() {
return object + "." + member;
}
}
}

View File

@ -8,12 +8,6 @@ import java.util.StringJoiner;
/**
* 表示模块定义的 AST 节点
* 一个模块通常由模块名导入语句列表和函数定义列表组成
* 示例结构
* {@code
* module my.module {
* import other.module;
* fun foo() { ... }
* }
* }
*
* @param name 模块名称

View File

@ -3,17 +3,21 @@ package org.jcnc.snow.compiler.parser.ast;
import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode;
/**
* 表示数字字面量的表达式节点例如 {@code 42} {@code 3.14}
* 该节点直接保存字面量的字符串形式便于统一处理整数和浮点数
* {@code NumberLiteralNode} 表示抽象语法树AST中的数字字面量表达式节点
* <p>
* 用于表示源代码中的数值常量如整数 {@code 42} 或浮点数 {@code 3.14}
* 为了兼容不同数值格式本节点以字符串形式存储原始值
* 在语义分析或类型推导阶段再行解析为具体数值类型
* </p>
*
* @param value 数字的字符串表示形式
* @param value 数字字面量原始字符串表示
*/
public record NumberLiteralNode(String value) implements ExpressionNode {
/**
* 返回数字字面量的字符串形式
*
* @return 字面量的原始字符串值
* @return 字面量原始字符串值例如 "42" "3.14"
*/
@Override
public String toString() {

View File

@ -3,21 +3,27 @@ package org.jcnc.snow.compiler.parser.ast;
import org.jcnc.snow.compiler.parser.ast.base.Node;
/**
* 表示函数参数的 AST 节点包含参数名称和类型
* 示例 {@code int add(int a, int b)} {@code a:int} {@code b:int} 都是参数节点
* {@code ParameterNode} 表示抽象语法树AST中的函数参数定义节点
* <p>
* 每个参数节点包含参数的名称和类型信息
* 用于构成函数签名并参与类型检查与函数调用匹配
* </p>
*
* @param name 参数名称
* @param type 参数类型例如 "int""string"
* @param name 参数名称标识符
* @param type 参数类型字符串 "int""string"
*/
public record ParameterNode(String name, String type) implements Node {
/**
* 返回参数的字符串表示形式格式为 {@code name:type} {@code num:int}
* 返回参数的字符串形式格式为 {@code name:type}
* <p>
* 用于调试输出或构建函数签名描述
* </p>
*
* @return 参数的字符串表示适用于调试或打印参数列表
* @return 参数的字符串形式 {@code count:int}
*/
@Override
public String toString() {
return name + ":" + type;
}
}
}

View File

@ -6,31 +6,38 @@ import org.jcnc.snow.compiler.parser.ast.base.StatementNode;
import java.util.Optional;
/**
* 表示 return 语句的 AST 节点支持可选的返回值表达式
* {@code ReturnNode} 表示抽象语法树AST中的 return 语句节点
* <p>
* return 语句用于从当前函数中返回控制权并可携带一个可选的返回值表达式
* </p>
* <p>
* 示例
* <ul>
* <li>{@code return;}</li>
* <li>{@code return x + 1;}</li>
* </ul>
* </p>
*/
public class ReturnNode implements StatementNode {
/** 可选的返回值表达式 */
private final Optional<ExpressionNode> expression;
/**
* 构造一个 return 语句节点
* 构造一个 {@code ReturnNode} 实例
*
* @param expression 可选的返回表达式若为 null 则表示无返回值
* @param expression 返回值表达式如果无返回值则可为 {@code null}
*/
public ReturnNode(ExpressionNode expression) {
this.expression = Optional.ofNullable(expression);
}
/**
* 获取返回表达式
* 获取可选的返回表达式
*
* @return 表示返回值的可选表达式如果没有则为 {@code Optional.empty()}
* @return 如果有返回值则返回 {@code Optional.of(expression)}否则返回 {@code Optional.empty()}
*/
public Optional<ExpressionNode> getExpression() {
return expression;
}
}
}

View File

@ -3,21 +3,26 @@ package org.jcnc.snow.compiler.parser.ast;
import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode;
/**
* 表示字符串字面量的表达式节点例如 {@code "hello"}
* 字面量值不包含引号仅在打印时添加
* {@code StringLiteralNode} 表示抽象语法树AST中的字符串字面量表达式节点
* <p>
* 用于表示源代码中出现的字符串常量 {@code "hello"}{@code "abc123"}
* 节点内部仅保存不带引号的字符串内容便于后续语义处理或编码
* </p>
*
* @param value 字符串内容不包括两端引号
* @param value 字符串常量的内容原始值中不包含双引号
*/
public record StringLiteralNode(String value) implements ExpressionNode {
/**
* 返回带引号的字符串表示形式适用于调试和打印
* 例如如果 {@code value = Result:} {@code toString()} 返回 {@code "Result:"}
* 返回字符串字面量的带引号表示适用于语法树调试或文本输出
* <p>
* 例如 {@code value = Result:} 返回 {@code "Result:"}
* </p>
*
* @return 添加双引号后的字符串字面量
* @return 字符串字面量的完整表示形式带双引号
*/
@Override
public String toString() {
return "\"" + value + "\"";
}
}
}

View File

@ -1,8 +1,14 @@
package org.jcnc.snow.compiler.parser.ast.base;
/**
* 表示抽象语法树中的表达式节点类型
* 所有具体的表达式如常量变量运算函数调用等都应实现该接口
* 这是一个标记接口marker interface用于统一处理所有表达式节点
* {@code ExpressionNode} 表示抽象语法树AST中所有表达式类型节点的统一接口
* <p>
* 作为标记接口Marker Interface该接口用于区分表达式与其他语法结构
* 不定义具体方法其子类型通常表示可参与求值运算的结构
* 如常量表达式变量引用函数调用算术运算等
* </p>
* <p>
* 所有实现此接口的节点可参与表达式求值语义分析类型检查与中间代码生成等处理流程
* </p>
*/
public interface ExpressionNode extends Node {}
public interface ExpressionNode extends Node {}

View File

@ -1,8 +1,18 @@
package org.jcnc.snow.compiler.parser.ast.base;
/**
* 所有抽象语法树AST节点的标记接口
* 所有具体的语法节点类型如表达式语句模块函数等都应实现该接口
* 该接口本身不定义任何方法仅用于类型标识和统一处理
* {@code Node} 是抽象语法树AST中所有语法节点的统一根接口
* <p>
* 作为标记接口Marker Interface该接口不定义任何方法
* 主要用于统一标识并组织 AST 体系中的各种语法构件节点包括
* </p>
* <ul>
* <li>{@link ExpressionNode}表达式节点如常量变量引用函数调用等</li>
* <li>{@link StatementNode}语句节点如声明赋值条件控制循环返回语句等</li>
* <li>模块函数参数等高层结构节点</li>
* </ul>
* <p>
* 所有 AST 处理逻辑如遍历分析代码生成均可基于该接口实现统一调度和类型判定
* </p>
*/
public interface Node {}

View File

@ -1,8 +1,11 @@
package org.jcnc.snow.compiler.parser.ast.base;
/**
* 表示语法树中的语句节点类型
* 所有语句类如声明赋值ifloopreturn 都应实现该接口
* 这是一个标记接口marker interface用于统一处理所有语句节点
* {@code StatementNode} 表示抽象语法树AST中所有语句结构的统一接口
* <p>
* 该接口为标记接口Marker Interface用于识别和区分语句类节点
* 包括但不限于变量声明赋值语句控制结构 ifloop返回语句等
* 实现此接口的类应表示程序在运行时执行的具体语法行为
* </p>
*/
public interface StatementNode extends Node {}