修复else
This commit is contained in:
parent
4237c7db7a
commit
310191407e
@ -56,12 +56,19 @@ public class ASTPrinter {
|
||||
}
|
||||
case AssignmentNode(String variable, ExpressionNode value) ->
|
||||
System.out.println(pad + variable + " = " + value);
|
||||
case IfNode(ExpressionNode condition, List<StatementNode> thenBranch) -> {
|
||||
case IfNode(ExpressionNode condition, List<StatementNode> thenBranch, List<StatementNode> 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<StatementNode> body
|
||||
) -> {
|
||||
|
||||
@ -12,65 +12,75 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* if 语句解析器,支持:
|
||||
* <pre>{@code
|
||||
* if condition then
|
||||
* statements...
|
||||
* else
|
||||
* statements...
|
||||
* 解析 if 语句:
|
||||
*
|
||||
* 支持格式:
|
||||
* if <condition> then
|
||||
* <then-statements>
|
||||
* [else
|
||||
* <else-statements>]
|
||||
* end if
|
||||
* }</pre>
|
||||
*/
|
||||
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<StatementNode> thenBranch = new ArrayList<>();
|
||||
List<StatementNode> 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);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user