bug: 修复 CallExpressionNode 缺失行号和列号跟踪
This commit is contained in:
parent
fb4cde6239
commit
6d835b1655
@ -14,7 +14,12 @@ import java.util.List;
|
|||||||
* @param callee 被调用的表达式节点,通常为函数标识符或成员访问表达式。
|
* @param callee 被调用的表达式节点,通常为函数标识符或成员访问表达式。
|
||||||
* @param arguments 参数表达式列表,依照调用顺序排列。
|
* @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(")");
|
sb.append(")");
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Getter方法用于访问行号和列号
|
||||||
|
public int line() {
|
||||||
|
return line;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int column() {
|
||||||
|
return column;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,8 +12,7 @@ import java.util.List;
|
|||||||
* {@code CallParselet} 表示函数调用语法的中缀解析器。
|
* {@code CallParselet} 表示函数调用语法的中缀解析器。
|
||||||
* <p>
|
* <p>
|
||||||
* 用于处理形如 {@code foo(arg1, arg2)} 的函数调用结构。
|
* 用于处理形如 {@code foo(arg1, arg2)} 的函数调用结构。
|
||||||
* 在 Pratt 解析器架构中,该解析器在函数名之后接收括号开始的调用参数,
|
* 在 Pratt 解析器架构中,该解析器在函数名之后接收括号开始的调用参数,构建 {@link CallExpressionNode} 抽象语法树节点。
|
||||||
* 构建 {@link CallExpressionNode} 抽象语法树节点。
|
|
||||||
* </p>
|
* </p>
|
||||||
*/
|
*/
|
||||||
public class CallParselet implements InfixParselet {
|
public class CallParselet implements InfixParselet {
|
||||||
@ -31,6 +30,11 @@ public class CallParselet implements InfixParselet {
|
|||||||
|
|
||||||
List<ExpressionNode> args = new ArrayList<>();
|
List<ExpressionNode> args = new ArrayList<>();
|
||||||
|
|
||||||
|
// 获取当前 token 的行号和列号
|
||||||
|
int line = ctx.getTokens().peek().getLine();
|
||||||
|
int column = ctx.getTokens().peek().getCol();
|
||||||
|
|
||||||
|
// 解析函数调用参数
|
||||||
if (!ctx.getTokens().peek().getLexeme().equals(")")) {
|
if (!ctx.getTokens().peek().getLexeme().equals(")")) {
|
||||||
do {
|
do {
|
||||||
args.add(new PrattExpressionParser().parse(ctx));
|
args.add(new PrattExpressionParser().parse(ctx));
|
||||||
@ -38,7 +42,9 @@ public class CallParselet implements InfixParselet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ctx.getTokens().expect(")"); // 消费并验证 ")"
|
ctx.getTokens().expect(")"); // 消费并验证 ")"
|
||||||
return new CallExpressionNode(left, args);
|
|
||||||
|
// 创建 CallExpressionNode 并传递位置信息
|
||||||
|
return new CallExpressionNode(left, args, line, column);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user