From 6d835b1655223dccc58c489e4a92423e6f808ab9 Mon Sep 17 00:00:00 2001 From: luke Date: Mon, 9 Jun 2025 00:30:03 +0800 Subject: [PATCH] =?UTF-8?q?bug:=20=E4=BF=AE=E5=A4=8D=20CallExpressionNode?= =?UTF-8?q?=20=E7=BC=BA=E5=A4=B1=E8=A1=8C=E5=8F=B7=E5=92=8C=E5=88=97?= =?UTF-8?q?=E5=8F=B7=E8=B7=9F=E8=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compiler/parser/ast/CallExpressionNode.java | 16 +++++++++++++++- .../compiler/parser/expression/CallParselet.java | 12 +++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) 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 c9109a1..089319f 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 @@ -14,7 +14,12 @@ import java.util.List; * @param callee 被调用的表达式节点,通常为函数标识符或成员访问表达式。 * @param arguments 参数表达式列表,依照调用顺序排列。 */ -public record CallExpressionNode(ExpressionNode callee, List arguments) implements ExpressionNode { +public record CallExpressionNode( + ExpressionNode callee, + List arguments, + int line, // 添加行号 + int column // 添加列号 +) implements ExpressionNode { /** * 返回函数调用表达式的字符串形式。 @@ -36,4 +41,13 @@ public record CallExpressionNode(ExpressionNode callee, List arg sb.append(")"); return sb.toString(); } + + // Getter方法用于访问行号和列号 + public int line() { + return line; + } + + public int column() { + return column; + } } 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 4e8d3a3..eb47b86 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 @@ -12,8 +12,7 @@ import java.util.List; * {@code CallParselet} 表示函数调用语法的中缀解析器。 *

* 用于处理形如 {@code foo(arg1, arg2)} 的函数调用结构。 - * 在 Pratt 解析器架构中,该解析器在函数名之后接收括号开始的调用参数, - * 构建 {@link CallExpressionNode} 抽象语法树节点。 + * 在 Pratt 解析器架构中,该解析器在函数名之后接收括号开始的调用参数,构建 {@link CallExpressionNode} 抽象语法树节点。 *

*/ public class CallParselet implements InfixParselet { @@ -31,6 +30,11 @@ public class CallParselet implements InfixParselet { List args = new ArrayList<>(); + // 获取当前 token 的行号和列号 + int line = ctx.getTokens().peek().getLine(); + int column = ctx.getTokens().peek().getCol(); + + // 解析函数调用参数 if (!ctx.getTokens().peek().getLexeme().equals(")")) { do { args.add(new PrattExpressionParser().parse(ctx)); @@ -38,7 +42,9 @@ public class CallParselet implements InfixParselet { } ctx.getTokens().expect(")"); // 消费并验证 ")" - return new CallExpressionNode(left, args); + + // 创建 CallExpressionNode 并传递位置信息 + return new CallExpressionNode(left, args, line, column); } /**