From da7d7bbcaa4de912954c4e115ffc5da487a4ef31 Mon Sep 17 00:00:00 2001 From: Luke Date: Tue, 26 Aug 2025 01:17:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=B8=B8=E9=87=8F?= =?UTF-8?q?=E5=A3=B0=E6=98=8E=E6=94=AF=E6=8C=81=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=A3=B0=E6=98=8E=E8=AF=AD=E5=8F=A5=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 增加对常量声明的支持,通过匹配 "const" 关键字 -优化代码结构,使用 var tokens变量引用词法 token 流 - 简化代码逻辑,提高可读性和可维护性 --- .../statement/DeclarationStatementParser.java | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) 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 5e0470b..319986a 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 @@ -34,45 +34,51 @@ public class DeclarationStatementParser implements StatementParser { */ @Override public DeclarationNode parse(ParserContext ctx) { + // 便捷引用词法 token 流 + var tokens = ctx.getTokens(); + // 获取当前 token 的行号、列号和文件名 - int line = ctx.getTokens().peek().getLine(); - int column = ctx.getTokens().peek().getCol(); + int line = tokens.peek().getLine(); + int column = tokens.peek().getCol(); String file = ctx.getSourceName(); // 声明语句必须以 "declare" 开头 - ctx.getTokens().expect("declare"); + tokens.expect("declare"); + + // 是否声明为常量 + boolean isConst = tokens.match("const"); // 获取变量名称(标识符) - String name = ctx.getTokens() + String name = tokens .expectType(TokenType.IDENTIFIER) .getLexeme(); // 类型标注的冒号分隔符 - ctx.getTokens().expect(":"); + tokens.expect(":"); // 获取变量类型(类型标识符) StringBuilder type = new StringBuilder( - ctx.getTokens() + tokens .expectType(TokenType.TYPE) .getLexeme() ); // 消费多维数组类型后缀 "[]" - while (ctx.getTokens().match("[")) { - ctx.getTokens().expectType(TokenType.RBRACKET); // 必须配对 + while (tokens.match("[")) { + tokens.expectType(TokenType.RBRACKET); // 必须配对 type.append("[]"); // 类型名称拼接 [],如 int[][] 等 } // 可选初始化表达式(=号右侧) ExpressionNode init = null; - if (ctx.getTokens().match("=")) { + if (tokens.match("=")) { init = new PrattExpressionParser().parse(ctx); } // 声明语句必须以换行符结尾 - ctx.getTokens().expectType(TokenType.NEWLINE); + tokens.expectType(TokenType.NEWLINE); // 返回构建好的声明语法树节点 - return new DeclarationNode(name, type.toString(), init, new NodeContext(line, column, file)); + return new DeclarationNode(name, type.toString(), isConst, init, new NodeContext(line, column, file)); } }