From 55ab421d88c4b308b600b6cb8717be813a082832 Mon Sep 17 00:00:00 2001 From: zhangxun <1958638841@qq.com> Date: Wed, 2 Jul 2025 22:10:16 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20AOT=20=E7=BC=96=E8=AF=91=E5=90=8E?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E5=AE=9A=E4=BD=8D=E8=AF=AD=E4=B9=89=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compiler/ir/builder/StatementBuilder.java | 4 +-- .../compiler/ir/utils/ComparisonUtils.java | 2 +- .../compiler/ir/utils/ExpressionUtils.java | 2 +- .../compiler/parser/ast/BoolLiteralNode.java | 16 +++++++++--- .../parser/ast/NumberLiteralNode.java | 12 +++++++-- .../parser/ast/StringLiteralNode.java | 12 +++++++-- .../snow/compiler/parser/ast/base/Node.java | 25 +++++++++++++++++-- .../expression/BoolLiteralParselet.java | 2 +- .../expression/NumberLiteralParselet.java | 2 +- .../expression/StringLiteralParselet.java | 2 +- .../compiler/parser/function/ASTPrinter.java | 4 +-- .../parser/utils/ASTJsonSerializer.java | 8 +++--- .../expression/CallExpressionAnalyzer.java | 6 ++--- .../semantic/error/SemanticError.java | 15 +++-------- 14 files changed, 74 insertions(+), 38 deletions(-) diff --git a/src/main/java/org/jcnc/snow/compiler/ir/builder/StatementBuilder.java b/src/main/java/org/jcnc/snow/compiler/ir/builder/StatementBuilder.java index f731c57..557634b 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/builder/StatementBuilder.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/builder/StatementBuilder.java @@ -66,12 +66,12 @@ public class StatementBuilder { buildIf(ifNode); return; } - if (stmt instanceof ExpressionStatementNode(ExpressionNode exp, _, _, _)) { + if (stmt instanceof ExpressionStatementNode(ExpressionNode exp, int _, int _, String _)) { // 纯表达式语句,如 foo(); expr.build(exp); return; } - if (stmt instanceof AssignmentNode(String var, ExpressionNode rhs, _, _, _)) { + if (stmt instanceof AssignmentNode(String var, ExpressionNode rhs, int _, int _, String _)) { // 赋值语句,如 a = b + 1; final String type = ctx.getScope().lookupType(var); diff --git a/src/main/java/org/jcnc/snow/compiler/ir/utils/ComparisonUtils.java b/src/main/java/org/jcnc/snow/compiler/ir/utils/ComparisonUtils.java index 59042e9..08b42b8 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/utils/ComparisonUtils.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/utils/ComparisonUtils.java @@ -41,7 +41,7 @@ public final class ComparisonUtils { /* ------------ 内部工具 ------------ */ private static boolean isLongLiteral(ExpressionNode node) { - if (node instanceof NumberLiteralNode(String value)) { + if (node instanceof NumberLiteralNode(String value, int _, int _, String _)) { return value.endsWith("L") || value.endsWith("l"); } return false; // 变量暂不处理(后续可扩展符号表查询) diff --git a/src/main/java/org/jcnc/snow/compiler/ir/utils/ExpressionUtils.java b/src/main/java/org/jcnc/snow/compiler/ir/utils/ExpressionUtils.java index 7c93c9a..291b861 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/utils/ExpressionUtils.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/utils/ExpressionUtils.java @@ -127,7 +127,7 @@ public final class ExpressionUtils { /** 递归推断单个表达式节点的类型后缀(b/s/i/l/f/d)。 */ private static char typeChar(ExpressionNode node) { - if (node instanceof NumberLiteralNode(String value)) { + if (node instanceof NumberLiteralNode(String value, int _, int _, String _)) { char last = Character.toLowerCase(value.charAt(value.length() - 1)); return switch (last) { case 'b','s','i','l','f','d' -> last; diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/BoolLiteralNode.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/BoolLiteralNode.java index 15c7088..bb46a30 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/BoolLiteralNode.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/BoolLiteralNode.java @@ -9,9 +9,17 @@ import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode; * 表达布尔类型的字面量常量(如 "true" 或 "false")。 *
* - * @param value 字面量的布尔值 + * @param value 字面量的布尔值 + * @param line 当前节点所在的行号 + * @param column 当前节点所在的列号 + * @param file 当前节点所在的文件 */ -public record BoolLiteralNode(boolean value) implements ExpressionNode { +public record BoolLiteralNode( + boolean value, + int line, + int column, + String file +) implements ExpressionNode { /** * 使用布尔字面量字符串构造一个 {@code BoolLiteralNode} 实例。 @@ -22,8 +30,8 @@ public record BoolLiteralNode(boolean value) implements ExpressionNode { * * @param lexeme 布尔字面量的字符串表示 */ - public BoolLiteralNode(String lexeme) { - this(Boolean.parseBoolean(lexeme)); + public BoolLiteralNode(String lexeme, int line, int column, String file) { + this(Boolean.parseBoolean(lexeme), line, column, file); } /** 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 f30f526..9f253e2 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 @@ -10,9 +10,17 @@ import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode; * 在语义分析或类型推导阶段再行解析为具体数值类型。 * * - * @param value 数字字面量的原始字符串表示 + * @param value 数字字面量的原始字符串表示 + * @param line 当前节点所在的行号 + * @param column 当前节点所在的列号 + * @param file 当前节点所在的文件 */ -public record NumberLiteralNode(String value) implements ExpressionNode { +public record NumberLiteralNode( + String value, + int line, + int column, + String file +) implements ExpressionNode { /** * 返回数字字面量的字符串形式。 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 b04d561..daa9f42 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 @@ -9,9 +9,17 @@ import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode; * 节点内部仅保存不带引号的字符串内容,便于后续语义处理或编码。 * * - * @param value 字符串常量的内容,原始值中不包含双引号 + * @param value 字符串常量的内容,原始值中不包含双引号 + * @param line 当前节点所在的行号 + * @param column 当前节点所在的列号 + * @param file 当前节点所在的文件 */ -public record StringLiteralNode(String value) implements ExpressionNode { +public record StringLiteralNode( + String value, + int line, + int column, + String file +) implements ExpressionNode { /** * 返回字符串字面量的带引号表示,适用于语法树调试或文本输出。 diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/base/Node.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/base/Node.java index 8c7a8b9..5cba805 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/base/Node.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/base/Node.java @@ -3,7 +3,7 @@ package org.jcnc.snow.compiler.parser.ast.base; /** * {@code Node} 是抽象语法树(AST)中所有语法节点的统一根接口。 *- * 作为标记接口(Marker Interface),该接口不定义任何方法, + * 作为标记接口(Marker Interface),该接口定义 3 个方法:line()、column() 和 file() 用于定位错误, * 主要用于统一标识并组织 AST 体系中的各种语法构件节点,包括: *
*