From c4e9e541fba4af7efe208f51280d50476f188568 Mon Sep 17 00:00:00 2001 From: Luke Date: Tue, 26 Aug 2025 01:17:47 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E5=85=A8?= =?UTF-8?q?=E5=B1=80=E5=8F=98=E9=87=8F=E5=A3=B0=E6=98=8E=E7=9A=84=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -根据变量是否为常量,动态设置符号种类 -针对常量和变量分别定制重复声明的错误信息 --- .../snow/compiler/semantic/core/FunctionChecker.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/jcnc/snow/compiler/semantic/core/FunctionChecker.java b/src/main/java/org/jcnc/snow/compiler/semantic/core/FunctionChecker.java index 50f1ec6..f60d854 100644 --- a/src/main/java/org/jcnc/snow/compiler/semantic/core/FunctionChecker.java +++ b/src/main/java/org/jcnc/snow/compiler/semantic/core/FunctionChecker.java @@ -57,13 +57,17 @@ public record FunctionChecker(Context ctx) { // 先构建全局符号表 SymbolTable globalScope = new SymbolTable(null); + // 根据 isConst() 决定种类 for (DeclarationNode g : mod.globals()) { var t = ctx.parseType(g.getType()); - // 检查全局变量是否重复声明 - if (!globalScope.define(new Symbol(g.getName(), t, SymbolKind.VARIABLE))) { + SymbolKind k = g.isConst() ? SymbolKind.CONSTANT : SymbolKind.VARIABLE; + + // 错误信息按常量/变量区分 + String dupType = g.isConst() ? "常量" : "变量"; + if (!globalScope.define(new Symbol(g.getName(), t, k))) { ctx.errors().add(new SemanticError( g, - "全局变量重复声明: " + g.getName() + dupType + "重复声明: " + g.getName() )); } }