From 157f1e2f11d4a73bd42f405393977a6ec837a183 Mon Sep 17 00:00:00 2001 From: Luke Date: Tue, 22 Apr 2025 21:57:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=BA=AA=E5=BD=95=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jcnc/snow/compiler/JsonFormatter.java | 1 - .../snow/compiler/parser/ParserEngine.java | 3 +- .../snow/compiler/parser/TopLevelParser.java | 1 - .../parser/ast/ASTJsonSerializer.java | 55 +++++++++---------- .../snow/compiler/parser/ast/ASTPrinter.java | 25 ++++----- .../compiler/parser/ast/AssignmentNode.java | 18 +----- .../parser/ast/BinaryExpressionNode.java | 1 - .../parser/ast/CallExpressionNode.java | 13 +---- .../compiler/parser/ast/DeclarationNode.java | 1 - .../compiler/parser/ast/ExpressionNode.java | 1 - .../parser/ast/ExpressionStatementNode.java | 10 +--- .../compiler/parser/ast/FunctionNode.java | 21 +------ .../compiler/parser/ast/IdentifierNode.java | 10 +--- .../jcnc/snow/compiler/parser/ast/IfNode.java | 13 +---- .../snow/compiler/parser/ast/ImportNode.java | 10 +--- .../snow/compiler/parser/ast/LoopNode.java | 23 +------- .../parser/ast/MemberExpressionNode.java | 13 +---- .../snow/compiler/parser/ast/ModuleNode.java | 4 +- .../jcnc/snow/compiler/parser/ast/Node.java | 1 - .../parser/ast/NumberLiteralNode.java | 10 +--- .../compiler/parser/ast/ParameterNode.java | 18 +----- .../snow/compiler/parser/ast/ReturnNode.java | 1 - .../compiler/parser/ast/StatementNode.java | 1 - .../parser/ast/StringLiteralNode.java | 15 +---- .../parser/context/ParseException.java | 1 - .../parser/context/ParserContext.java | 1 - .../compiler/parser/context/TokenStream.java | 3 +- .../expression/BinaryOperatorParselet.java | 1 - .../parser/expression/CallParselet.java | 1 - .../parser/expression/ExpressionParser.java | 1 - .../parser/expression/GroupingParselet.java | 1 - .../parser/expression/IdentifierParselet.java | 1 - .../parser/expression/MemberParselet.java | 1 - .../expression/NumberLiteralParselet.java | 1 - .../expression/PrattExpressionParser.java | 3 +- .../parser/expression/Precedence.java | 2 +- .../parser/expression/PrefixParselet.java | 1 - .../expression/StringLiteralParselet.java | 1 - .../factory/StatementParserFactory.java | 1 - .../parser/factory/TopLevelParserFactory.java | 1 - .../parser/function/FunctionParser.java | 1 - .../compiler/parser/module/ImportParser.java | 9 +-- .../compiler/parser/module/ModuleParser.java | 1 - .../statement/DeclarationStatementParser.java | 1 - .../statement/ExpressionStatementParser.java | 1 - .../parser/statement/IfStatementParser.java | 1 - .../parser/statement/LoopStatementParser.java | 1 - .../statement/ReturnStatementParser.java | 1 - .../parser/statement/StatementParser.java | 1 - 49 files changed, 63 insertions(+), 244 deletions(-) diff --git a/src/main/java/org/jcnc/snow/compiler/JsonFormatter.java b/src/main/java/org/jcnc/snow/compiler/JsonFormatter.java index 45d6f5f..0337f5d 100644 --- a/src/main/java/org/jcnc/snow/compiler/JsonFormatter.java +++ b/src/main/java/org/jcnc/snow/compiler/JsonFormatter.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/ast/JsonFormatter.java package org.jcnc.snow.compiler; public class JsonFormatter { diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ParserEngine.java b/src/main/java/org/jcnc/snow/compiler/parser/ParserEngine.java index 14281f7..2dca672 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ParserEngine.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ParserEngine.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/ParserEngine.java package org.jcnc.snow.compiler.parser; import org.jcnc.snow.compiler.lexer.token.TokenType; @@ -23,7 +22,7 @@ public class ParserEngine { public List parse() { List nodes = new ArrayList<>(); TokenStream ts = ctx.getTokens(); - while (!ts.isAtEnd()) { + while (ts.isAtEnd()) { // 跳过空行(NEWLINE) if (ts.peek().getType() == TokenType.NEWLINE) { ts.next(); diff --git a/src/main/java/org/jcnc/snow/compiler/parser/TopLevelParser.java b/src/main/java/org/jcnc/snow/compiler/parser/TopLevelParser.java index 4c0a5af..926394c 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/TopLevelParser.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/TopLevelParser.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/TopLevelParser.java package org.jcnc.snow.compiler.parser; import org.jcnc.snow.compiler.parser.context.ParserContext; diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTJsonSerializer.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTJsonSerializer.java index 503be2b..48a8296 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTJsonSerializer.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTJsonSerializer.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/ast/ASTJsonSerializer.java package org.jcnc.snow.compiler.parser.ast; import java.util.List; @@ -39,7 +38,7 @@ public class ASTJsonSerializer { for (int i = 0; i < m.getImports().size(); i++) { ImportNode imp = m.getImports().get(i); sb.append("{\"type\":\"Import\",\"module\":") - .append(quote(imp.getModuleName())).append("}"); + .append(quote(imp.moduleName())).append("}"); if (i + 1 < m.getImports().size()) sb.append(","); } sb.append("],"); @@ -56,20 +55,20 @@ public class ASTJsonSerializer { private static String functionToJson(FunctionNode f) { StringBuilder sb = new StringBuilder(); sb.append("{\"type\":\"Function\",") - .append("\"name\":").append(quote(f.getName())).append(","); + .append("\"name\":").append(quote(f.name())).append(","); // parameters sb.append("\"parameters\":["); - for (int i = 0; i < f.getParameters().size(); i++) { - ParameterNode p = f.getParameters().get(i); - sb.append("{\"name\":").append(quote(p.getName())) - .append(",\"type\":").append(quote(p.getType())).append("}"); - if (i + 1 < f.getParameters().size()) sb.append(","); + for (int i = 0; i < f.parameters().size(); i++) { + ParameterNode p = f.parameters().get(i); + sb.append("{\"name\":").append(quote(p.name())) + .append(",\"type\":").append(quote(p.type())).append("}"); + if (i + 1 < f.parameters().size()) sb.append(","); } sb.append("],"); - sb.append("\"returnType\":").append(quote(f.getReturnType())).append(","); + sb.append("\"returnType\":").append(quote(f.returnType())).append(","); // body sb.append("\"body\":["); - List body = f.getBody(); + List body = f.body(); for (int i = 0; i < body.size(); i++) { sb.append(nodeToJson(body.get(i))); if (i + 1 < body.size()) sb.append(","); @@ -92,18 +91,18 @@ public class ASTJsonSerializer { private static String assignmentToJson(AssignmentNode a) { return "{\"type\":\"Assignment\",\"variable\":" - + quote(a.getVariable()) + + quote(a.variable()) + ",\"value\":" - + exprToJson(a.getValue()) + + exprToJson(a.value()) + "}"; } private static String ifToJson(IfNode i) { StringBuilder sb = new StringBuilder(); sb.append("{\"type\":\"If\",\"condition\":") - .append(exprToJson(i.getCondition())).append(","); + .append(exprToJson(i.condition())).append(","); sb.append("\"then\":["); - List thenBranch = i.getThenBranch(); + List thenBranch = i.thenBranch(); for (int j = 0; j < thenBranch.size(); j++) { sb.append(nodeToJson(thenBranch.get(j))); if (j + 1 < thenBranch.size()) sb.append(","); @@ -115,11 +114,11 @@ public class ASTJsonSerializer { private static String loopToJson(LoopNode l) { StringBuilder sb = new StringBuilder(); sb.append("{\"type\":\"Loop\",") - .append("\"initializer\":").append(nodeToJson(l.getInitializer())).append(",") - .append("\"condition\":").append(exprToJson(l.getCondition())).append(",") - .append("\"update\":").append(nodeToJson(l.getUpdate())).append(",") + .append("\"initializer\":").append(nodeToJson(l.initializer())).append(",") + .append("\"condition\":").append(exprToJson(l.condition())).append(",") + .append("\"update\":").append(nodeToJson(l.update())).append(",") .append("\"body\":["); - List body = l.getBody(); + List body = l.body(); for (int i = 0; i < body.size(); i++) { sb.append(nodeToJson(body.get(i))); if (i + 1 < body.size()) sb.append(","); @@ -140,7 +139,7 @@ public class ASTJsonSerializer { private static String exprStmtToJson(ExpressionStatementNode es) { return "{\"type\":\"ExpressionStatement\",\"expression\":" - + exprToJson(es.getExpression()) + + exprToJson(es.expression()) + "}"; } @@ -163,30 +162,30 @@ public class ASTJsonSerializer { + "}"; } private static String idToJson(IdentifierNode id) { - return "{\"type\":\"Identifier\",\"name\":" + quote(id.getName()) + "}"; + return "{\"type\":\"Identifier\",\"name\":" + quote(id.name()) + "}"; } private static String numToJson(NumberLiteralNode num) { - return "{\"type\":\"NumberLiteral\",\"value\":" + quote(num.getValue()) + "}"; + return "{\"type\":\"NumberLiteral\",\"value\":" + quote(num.value()) + "}"; } private static String strToJson(StringLiteralNode str) { - return "{\"type\":\"StringLiteral\",\"value\":" + quote(str.getValue()) + "}"; + return "{\"type\":\"StringLiteral\",\"value\":" + quote(str.value()) + "}"; } private static String callToJson(CallExpressionNode c) { StringBuilder sb = new StringBuilder(); sb.append("{\"type\":\"CallExpression\",\"callee\":") - .append(exprToJson(c.getCallee())).append(",") + .append(exprToJson(c.callee())).append(",") .append("\"arguments\":["); - for (int i = 0; i < c.getArguments().size(); i++) { - sb.append(exprToJson(c.getArguments().get(i))); - if (i + 1 < c.getArguments().size()) sb.append(","); + for (int i = 0; i < c.arguments().size(); i++) { + sb.append(exprToJson(c.arguments().get(i))); + if (i + 1 < c.arguments().size()) sb.append(","); } sb.append("]}"); return sb.toString(); } private static String memberToJson(MemberExpressionNode m) { return "{\"type\":\"MemberExpression\",\"object\":" - + exprToJson(m.getObject()) - + ",\"member\":" + quote(m.getMember()) + + exprToJson(m.object()) + + ",\"member\":" + quote(m.member()) + "}"; } 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 56afcfb..f805b78 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 @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/ast/ASTPrinter.java package org.jcnc.snow.compiler.parser.ast; import java.util.List; @@ -19,16 +18,16 @@ public class ASTPrinter { if (n instanceof ModuleNode m) { System.out.println(pad + "module " + m.getName()); for (ImportNode imp : m.getImports()) { - System.out.println(pad + " import " + imp.getModuleName()); + System.out.println(pad + " import " + imp.moduleName()); } for (FunctionNode fn : m.getFunctions()) { print(fn, indent + 1); } } else if (n instanceof FunctionNode f) { - System.out.println(pad + "function " + f.getName() - + "(params=" + f.getParameters() + ", return=" + f.getReturnType() + ")"); - for (StatementNode stmt : f.getBody()) { + System.out.println(pad + "function " + f.name() + + "(params=" + f.parameters() + ", return=" + f.returnType() + ")"); + for (StatementNode stmt : f.body()) { print(stmt, indent + 1); } @@ -40,21 +39,21 @@ public class ASTPrinter { System.out.println(pad + "declare " + d.getName() + ":" + d.getType() + init); } else if (n instanceof AssignmentNode a) { - System.out.println(pad + a.getVariable() + " = " + a.getValue()); + System.out.println(pad + a.variable() + " = " + a.value()); } else if (n instanceof IfNode i) { - System.out.println(pad + "if " + i.getCondition()); - for (StatementNode stmt : i.getThenBranch()) { + System.out.println(pad + "if " + i.condition()); + for (StatementNode stmt : i.thenBranch()) { print(stmt, indent + 1); } } else if (n instanceof LoopNode l) { System.out.println(pad + "loop {"); - print(l.getInitializer(), indent + 1); - System.out.println(pad + " condition: " + l.getCondition()); - System.out.println(pad + " update: " + l.getUpdate()); + print(l.initializer(), indent + 1); + System.out.println(pad + " condition: " + l.condition()); + System.out.println(pad + " update: " + l.update()); System.out.println(pad + " body {"); - for (StatementNode stmt : l.getBody()) { + for (StatementNode stmt : l.body()) { print(stmt, indent + 2); } System.out.println(pad + " }"); @@ -65,7 +64,7 @@ public class ASTPrinter { r.getExpression().map(e -> " " + e).orElse("")); } else if (n instanceof ExpressionStatementNode es) { - System.out.println(pad + es.getExpression()); + System.out.println(pad + es.expression()); } else { // 回退:直接调用 toString() diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/AssignmentNode.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/AssignmentNode.java index 4201a0d..734b375 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/AssignmentNode.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/AssignmentNode.java @@ -1,25 +1,9 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/ast/AssignmentNode.java package org.jcnc.snow.compiler.parser.ast; /** * 赋值语句节点,例如 x = expr。 */ -public class AssignmentNode implements StatementNode { - private final String variable; - private final ExpressionNode value; - - public AssignmentNode(String variable, ExpressionNode value) { - this.variable = variable; - this.value = value; - } - - public String getVariable() { - return variable; - } - - public ExpressionNode getValue() { - return value; - } +public record AssignmentNode(String variable, ExpressionNode value) implements StatementNode { @Override public String toString() { diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/BinaryExpressionNode.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/BinaryExpressionNode.java index 965d0d8..9c73e95 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/BinaryExpressionNode.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/BinaryExpressionNode.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/ast/BinaryExpressionNode.java package org.jcnc.snow.compiler.parser.ast; /** diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/CallExpressionNode.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/CallExpressionNode.java index 313c76b..d567fa6 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/CallExpressionNode.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/CallExpressionNode.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/ast/CallExpressionNode.java package org.jcnc.snow.compiler.parser.ast; import java.util.List; @@ -6,17 +5,7 @@ import java.util.List; /** * 函数调用表达式节点:callee(args…)。 */ -public class CallExpressionNode implements ExpressionNode { - private final ExpressionNode callee; - private final List arguments; - - public CallExpressionNode(ExpressionNode callee, List arguments) { - this.callee = callee; - this.arguments = arguments; - } - - public ExpressionNode getCallee() { return callee; } - public List getArguments() { return arguments; } +public record CallExpressionNode(ExpressionNode callee, List arguments) implements ExpressionNode { @Override public String toString() { diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/DeclarationNode.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/DeclarationNode.java index 143008b..aab840c 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/DeclarationNode.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/DeclarationNode.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/ast/DeclarationNode.java package org.jcnc.snow.compiler.parser.ast; import java.util.Optional; diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/ExpressionNode.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/ExpressionNode.java index 28b0b83..5aceece 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/ExpressionNode.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/ExpressionNode.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/ast/ExpressionNode.java package org.jcnc.snow.compiler.parser.ast; /** diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/ExpressionStatementNode.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/ExpressionStatementNode.java index 8ca32c3..c5b7eb7 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/ExpressionStatementNode.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/ExpressionStatementNode.java @@ -1,15 +1,7 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/ast/ExpressionStatementNode.java package org.jcnc.snow.compiler.parser.ast; /** * 单独的表达式语句节点(如函数调用、赋值等)。 */ -public class ExpressionStatementNode implements StatementNode { - private final ExpressionNode expression; - - public ExpressionStatementNode(ExpressionNode expression) { - this.expression = expression; - } - - public ExpressionNode getExpression() { return expression; } +public record ExpressionStatementNode(ExpressionNode expression) implements StatementNode { } diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/FunctionNode.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/FunctionNode.java index f801986..cf36cf0 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/FunctionNode.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/FunctionNode.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/ast/FunctionNode.java package org.jcnc.snow.compiler.parser.ast; import java.util.List; @@ -6,22 +5,6 @@ import java.util.List; /** * 函数定义节点:包含函数名、参数列表、返回类型和函数体语句列表。 */ -public class FunctionNode implements Node { - private final String name; - private final List parameters; - private final String returnType; - private final List body; - - public FunctionNode(String name, List parameters, - String returnType, List body) { - this.name = name; - this.parameters = parameters; - this.returnType = returnType; - this.body = body; - } - - public String getName() { return name; } - public List getParameters() { return parameters; } - public String getReturnType() { return returnType; } - public List getBody() { return body; } +public record FunctionNode(String name, List parameters, String returnType, + List body) implements Node { } diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/IdentifierNode.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/IdentifierNode.java index 131bb5b..4f3af86 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/IdentifierNode.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/IdentifierNode.java @@ -1,17 +1,9 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/ast/IdentifierNode.java package org.jcnc.snow.compiler.parser.ast; /** * 标识符表达式节点。 */ -public class IdentifierNode implements ExpressionNode { - private final String name; - - public IdentifierNode(String name) { - this.name = name; - } - - public String getName() { return name; } +public record IdentifierNode(String name) implements ExpressionNode { @Override public String toString() { return name; diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/IfNode.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/IfNode.java index 8f265a1..5f993e5 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/IfNode.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/IfNode.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/ast/IfNode.java package org.jcnc.snow.compiler.parser.ast; import java.util.List; @@ -6,15 +5,5 @@ import java.util.List; /** * if 语句节点:包含条件表达式和 then 分支语句列表。 */ -public class IfNode implements StatementNode { - private final ExpressionNode condition; - private final List thenBranch; - - public IfNode(ExpressionNode condition, List thenBranch) { - this.condition = condition; - this.thenBranch = thenBranch; - } - - public ExpressionNode getCondition() { return condition; } - public List getThenBranch() { return thenBranch; } +public record IfNode(ExpressionNode condition, List thenBranch) implements StatementNode { } diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/ImportNode.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/ImportNode.java index 86f4f2b..fca6340 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/ImportNode.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/ImportNode.java @@ -1,15 +1,7 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/ast/ImportNode.java package org.jcnc.snow.compiler.parser.ast; /** * import 语句节点:仅保存被导入模块名。 */ -public class ImportNode implements Node { - private final String moduleName; - - public ImportNode(String moduleName) { - this.moduleName = moduleName; - } - - public String getModuleName() { return moduleName; } +public record ImportNode(String moduleName) implements Node { } diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/LoopNode.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/LoopNode.java index 5f29670..42e3d2f 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/LoopNode.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/LoopNode.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/ast/LoopNode.java package org.jcnc.snow.compiler.parser.ast; import java.util.List; @@ -6,24 +5,6 @@ import java.util.List; /** * loop 语句节点:包含初始化语句、条件表达式、更新语句和循环体。 */ -public class LoopNode implements StatementNode { - private final StatementNode initializer; - private final ExpressionNode condition; - private final StatementNode update; - private final List body; - - public LoopNode(StatementNode initializer, - ExpressionNode condition, - StatementNode update, - List body) { - this.initializer = initializer; - this.condition = condition; - this.update = update; - this.body = body; - } - - public StatementNode getInitializer() { return initializer; } - public ExpressionNode getCondition() { return condition; } - public StatementNode getUpdate() { return update; } - public List getBody() { return body; } +public record LoopNode(StatementNode initializer, ExpressionNode condition, StatementNode update, + List body) implements StatementNode { } diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/MemberExpressionNode.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/MemberExpressionNode.java index 39ff9fe..3846a30 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/MemberExpressionNode.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/MemberExpressionNode.java @@ -1,20 +1,9 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/ast/MemberExpressionNode.java package org.jcnc.snow.compiler.parser.ast; /** * 成员访问表达式节点,如 obj.prop。 */ -public class MemberExpressionNode implements ExpressionNode { - private final ExpressionNode object; - private final String member; - - public MemberExpressionNode(ExpressionNode object, String member) { - this.object = object; - this.member = member; - } - - public ExpressionNode getObject() { return object; } - public String getMember() { return member; } +public record MemberExpressionNode(ExpressionNode object, String member) implements ExpressionNode { @Override public String toString() { return object + "." + member; diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/ModuleNode.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/ModuleNode.java index 5e27c2b..7308d0e 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/ModuleNode.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/ModuleNode.java @@ -37,11 +37,11 @@ public class ModuleNode implements Node { public String toString() { StringJoiner importJoiner = new StringJoiner(", "); for (ImportNode imp : imports) { - importJoiner.add(imp.getModuleName()); + importJoiner.add(imp.moduleName()); } StringJoiner funcJoiner = new StringJoiner(", "); for (FunctionNode fn : functions) { - funcJoiner.add(fn.getName()); + funcJoiner.add(fn.name()); } return "Module(name=" + name + ", imports=[" + importJoiner.toString() + "]" diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/Node.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/Node.java index 3ca9008..2f974f1 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/Node.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/Node.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/ast/Node.java package org.jcnc.snow.compiler.parser.ast; /** diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/NumberLiteralNode.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/NumberLiteralNode.java index 3d71949..a8bd1db 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/NumberLiteralNode.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/NumberLiteralNode.java @@ -1,17 +1,9 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/ast/NumberLiteralNode.java package org.jcnc.snow.compiler.parser.ast; /** * 数字字面量表达式节点。 */ -public class NumberLiteralNode implements ExpressionNode { - private final String value; - - public NumberLiteralNode(String value) { - this.value = value; - } - - public String getValue() { return value; } +public record NumberLiteralNode(String value) implements ExpressionNode { @Override public String toString() { diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/ParameterNode.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/ParameterNode.java index bf18fdf..14f3717 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/ParameterNode.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/ParameterNode.java @@ -1,25 +1,9 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/ast/ParameterNode.java package org.jcnc.snow.compiler.parser.ast; /** * 函数参数节点:包含参数名和类型。 */ -public class ParameterNode implements Node { - private final String name; - private final String type; - - public ParameterNode(String name, String type) { - this.name = name; - this.type = type; - } - - public String getName() { - return name; - } - - public String getType() { - return type; - } +public record ParameterNode(String name, String type) implements Node { /** * 返回参数的字符串表示,例如 "num1:int",便于列表打印。 diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/ReturnNode.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/ReturnNode.java index a137157..0fb655c 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/ReturnNode.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/ReturnNode.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/ast/ReturnNode.java package org.jcnc.snow.compiler.parser.ast; import java.util.Optional; diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/StatementNode.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/StatementNode.java index 1655a24..0ee1141 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/StatementNode.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/StatementNode.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/ast/StatementNode.java package org.jcnc.snow.compiler.parser.ast; /** diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/StringLiteralNode.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/StringLiteralNode.java index 3a6033c..01d7b5e 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/StringLiteralNode.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/StringLiteralNode.java @@ -1,20 +1,11 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/ast/StringLiteralNode.java package org.jcnc.snow.compiler.parser.ast; /** * 字符串字面量表达式节点,如 "hello"。 + * + * @param value 不包含引号的字符串内容 */ -public class StringLiteralNode implements ExpressionNode { - /** 不包含引号的字符串内容 */ - private final String value; - - public StringLiteralNode(String value) { - this.value = value; - } - - public String getValue() { - return value; - } +public record StringLiteralNode(String value) implements ExpressionNode { /** * 打印时在两端加上引号, 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 f77894f..ebdb0d3 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,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/context/ParseException.java package org.jcnc.snow.compiler.parser.context; /** 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 60d03f5..1c9bf75 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 @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/context/ParserContext.java package org.jcnc.snow.compiler.parser.context; import org.jcnc.snow.compiler.lexer.token.Token; diff --git a/src/main/java/org/jcnc/snow/compiler/parser/context/TokenStream.java b/src/main/java/org/jcnc/snow/compiler/parser/context/TokenStream.java index 6e14c07..ac76751 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/context/TokenStream.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/context/TokenStream.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/context/TokenStream.java package org.jcnc.snow.compiler.parser.context; import org.jcnc.snow.compiler.lexer.token.Token; @@ -73,6 +72,6 @@ public class TokenStream { } public boolean isAtEnd() { - return peek().getType() == TokenType.EOF; + return peek().getType() != TokenType.EOF; } } diff --git a/src/main/java/org/jcnc/snow/compiler/parser/expression/BinaryOperatorParselet.java b/src/main/java/org/jcnc/snow/compiler/parser/expression/BinaryOperatorParselet.java index 469dce6..77142df 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/expression/BinaryOperatorParselet.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/expression/BinaryOperatorParselet.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/expression/BinaryOperatorParselet.java package org.jcnc.snow.compiler.parser.expression; import org.jcnc.snow.compiler.parser.ast.BinaryExpressionNode; 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 81cd18c..965862c 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 @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/expression/CallParselet.java package org.jcnc.snow.compiler.parser.expression; import org.jcnc.snow.compiler.parser.ast.CallExpressionNode; diff --git a/src/main/java/org/jcnc/snow/compiler/parser/expression/ExpressionParser.java b/src/main/java/org/jcnc/snow/compiler/parser/expression/ExpressionParser.java index 699f0c7..7bf554c 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/expression/ExpressionParser.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/expression/ExpressionParser.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/expression/ExpressionParser.java package org.jcnc.snow.compiler.parser.expression; import org.jcnc.snow.compiler.parser.ast.ExpressionNode; diff --git a/src/main/java/org/jcnc/snow/compiler/parser/expression/GroupingParselet.java b/src/main/java/org/jcnc/snow/compiler/parser/expression/GroupingParselet.java index 88e6f2a..d7dbc7d 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/expression/GroupingParselet.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/expression/GroupingParselet.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/expression/GroupingParselet.java package org.jcnc.snow.compiler.parser.expression; import org.jcnc.snow.compiler.lexer.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 6695b78..790d31e 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 @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/expression/IdentifierParselet.java package org.jcnc.snow.compiler.parser.expression; import org.jcnc.snow.compiler.lexer.token.Token; 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 b019dee..9e24470 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 @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/expression/MemberParselet.java package org.jcnc.snow.compiler.parser.expression; import org.jcnc.snow.compiler.lexer.token.TokenType; 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 63b2cd2..5077f63 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 @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/expression/NumberLiteralParselet.java package org.jcnc.snow.compiler.parser.expression; import org.jcnc.snow.compiler.lexer.token.Token; 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 94e5086..dd0d740 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 @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/expression/PrattExpressionParser.java package org.jcnc.snow.compiler.parser.expression; import org.jcnc.snow.compiler.lexer.token.Token; @@ -51,7 +50,7 @@ public class PrattExpressionParser implements ExpressionParser { } ExpressionNode left = prefix.parse(ctx, token); - while (!ctx.getTokens().isAtEnd() && + while (ctx.getTokens().isAtEnd() && prec.ordinal() < nextPrecedence(ctx)) { String lex = ctx.getTokens().peek().getLexeme(); InfixParselet infix = infixes.get(lex); diff --git a/src/main/java/org/jcnc/snow/compiler/parser/expression/Precedence.java b/src/main/java/org/jcnc/snow/compiler/parser/expression/Precedence.java index 25f5278..a706e19 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/expression/Precedence.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/expression/Precedence.java @@ -1,4 +1,4 @@ -package org.jcnc.snow.compiler.parser.expression;// File: src/main/java/org/jcnc/snow/compiler/parser/expression/Precedence.java +package org.jcnc.snow.compiler.parser.expression; /** * 运算符优先级枚举,用于 Pratt 算法比较。 diff --git a/src/main/java/org/jcnc/snow/compiler/parser/expression/PrefixParselet.java b/src/main/java/org/jcnc/snow/compiler/parser/expression/PrefixParselet.java index 900433a..444f07c 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/expression/PrefixParselet.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/expression/PrefixParselet.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/expression/PrefixParselet.java package org.jcnc.snow.compiler.parser.expression; import org.jcnc.snow.compiler.parser.ast.ExpressionNode; 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 7705a8c..2f0b2dc 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 @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/expression/StringLiteralParselet.java package org.jcnc.snow.compiler.parser.expression; import org.jcnc.snow.compiler.lexer.token.Token; 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 a8f1ce0..9e62c54 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 @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/factory/StatementParserFactory.java package org.jcnc.snow.compiler.parser.factory; import org.jcnc.snow.compiler.parser.statement.*; diff --git a/src/main/java/org/jcnc/snow/compiler/parser/factory/TopLevelParserFactory.java b/src/main/java/org/jcnc/snow/compiler/parser/factory/TopLevelParserFactory.java index 7a6f39a..71c68b8 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/factory/TopLevelParserFactory.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/factory/TopLevelParserFactory.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/factory/TopLevelParserFactory.java package org.jcnc.snow.compiler.parser.factory; import org.jcnc.snow.compiler.parser.TopLevelParser; diff --git a/src/main/java/org/jcnc/snow/compiler/parser/function/FunctionParser.java b/src/main/java/org/jcnc/snow/compiler/parser/function/FunctionParser.java index 55ffe4d..03476b8 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/function/FunctionParser.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/function/FunctionParser.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/function/FunctionParser.java package org.jcnc.snow.compiler.parser.function; import org.jcnc.snow.compiler.lexer.token.TokenType; diff --git a/src/main/java/org/jcnc/snow/compiler/parser/module/ImportParser.java b/src/main/java/org/jcnc/snow/compiler/parser/module/ImportParser.java index 6c2c207..6f0465b 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/module/ImportParser.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/module/ImportParser.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/module/ImportParser.java package org.jcnc.snow.compiler.parser.module; import org.jcnc.snow.compiler.lexer.token.TokenType; @@ -21,17 +20,13 @@ public class ImportParser { ctx.getTokens().expect(":"); List imports = new ArrayList<>(); // 读取第一个模块名 - String name = ctx.getTokens() - .expectType(TokenType.IDENTIFIER) - .getLexeme(); - imports.add(new ImportNode(name)); // 继续读取逗号分隔的模块名 - while (ctx.getTokens().match(",")) { + do { String mod = ctx.getTokens() .expectType(TokenType.IDENTIFIER) .getLexeme(); imports.add(new ImportNode(mod)); - } + } while (ctx.getTokens().match(",")); // 消费行尾 ctx.getTokens().expectType(TokenType.NEWLINE); return imports; diff --git a/src/main/java/org/jcnc/snow/compiler/parser/module/ModuleParser.java b/src/main/java/org/jcnc/snow/compiler/parser/module/ModuleParser.java index c7973c3..8a469e2 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/module/ModuleParser.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/module/ModuleParser.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/module/ModuleParser.java package org.jcnc.snow.compiler.parser.module; import org.jcnc.snow.compiler.lexer.token.TokenType; diff --git a/src/main/java/org/jcnc/snow/compiler/parser/statement/DeclarationStatementParser.java b/src/main/java/org/jcnc/snow/compiler/parser/statement/DeclarationStatementParser.java index e9a8391..38e13f6 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/statement/DeclarationStatementParser.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/statement/DeclarationStatementParser.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/statement/DeclarationStatementParser.java package org.jcnc.snow.compiler.parser.statement; import org.jcnc.snow.compiler.lexer.token.TokenType; diff --git a/src/main/java/org/jcnc/snow/compiler/parser/statement/ExpressionStatementParser.java b/src/main/java/org/jcnc/snow/compiler/parser/statement/ExpressionStatementParser.java index 519b7f6..c0fdca6 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/statement/ExpressionStatementParser.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/statement/ExpressionStatementParser.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/statement/ExpressionStatementParser.java package org.jcnc.snow.compiler.parser.statement; import org.jcnc.snow.compiler.lexer.token.TokenType; 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 e2803ae..c1e8102 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 @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/statement/IfStatementParser.java package org.jcnc.snow.compiler.parser.statement; import org.jcnc.snow.compiler.lexer.token.TokenType; 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 a6517ac..6dff091 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,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/statement/LoopStatementParser.java package org.jcnc.snow.compiler.parser.statement; import org.jcnc.snow.compiler.lexer.token.TokenType; diff --git a/src/main/java/org/jcnc/snow/compiler/parser/statement/ReturnStatementParser.java b/src/main/java/org/jcnc/snow/compiler/parser/statement/ReturnStatementParser.java index 24dd0dd..5f34b02 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/statement/ReturnStatementParser.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/statement/ReturnStatementParser.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/statement/ReturnStatementParser.java package org.jcnc.snow.compiler.parser.statement; import org.jcnc.snow.compiler.lexer.token.TokenType; diff --git a/src/main/java/org/jcnc/snow/compiler/parser/statement/StatementParser.java b/src/main/java/org/jcnc/snow/compiler/parser/statement/StatementParser.java index 114b19c..20e6388 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/statement/StatementParser.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/statement/StatementParser.java @@ -1,4 +1,3 @@ -// File: src/main/java/org/jcnc/snow/compiler/parser/statement/StatementParser.java package org.jcnc.snow.compiler.parser.statement; import org.jcnc.snow.compiler.parser.context.ParserContext;