diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTPrinter.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTPrinter.java index df2018b..b35f377 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTPrinter.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTPrinter.java @@ -56,12 +56,19 @@ public class ASTPrinter { } case AssignmentNode(String variable, ExpressionNode value) -> System.out.println(pad + variable + " = " + value); - case IfNode(ExpressionNode condition, List thenBranch) -> { + case IfNode(ExpressionNode condition, List thenBranch, List elseBranch) -> { System.out.println(pad + "if " + condition); for (StatementNode stmt : thenBranch) { print(stmt, indent + 1); } + if (!elseBranch.isEmpty()) { + System.out.println(pad + "else"); + for (StatementNode stmt : elseBranch) { + print(stmt, indent + 1); + } + } } + case LoopNode( StatementNode initializer, ExpressionNode condition, StatementNode update, List body ) -> { diff --git a/src/main/java/org/jcnc/snow/compiler/parser/statement/IfStatementParser.java b/src/main/java/org/jcnc/snow/compiler/parser/statement/IfStatementParser.java index fcf8d8c..d21e128 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/statement/IfStatementParser.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/statement/IfStatementParser.java @@ -12,65 +12,75 @@ import java.util.ArrayList; import java.util.List; /** - * if 语句解析器,支持: - *
{@code
- * if condition then
- *   statements...
- * else
- *   statements...
+ * 解析 if 语句:
+ *
+ * 支持格式:
+ * if  then
+ *   
+ * [else
+ *   ]
  * end if
- * }
*/ public class IfStatementParser implements StatementParser { @Override public IfNode parse(ParserContext ctx) { - var ts = ctx.getTokens(); + var ts = ctx.getTokens(); // 获取 Token 流管理器 - ts.expect("if"); + ts.expect("if"); // 消费 "if" 关键字 - // 解析条件表达式 - var cond = new PrattExpressionParser().parse(ctx); + // 使用 Pratt 解析器解析布尔表达式或其他条件表达式 + var condition = new PrattExpressionParser().parse(ctx); + // 消费 "then" 关键字和随后的换行符 ts.expect("then"); ts.expectType(TokenType.NEWLINE); + // 准备容器存储 then 和 else 分支的语句 List thenBranch = new ArrayList<>(); List elseBranch = new ArrayList<>(); - // --- THEN 分支 --- + // ------------------- + // 解析 THEN 分支语句 + // ------------------- while (true) { Token peek = ts.peek(); - // 跳过空行 + // 忽略空行 if (peek.getType() == TokenType.NEWLINE) { ts.next(); continue; } + // 检测是否进入 else 或 end,跳出 then 区块 if (peek.getType() == TokenType.KEYWORD && (peek.getLexeme().equals("else") || peek.getLexeme().equals("end"))) { break; } + // 提取关键词,交由 StatementParserFactory 派发对应解析器 String keyword = peek.getType() == TokenType.KEYWORD ? peek.getLexeme() : ""; StatementNode stmt = StatementParserFactory.get(keyword).parse(ctx); thenBranch.add(stmt); } - // --- ELSE 分支 --- + // ------------------- + // 解析 ELSE 分支语句 + // ------------------- if (ts.peek().getLexeme().equals("else")) { - ts.next(); // consume 'else' - ts.expectType(TokenType.NEWLINE); + ts.next(); // 消费 "else" + ts.expectType(TokenType.NEWLINE); // 消费换行 while (true) { Token peek = ts.peek(); + // 忽略空行 if (peek.getType() == TokenType.NEWLINE) { ts.next(); continue; } + // "end" 关键字表示 else 块结束 if (peek.getType() == TokenType.KEYWORD && peek.getLexeme().equals("end")) { break; } @@ -81,10 +91,12 @@ public class IfStatementParser implements StatementParser { } } + // 统一消费 "end if" 和其后的换行 ts.expect("end"); ts.expect("if"); ts.expectType(TokenType.NEWLINE); - return new IfNode(cond, thenBranch, elseBranch); + // 构造 AST 节点,返回 IfNode 包含条件、then 分支、else 分支 + return new IfNode(condition, thenBranch, elseBranch); } }