diff --git a/src/main/java/org/jcnc/snow/compiler/parser/base/TopLevelParser.java b/src/main/java/org/jcnc/snow/compiler/parser/base/TopLevelParser.java index 8e98700..2e07785 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/base/TopLevelParser.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/base/TopLevelParser.java @@ -4,20 +4,28 @@ import org.jcnc.snow.compiler.parser.ast.base.Node; import org.jcnc.snow.compiler.parser.context.ParserContext; /** - * 顶层结构解析器接口,用于解析模块级别的语法结构,如 {@code module}、{@code import}、{@code function} 等。 - * 所有顶层解析器应实现该接口,并从 {@link ParserContext} 中读取 TokenStream 来构造 AST 节点。 + * {@code TopLevelParser} 是顶层语法结构的解析器接口。 *
- * 该接口由 {@link org.jcnc.snow.compiler.parser.factory.TopLevelParserFactory} 根据当前关键字动态调度。 + * 用于解析模块级别的构造,例如 {@code module}、{@code import}、{@code function} 等。 + * 所有顶层语法解析器应实现该接口,并从 {@link ParserContext} 提供的 TokenStream 中提取并构建 AST 节点。 + *
+ *+ * 本接口由 {@link org.jcnc.snow.compiler.parser.factory.TopLevelParserFactory} 负责根据关键字进行动态分派, + * 以便支持扩展性与模块化解析策略。 + *
*/ public interface TopLevelParser { /** - * 从解析上下文中解析一个顶层语法结构。 - * 每个实现应从 TokenStream 中消费对应的 token,并返回构建后的 AST 节点。 + * 从解析上下文中解析一个顶层语法结构节点。 + *+ * 每个实现类应根据自身语法规则消费 TokenStream 中的相应 token, + * 构造对应的 AST 子树结构。 + *
* - * @param ctx 当前解析上下文,包含 Token 流与状态信息。 - * @return 表示顶层结构的 AST 节点,不应为 null。 - * @throws IllegalStateException 如果遇到非法语法结构。 + * @param ctx 当前解析上下文,包含 Token 流与中间状态 + * @return 构建完成的 AST 节点,不应为 {@code null} + * @throws IllegalStateException 若解析过程遇到非法结构或上下文状态异常 */ Node parse(ParserContext ctx); -} +} \ No newline at end of file diff --git a/src/main/java/org/jcnc/snow/compiler/parser/context/ParseException.java b/src/main/java/org/jcnc/snow/compiler/parser/context/ParseException.java index bc382d3..0313d7a 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/context/ParseException.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/context/ParseException.java @@ -1,15 +1,22 @@ package org.jcnc.snow.compiler.parser.context; /** - * 表示解析过程中发生的异常,通常用于报告语法错误。 - * 在语法分析器发现非法语法或无法处理的结构时抛出。 + * {@code ParseException} 表示语法分析阶段发生的错误。 + *+ * 当语法分析器遇到非法的语法结构或无法继续处理的标记序列时, + * 应抛出该异常以中断当前解析流程,并向调用方报告错误信息。 + *
+ *+ * 该异常通常由 {@code ParserContext} 或各类语法规则处理器主动抛出, + * 用于提示编译器前端或 IDE 系统进行错误提示与恢复。 + *
*/ public class ParseException extends RuntimeException { /** - * 构造一个解析异常实例,并提供错误消息。 + * 构造一个带有错误描述信息的解析异常实例。 * - * @param message 错误描述信息,用于指出语法错误的详情。 + * @param message 错误描述文本,用于指明具体的语法错误原因 */ public ParseException(String message) { super(message); diff --git a/src/main/java/org/jcnc/snow/compiler/parser/context/ParserContext.java b/src/main/java/org/jcnc/snow/compiler/parser/context/ParserContext.java index 90384a2..bbf2b2e 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/context/ParserContext.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/context/ParserContext.java @@ -4,27 +4,33 @@ import org.jcnc.snow.compiler.lexer.token.Token; import java.util.List; /** - * 表示解析器的共享上下文,封装了当前的 {@link TokenStream}。 - * 后续还可以扩展为包含错误收集器、符号表、作用域信息等。 + * {@code ParserContext} 表示语法分析阶段的共享上下文容器。 + *+ * 封装了词法单元流(TokenStream),供各级语法解析器读取与回退。 + * 后续还可扩展为包含错误收集、符号表管理、作用域追踪等功能模块, + * 以支持完整的编译前端功能。 + *
*/ public class ParserContext { + + /** 当前语法分析所使用的 Token 流 */ private final TokenStream tokens; /** - * 构造解析上下文,并包装传入的词法单元列表为 {@link TokenStream}。 + * 使用词法分析得到的 Token 列表构造上下文。 * - * @param tokens 词法分析器生成的 token 列表。 + * @param tokens 词法分析器生成的 Token 集合 */ public ParserContext(List+ * 提供前瞻(peek)、消费(next)、匹配(match)、断言(expect)等常用操作, + * 支持前向查看和异常处理,适用于递归下降解析等常见语法构建策略。 + *
*/ public class TokenStream { + + /** 源 Token 列表 */ private final List+ * 它通过不断读取 TokenStream 中的标记,动态选择合适的解析器(由工厂提供), + * 并构建对应的抽象语法树(AST)节点。 + * 同时具备跳过空行、处理非法标记等基本容错能力。 + *
*/ public class ParserEngine { - // 解析上下文对象,包含 TokenStream 及相关辅助功能 + + /** 解析上下文,封装 TokenStream 与语法状态 */ private final ParserContext ctx; /** - * 构造解析器引擎。 + * 构造一个 {@code ParserEngine} 实例。 * - * @param ctx 解析上下文,封装了 Token 流等解析状态。 + * @param ctx 提供语法分析所需的上下文信息(如 Token 流) */ public ParserEngine(ParserContext ctx) { this.ctx = ctx; } /** - * 启动解析流程,返回顶层节点列表(模块、导入等)。 + * 启动语法解析流程,提取所有顶层 AST 节点。 + *+ * 该方法会循环调用 {@link TopLevelParserFactory} 选择合适解析器, + * 并将解析结果存入返回列表,直到遇到文件结束符(EOF)。 + *
* - * @return 所有解析出的 AST 顶层节点。 + * @return 顶层 AST 节点列表(如模块、导入、函数等) + * @throws IllegalStateException 若遇到无法识别的顶层标记 */ public List+ * 该解析器支持二元运算符表达式(如 {@code a + b}、{@code x * y}), + * 可配置操作符优先级与结合性(左结合或右结合)。 + * 适用于 Pratt 解析器架构中中缀阶段的语法处理。 + *
*/ public class BinaryOperatorParselet implements InfixParselet { + + /** 当前运算符的优先级 */ private final Precedence precedence; + + /** 是否为左结合运算符 */ private final boolean leftAssoc; /** - * 构造二元运算符的解析器。 + * 构造一个中缀二元运算符的解析器。 * - * @param precedence 运算符的优先级。 - * @param leftAssoc 是否是左结合(true 表示左结合,false 表示右结合)。 + * @param precedence 运算符的优先级 + * @param leftAssoc 是否左结合(true 表示左结合,false 表示右结合) */ public BinaryOperatorParselet(Precedence precedence, boolean leftAssoc) { this.precedence = precedence; @@ -26,28 +34,30 @@ public class BinaryOperatorParselet implements InfixParselet { } /** - * 解析一个中缀表达式。 + * 解析当前二元中缀表达式。 * - * @param ctx 解析上下文,包含 Token 流等信息。 - * @param left 当前已解析出的左表达式。 - * @return 一个新的 {@link BinaryExpressionNode} 表达式节点。 + * @param ctx 当前解析上下文 + * @param left 当前已解析的左表达式 + * @return 构建完成的 {@link BinaryExpressionNode} AST 节点 */ @Override public ExpressionNode parse(ParserContext ctx, ExpressionNode left) { - Token op = ctx.getTokens().next(); // 获取当前运算符 Token + Token op = ctx.getTokens().next(); int prec = precedence.ordinal(); - // 如果是左结合运算符,右表达式的优先级应减一(右边绑定更紧) + + // 右侧表达式根据结合性确定优先级绑定 ExpressionNode right = new PrattExpressionParser().parseExpression( ctx, leftAssoc ? Precedence.values()[prec] : Precedence.values()[prec - 1] ); + return new BinaryExpressionNode(left, op.getLexeme(), right); } /** - * 返回该运算符的优先级。 + * 获取当前运算符的优先级。 * - * @return 当前运算符的优先级枚举。 + * @return 运算符优先级枚举 */ @Override public Precedence getPrecedence() { diff --git a/src/main/java/org/jcnc/snow/compiler/parser/expression/CallParselet.java b/src/main/java/org/jcnc/snow/compiler/parser/expression/CallParselet.java index cc1f554..e12ce32 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/expression/CallParselet.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/expression/CallParselet.java @@ -9,17 +9,21 @@ import java.util.ArrayList; import java.util.List; /** - * 表示函数调用的解析规则(parselet),用于解析形如 {@code foo(arg1, arg2)} 的调用表达式。 - * 函数调用的结构为:已解析的 callee 表达式后接一对圆括号和参数列表。 + * {@code CallParselet} 表示函数调用语法的中缀解析器。 + *+ * 用于处理形如 {@code foo(arg1, arg2)} 的函数调用结构。 + * 在 Pratt 解析器架构中,该解析器在函数名之后接收括号开始的调用参数, + * 构建 {@link CallExpressionNode} 抽象语法树节点。 + *
*/ public class CallParselet implements InfixParselet { /** - * 解析函数调用表达式,形如 {@code callee(args...)}。 + * 解析函数调用表达式,格式为 {@code callee(args...)}。 * - * @param ctx 解析上下文,包含 Token 流等信息。 - * @param left 已解析的函数名或调用目标(即 callee 表达式)。 - * @return 生成的 {@link CallExpressionNode} 表达式节点。 + * @param ctx 当前解析上下文 + * @param left 函数名或调用目标(即 callee 表达式) + * @return 构建完成的函数调用 AST 节点 */ @Override public ExpressionNode parse(ParserContext ctx, ExpressionNode left) { @@ -27,21 +31,20 @@ public class CallParselet implements InfixParselet { List+ * 用于处理形如 {@code (a + b)} 的表达式结构, + * 通常用于提升括号内表达式的优先级,以控制运算顺序。 + *
*/ public class GroupingParselet implements PrefixParselet { /** - * 解析括号表达式。假定当前 token 是左括号 "(",解析中间的表达式并消费右括号 ")"。 + * 解析括号表达式。 + *+ * 该方法假定当前 token 为左括号 "(",将解析其内部表达式, + * 并断言后续 token 为右括号 ")"。 + *
* - * @param ctx 当前解析上下文。 - * @param token 当前起始 token(应为 "(")。 - * @return 被括号包围的表达式节点。 + * @param ctx 当前解析上下文 + * @param token 当前起始 token,应为 "(" + * @return 被括号包裹的子表达式节点 */ @Override public ExpressionNode parse(ParserContext ctx, Token token) { diff --git a/src/main/java/org/jcnc/snow/compiler/parser/expression/IdentifierParselet.java b/src/main/java/org/jcnc/snow/compiler/parser/expression/IdentifierParselet.java index 104801a..057c425 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/expression/IdentifierParselet.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/expression/IdentifierParselet.java @@ -7,20 +7,23 @@ import org.jcnc.snow.compiler.parser.context.ParserContext; import org.jcnc.snow.compiler.parser.expression.base.PrefixParselet; /** - * 用于解析标识符(identifier)的前缀解析器。 - * 例如:变量名、函数名等单词形式的表达式,如 {@code x}、{@code count}、{@code isValid} 等。 + * {@code IdentifierParselet} 是用于解析标识符表达式的前缀解析器。 + *+ * 适用于解析如 {@code x}、{@code count}、{@code isValid} 等变量名或函数名, + * 通常出现在表达式的开头部分,是 AST 中的基础表达式节点之一。 + *
*/ public class IdentifierParselet implements PrefixParselet { /** - * 将当前的标识符 Token 解析为 {@link IdentifierNode} 表达式节点。 + * 解析标识符表达式。 * - * @param ctx 当前解析上下文(未使用)。 - * @param token 当前的标识符 Token。 - * @return 一个表示标识符的表达式节点。 + * @param ctx 当前语法解析上下文(本实现未使用) + * @param token 当前标识符 Token + * @return 构建的 {@link IdentifierNode} 表达式节点 */ @Override public ExpressionNode parse(ParserContext ctx, Token token) { return new IdentifierNode(token.getLexeme()); } -} +} \ No newline at end of file diff --git a/src/main/java/org/jcnc/snow/compiler/parser/expression/MemberParselet.java b/src/main/java/org/jcnc/snow/compiler/parser/expression/MemberParselet.java index 8ac9dd9..4069c44 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/expression/MemberParselet.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/expression/MemberParselet.java @@ -8,37 +8,37 @@ import org.jcnc.snow.compiler.parser.context.TokenStream; import org.jcnc.snow.compiler.parser.expression.base.InfixParselet; /** - * 用于解析成员访问表达式的中缀解析器,例如 {@code object.property}。 - * 成员访问是一种紧绑定表达式,常用于访问对象的字段或方法。 + * {@code MemberParselet} 是用于解析成员访问表达式的中缀解析器。 + *+ * 解析形如 {@code object.property} 的语法结构,常用于访问对象字段或方法, + * 是一种紧绑定操作,优先级通常与函数调用相同。 + *
*/ public class MemberParselet implements InfixParselet { /** - * 解析成员访问表达式,形如 {@code left.member}。 + * 解析成员访问表达式。 * - * @param ctx 解析上下文。 - * @param left 已解析的左侧表达式(对象)。 - * @return 一个 {@link MemberExpressionNode} 表示成员访问的表达式。 + * @param ctx 当前解析上下文 + * @param left 已解析的对象表达式(左侧) + * @return {@link MemberExpressionNode} 表示成员访问的表达式节点 */ @Override public ExpressionNode parse(ParserContext ctx, ExpressionNode left) { TokenStream ts = ctx.getTokens(); ts.expect("."); // 消费点号 - // 接下来应为标识符 - String member = ts - .expectType(TokenType.IDENTIFIER) - .getLexeme(); + + String member = ts.expectType(TokenType.IDENTIFIER).getLexeme(); return new MemberExpressionNode(left, member); } /** - * 获取成员访问表达式的优先级。 - * 与函数调用一样,通常具有较高的优先级。 + * 获取成员访问操作的优先级。 * - * @return {@link Precedence#CALL},表示高优先级。 + * @return 表达式优先级 {@link Precedence#CALL} */ @Override public Precedence getPrecedence() { return Precedence.CALL; } -} +} \ No newline at end of file diff --git a/src/main/java/org/jcnc/snow/compiler/parser/expression/NumberLiteralParselet.java b/src/main/java/org/jcnc/snow/compiler/parser/expression/NumberLiteralParselet.java index fa549d2..6ea186f 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/expression/NumberLiteralParselet.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/expression/NumberLiteralParselet.java @@ -7,20 +7,23 @@ import org.jcnc.snow.compiler.parser.context.ParserContext; import org.jcnc.snow.compiler.parser.expression.base.PrefixParselet; /** - * 用于解析数字字面量的前缀解析器。 - * 例如 {@code 42}、{@code 3.14} 等常量数值表达式。 + * {@code NumberLiteralParselet} 是用于解析数字字面量的前缀解析器。 + *+ * 适用于处理如 {@code 42}、{@code 3.14} 等整型或浮点型常量表达式, + * 通常出现在表达式的起始位置或子表达式内部。 + *
*/ public class NumberLiteralParselet implements PrefixParselet { /** - * 解析一个数字字面量 Token,转换为 {@link NumberLiteralNode} 表达式节点。 + * 将当前的数字 Token 转换为 {@link NumberLiteralNode} 节点。 * - * @param ctx 当前解析上下文(未使用)。 - * @param token 当前的数字 Token。 - * @return 表示数字字面量的表达式节点。 + * @param ctx 当前语法解析上下文(此实现未使用) + * @param token 当前的数字字面量 Token + * @return 构建完成的数字表达式节点 */ @Override public ExpressionNode parse(ParserContext ctx, Token token) { return new NumberLiteralNode(token.getLexeme()); } -} +} \ No newline at end of file diff --git a/src/main/java/org/jcnc/snow/compiler/parser/expression/PrattExpressionParser.java b/src/main/java/org/jcnc/snow/compiler/parser/expression/PrattExpressionParser.java index ffbf43c..cae7e8c 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/expression/PrattExpressionParser.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/expression/PrattExpressionParser.java @@ -12,22 +12,35 @@ import java.util.HashMap; import java.util.Map; /** - * 基于 Pratt 算法的表达式解析器,实现灵活优雅的运算符优先级与结合性处理。 - * 支持数字、字符串、标识符、分组表达式、二元运算、函数调用、成员访问等。 + * {@code PrattExpressionParser} 是基于 Pratt 算法实现的表达式解析器。 + *+ * 它支持灵活的运算符优先级控制,结合前缀(PrefixParselet)和中缀(InfixParselet)解析器, + * 可高效解析复杂表达式结构,包括: + *
+ * 该优先级枚举用于 Pratt 解析器判断运算符的结合顺序。 + * 枚举顺序即优先级高低,数值越大绑定越紧密。 + *
*/ public enum Precedence { + /** - * 最低优先级,通常用于解析入口。 + * 最低优先级,通常用于整个表达式解析的起始入口。 */ LOWEST, /** - * 加法、减法等二元运算(+,-)。 + * 加法和减法的优先级(例如 +、-)。 */ SUM, /** - * 乘法、除法等优先级更高的二元运算(*,/)。 + * 乘法、除法、取模等更高优先级的二元运算符(例如 *、/、%)。 */ PRODUCT, /** - * 函数调用、成员访问(例如 {@code foo()}、{@code obj.prop}),绑定最紧密。 + * 函数调用、成员访问等最强绑定(例如 foo()、obj.prop)。 */ CALL } diff --git a/src/main/java/org/jcnc/snow/compiler/parser/expression/StringLiteralParselet.java b/src/main/java/org/jcnc/snow/compiler/parser/expression/StringLiteralParselet.java index 3920dce..b73603d 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/expression/StringLiteralParselet.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/expression/StringLiteralParselet.java @@ -7,23 +7,26 @@ import org.jcnc.snow.compiler.parser.context.ParserContext; import org.jcnc.snow.compiler.parser.expression.base.PrefixParselet; /** - * 用于解析字符串字面量的前缀解析器。 - * 会从原始 Token 中提取内容,并去除两端的引号。 - * 例如,Token 为 {@code "\"hello\""},则解析为 {@code StringLiteralNode("hello")}。 + * {@code StringLiteralParselet} 是用于解析字符串字面量的前缀解析器。 + *+ * 该解析器会将原始字符串 Token(带引号)转换为 {@link StringLiteralNode}, + * 并自动去除词素前后的双引号。 + * 例如,输入 Token 为 {@code "\"hello\""},将被解析为 {@code StringLiteralNode("hello")}。 + *
*/ public class StringLiteralParselet implements PrefixParselet { /** - * 解析字符串字面量 Token,去除包裹的引号,生成 {@link StringLiteralNode}。 + * 解析字符串字面量 Token。 * - * @param ctx 当前解析上下文(未使用)。 - * @param token 当前字符串字面量 Token,包含带引号的原始文本。 - * @return 解析后的字符串字面量表达式节点。 + * @param ctx 当前语法解析上下文(未使用) + * @param token 当前字符串 Token(包含引号) + * @return {@link StringLiteralNode} 表达式节点 */ @Override public ExpressionNode parse(ParserContext ctx, Token token) { - String raw = token.getRaw(); // 包含引号的原始字符串,例如 "\"Result:\"" - String content = raw.substring(1, raw.length() - 1); // 去除前后引号 + String raw = token.getRaw(); + String content = raw.substring(1, raw.length() - 1); return new StringLiteralNode(content); } -} +} \ No newline at end of file diff --git a/src/main/java/org/jcnc/snow/compiler/parser/expression/base/ExpressionParser.java b/src/main/java/org/jcnc/snow/compiler/parser/expression/base/ExpressionParser.java index e914bb9..bbf15ed 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/expression/base/ExpressionParser.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/expression/base/ExpressionParser.java @@ -4,16 +4,28 @@ import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode; import org.jcnc.snow.compiler.parser.context.ParserContext; /** - * 表达式解析器接口,用于从 {@link ParserContext} 中解析出一个完整的 {@link ExpressionNode} 表达式。 - * 不同的解析器实现可以支持不同的解析策略(如 Pratt 解析、递归下降等)。 + * {@code ExpressionParser} 是用于解析表达式的通用接口。 + *+ * 实现该接口的解析器应根据 {@link ParserContext} 中提供的 Token 流, + * 构建一个有效的 {@link ExpressionNode} 抽象语法树结构。 + *
+ *+ * 不同的实现可以采用不同的解析技术: + *
+ * 用于构建如 {@code a + b}、{@code x * y}、{@code f(x)} 或 {@code obj.prop} 等结构, + * 是 Pratt 解析器架构中处理中缀操作的关键组件。 + *
+ *+ * 每个中缀解析器负责: + *
+ * 用于决定当前操作符是否绑定左右子表达式,影响解析树结构。 + *
* - * @return 表达式的优先级。 + * @return 表达式优先级枚举值 */ Precedence getPrecedence(); -} +} \ No newline at end of file diff --git a/src/main/java/org/jcnc/snow/compiler/parser/expression/base/PrefixParselet.java b/src/main/java/org/jcnc/snow/compiler/parser/expression/base/PrefixParselet.java index b3b04d0..426a62f 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/expression/base/PrefixParselet.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/expression/base/PrefixParselet.java @@ -5,17 +5,29 @@ import org.jcnc.snow.compiler.parser.context.ParserContext; import org.jcnc.snow.compiler.lexer.token.Token; /** - * 前缀解析器接口(PrefixParselet),用于解析以当前 Token 开头的前缀表达式。 - * 典型的前缀表达式包括数字字面量、标识符、括号表达式、前缀运算符等。 + * {@code PrefixParselet} 是用于解析前缀表达式的通用接口。 + *+ * 前缀表达式是以某个词法单元(Token)作为起始的表达式结构, + * 常见类型包括: + *
+ * 本接口通常用于 Pratt 解析器架构中,负责识别语法的起点。 + *
*/ public interface PrefixParselet { /** - * 解析一个前缀表达式。 + * 解析一个以当前 Token 开头的前缀表达式节点。 * - * @param ctx 当前的解析上下文。 - * @param token 当前的前缀 Token。 - * @return 解析得到的表达式节点。 + * @param ctx 当前解析上下文,包含 Token 流状态 + * @param token 当前读取到的前缀 Token + * @return 构建完成的 {@link ExpressionNode} 表达式节点 */ ExpressionNode parse(ParserContext ctx, Token token); -} +} \ No newline at end of file diff --git a/src/main/java/org/jcnc/snow/compiler/parser/factory/StatementParserFactory.java b/src/main/java/org/jcnc/snow/compiler/parser/factory/StatementParserFactory.java index bc12474..d3b4578 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/factory/StatementParserFactory.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/factory/StatementParserFactory.java @@ -6,11 +6,19 @@ import java.util.Map; import java.util.HashMap; /** - * 语句解析器工厂类,用于根据关键字(如 "if"、"loop")返回对应的 {@link StatementParser} 实例。 - * 所有语句解析器在静态代码块中预先注册。 - * 若关键字未注册,则默认返回 {@link ExpressionStatementParser}(空字符串对应)。 + * {@code StatementParserFactory} 是一个语句解析器工厂类, + * 用于根据关键字动态选择适当的 {@link StatementParser} 实现。 + *+ * 本类通过静态注册的方式将各类语句解析器绑定到对应的关键字上, + * 在语法分析阶段根据当前语句起始词快速获取对应解析逻辑。 + *
+ *+ * 若传入的关键字未被显式注册,将回退使用默认的表达式语句解析器 {@link ExpressionStatementParser}。 + *
*/ public class StatementParserFactory { + + /** 注册表:语句关键字 -> 对应语句解析器 */ private static final Map该类采用静态注册机制,在类加载时将所有支持的关键字及其解析器实例注册到内部映射表中。 - * 外部通过 {@link #get(String)} 方法获取对应的解析器。
+ *+ * 每种顶层结构(如模块、导入等)应实现 {@link TopLevelParser} 接口,并在本工厂中静态注册, + * 从而在语法分析阶段由 {@link ParserEngine} 根据关键字调用对应的解析器。 + *
* - *用于 {@link ParserEngine} 中,根据关键字动态解析不同语法块。
+ *+ * 本类采用静态注册表机制,在类加载时将支持的关键字与其解析器一一映射并缓存于内部 Map 中。 + * 若调用时传入的关键字未注册,则返回 {@code null},调用方应自行处理此情况。 + *
*/ public class TopLevelParserFactory { - // 存储关键字 -> 解析器 实例的映射关系 + /** 顶层关键字 -> 顶层结构解析器 的映射表 */ private static final Map+ * 该类支持以缩进方式层级打印任意 AST 节点,包括模块、函数、控制结构等, + * 适用于开发阶段调试语法树结构或输出结构化语法分析结果。 + *
+ * + *+ * 同时支持将 AST 序列化为 JSON 字符串,并使用 {@link JsonFormatter} 美化输出, + * 便于与外部工具对接或做进一步分析。 + *
*/ public class ASTPrinter { /** - * 打印整个语法树的节点列表。 + * 打印整个抽象语法树的节点集合。 * - * @param nodes 要打印的 AST 节点列表,通常是顶层模块或语句。 + *+ * 每个节点及其子节点将以多行文本形式打印,展示语法树的层级结构。 + * 该方法通常用于打印完整模块、函数集等顶层结构。 + *
+ * + * @param nodes 要打印的 AST 节点列表,通常为模块或顶层语句列表。 */ public static void print(List+ * 支持的节点类型包括模块、函数、声明、赋值、条件语句、循环、返回语句、表达式语句等。 + * 若节点类型未显式支持,则退回使用 {@code toString()} 方法进行输出。 + *
+ * + * @param n 要打印的 AST 节点。 + * @param indent 当前缩进层级,每级对应两个空格。 */ private static void print(Node n, int indent) { String pad = " ".repeat(indent); @@ -75,7 +95,6 @@ public class ASTPrinter { } } } - case LoopNode( StatementNode initializer, ExpressionNode condition, StatementNode update, List+ * 本方法将语法树序列化为 JSON 字符串,并通过 {@link JsonFormatter#prettyPrint(String)} 方法进行格式化。 + * 适用于将 AST 结构导出至文件或供其他系统消费。 + *
+ * + * @param nodes 要序列化并打印的 AST 节点列表。 */ public static void printJson(List