diff --git a/src/main/java/org/jcnc/snow/compiler/parser/statement/LoopStatementParser.java b/src/main/java/org/jcnc/snow/compiler/parser/statement/LoopStatementParser.java
index 8827fb2..6544cc9 100644
--- a/src/main/java/org/jcnc/snow/compiler/parser/statement/LoopStatementParser.java
+++ b/src/main/java/org/jcnc/snow/compiler/parser/statement/LoopStatementParser.java
@@ -1,6 +1,5 @@
package org.jcnc.snow.compiler.parser.statement;
-import org.jcnc.snow.compiler.lexer.token.Token;
import org.jcnc.snow.compiler.lexer.token.TokenType;
import org.jcnc.snow.compiler.parser.ast.AssignmentNode;
import org.jcnc.snow.compiler.parser.ast.ExpressionNode;
@@ -19,7 +18,7 @@ import java.util.List;
import java.util.Map;
/**
- * 用于解析 loop 语句块,支持以下结构:
+ * 用于解析 loop 语句块,支持如下结构:
*
{@code
* loop:
* initializer:
@@ -33,6 +32,7 @@ import java.util.Map;
* end body
* end loop
* }
+ * 使用 FlexibleSectionParser 解析各区块,并统一入口出口处理。
*/
public class LoopStatementParser implements StatementParser {
@@ -40,98 +40,82 @@ public class LoopStatementParser implements StatementParser {
public LoopNode parse(ParserContext ctx) {
TokenStream ts = ctx.getTokens();
- // 匹配 loop:
+ // 匹配 loop: 开头
ParserUtils.matchHeader(ts, "loop");
- ParserUtils.skipNewlines(ts);
-
- // 用于保存各区块内容
+ // 各区块中间值容器(模拟引用)
final StatementNode[] initializer = new StatementNode[1];
final ExpressionNode[] condition = new ExpressionNode[1];
final AssignmentNode[] update = new AssignmentNode[1];
final List body = new ArrayList<>();
- // 构建区块定义 map
+ // 构造区块定义
Map sections = new HashMap<>();
- // initializer 区块
+ // initializer 区块:解析初始化语句
sections.put("initializer", new FlexibleSectionParser.SectionDefinition(
ts1 -> ts1.peek().getLexeme().equals("initializer"),
(ctx1, ts1) -> {
- ts1.expect("initializer");
- ts1.expect(":");
- ts1.expectType(TokenType.NEWLINE);
- ParserUtils.skipNewlines(ts);
+ ParserUtils.matchHeader(ts1, "initializer");
initializer[0] = StatementParserFactory.get(ts1.peek().getLexeme()).parse(ctx1);
- ParserUtils.skipNewlines(ts);
+ ParserUtils.skipNewlines(ts1);
}
));
- // condition 区块
+ // condition 区块:解析布尔条件表达式
sections.put("condition", new FlexibleSectionParser.SectionDefinition(
ts1 -> ts1.peek().getLexeme().equals("condition"),
(ctx1, ts1) -> {
- ts1.expect("condition");
- ts1.expect(":");
- ts1.expectType(TokenType.NEWLINE);
- ParserUtils.skipNewlines(ts);
+ ParserUtils.matchHeader(ts1, "condition");
condition[0] = new PrattExpressionParser().parse(ctx1);
ts1.expectType(TokenType.NEWLINE);
- ParserUtils.skipNewlines(ts);
+ ParserUtils.skipNewlines(ts1);
}
));
- // update 区块
+ // update 区块:解析变量赋值表达式
sections.put("update", new FlexibleSectionParser.SectionDefinition(
ts1 -> ts1.peek().getLexeme().equals("update"),
(ctx1, ts1) -> {
- ts1.expect("update");
- ts1.expect(":");
- ts1.expectType(TokenType.NEWLINE);
- ParserUtils.skipNewlines(ts);
-
+ ParserUtils.matchHeader(ts1, "update");
String varName = ts1.expectType(TokenType.IDENTIFIER).getLexeme();
ts1.expect("=");
- ExpressionNode updateExpr = new PrattExpressionParser().parse(ctx1);
+ ExpressionNode expr = new PrattExpressionParser().parse(ctx1);
ts1.expectType(TokenType.NEWLINE);
- update[0] = new AssignmentNode(varName, updateExpr);
- ParserUtils.skipNewlines(ts);
+ update[0] = new AssignmentNode(varName, expr);
+ ParserUtils.skipNewlines(ts1);
}
));
- // body 区块
+ // body 区块:解析语句块
sections.put("body", new FlexibleSectionParser.SectionDefinition(
ts1 -> ts1.peek().getLexeme().equals("body"),
(ctx1, ts1) -> {
- ts1.expect("body");
- ts1.expect(":");
- ts1.expectType(TokenType.NEWLINE);
- ParserUtils.skipNewlines(ts);
+ ParserUtils.matchHeader(ts1, "body");
while (!(ts1.peek().getLexeme().equals("end") &&
- ts1.peek(1).getLexeme().equals("body"))) {
+ ts1.peek(1).getLexeme().equals("body"))) {
String keyword = ts1.peek().getType() == TokenType.KEYWORD
? ts1.peek().getLexeme()
: "";
body.add(StatementParserFactory.get(keyword).parse(ctx1));
- ParserUtils.skipNewlines(ts);
+ ParserUtils.skipNewlines(ts1);
}
ts1.expect("end");
ts1.expect("body");
ts1.expectType(TokenType.NEWLINE);
- ParserUtils.skipNewlines(ts);
+ ParserUtils.skipNewlines(ts1);
}
));
- // 使用 FlexibleSectionParser 解析 loop 各部分
+ // 使用 FlexibleSectionParser 解析所有结构部分
FlexibleSectionParser.parse(ctx, ts, sections);
- // 匹配 loop 结束
+ // 匹配 end loop
ParserUtils.matchFooter(ts, "loop");
-
+ // 构造并返回 LoopNode 抽象语法树节点
return new LoopNode(initializer[0], condition[0], update[0], body);
}
-
}
diff --git a/src/main/java/org/jcnc/snow/compiler/parser/util/ParserUtils.java b/src/main/java/org/jcnc/snow/compiler/parser/util/ParserUtils.java
index 676e9cf..7d24dc3 100644
--- a/src/main/java/org/jcnc/snow/compiler/parser/util/ParserUtils.java
+++ b/src/main/java/org/jcnc/snow/compiler/parser/util/ParserUtils.java
@@ -4,15 +4,16 @@ import org.jcnc.snow.compiler.lexer.token.TokenType;
import org.jcnc.snow.compiler.parser.context.TokenStream;
/**
- * 常用的语法解析工具类。
+ * 语法结构通用辅助工具类。
+ * 提供常用的结构匹配和容错功能。
*/
public class ParserUtils {
/**
- * 匹配开头部分,如 `loop:`、`function:`
+ * 匹配形如 "keyword:" 的语法结构头部,并跳过换行。
*
* @param ts Token 流
- * @param keyword 关键词
+ * @param keyword 结构标识关键字(如 "loop", "function" 等)
*/
public static void matchHeader(TokenStream ts, String keyword) {
ts.expect(keyword);
@@ -22,10 +23,10 @@ public class ParserUtils {
}
/**
- * 匹配结尾部分,如 `end loop`、`end function`
+ * 匹配形如 "end keyword" 的语法结构结尾。
*
* @param ts Token 流
- * @param keyword 关键词
+ * @param keyword 结构标识关键字(如 "loop", "function" 等)
*/
public static void matchFooter(TokenStream ts, String keyword) {
ts.expect("end");
@@ -34,7 +35,7 @@ public class ParserUtils {
}
/**
- * 跳过多余换行
+ * 跳过连续的换行符,常用于容错与美化语法结构。
*
* @param ts Token 流
*/