bug: 修复 CallExpressionNode 缺失行号和列号跟踪

This commit is contained in:
luke 2025-06-09 00:30:03 +08:00
parent fb4cde6239
commit 6d835b1655
2 changed files with 24 additions and 4 deletions

View File

@ -14,7 +14,12 @@ import java.util.List;
* @param callee 被调用的表达式节点通常为函数标识符或成员访问表达式
* @param arguments 参数表达式列表依照调用顺序排列
*/
public record CallExpressionNode(ExpressionNode callee, List<ExpressionNode> arguments) implements ExpressionNode {
public record CallExpressionNode(
ExpressionNode callee,
List<ExpressionNode> arguments,
int line, // 添加行号
int column // 添加列号
) implements ExpressionNode {
/**
* 返回函数调用表达式的字符串形式
@ -36,4 +41,13 @@ public record CallExpressionNode(ExpressionNode callee, List<ExpressionNode> arg
sb.append(")");
return sb.toString();
}
// Getter方法用于访问行号和列号
public int line() {
return line;
}
public int column() {
return column;
}
}

View File

@ -12,8 +12,7 @@ import java.util.List;
* {@code CallParselet} 表示函数调用语法的中缀解析器
* <p>
* 用于处理形如 {@code foo(arg1, arg2)} 的函数调用结构
* Pratt 解析器架构中该解析器在函数名之后接收括号开始的调用参数
* 构建 {@link CallExpressionNode} 抽象语法树节点
* Pratt 解析器架构中该解析器在函数名之后接收括号开始的调用参数构建 {@link CallExpressionNode} 抽象语法树节点
* </p>
*/
public class CallParselet implements InfixParselet {
@ -31,6 +30,11 @@ public class CallParselet implements InfixParselet {
List<ExpressionNode> 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);
}
/**