如何在Java中从ANTLR侦听器上下文中获取行号

如何在Java中从ANTLR侦听器上下文中获取行号,java,antlr4,Java,Antlr4,我正在使用ANTLR侦听器上下文来获取使用以下Java代码的任何方法的起始行号: @Override public void enterFunctionDeclaration(KotlinParser.FunctionDeclarationContext ctx) { Token t = ctx.getStart(); int lineno = t.getLine(); } 如果代码中没有前导\n或\r,则上述代码可以正常工作,否则将失败 例如: Line 1 Line 2

我正在使用ANTLR侦听器上下文来获取使用以下Java代码的任何方法的起始行号:

@Override
public void enterFunctionDeclaration(KotlinParser.FunctionDeclarationContext ctx) {
  Token t = ctx.getStart();
  int lineno = t.getLine();
}
如果代码中没有前导\n或\r,则上述代码可以正常工作,否则将失败

例如:

  Line 1 
  Line 2
  Line 3   func test(){
  Line 4  }
对于这种情况,上面的代码返回1,但我期望值为3,因为这是函数“test”的起始行号。
我怎样才能做到这一点呢?

我无法重现这一点。顺便说一句,它不是
getLineNo()
,而是
getLine()

测试语法:

grammar T;

functionDeclaration
 : 'func' ID '(' ')' '{' '}'
 ;

ID     : [a-zA-Z]+;
SPACES : [ \t\r\n] -> skip;
Java测试类:

import org.antlr.v4.runtime.*;
导入org.antlr.v4.runtime.tree.ParseTreeWalker;
公共班机{
专用静态无效测试(字符串源){
TLexer lexer=新的TLexer(CharStreams.fromString(source));
TParser parser=newtparser(newcommontokenstream(lexer));
ParseTreeWalker.DEFAULT.walk(newtestlistener(),parser.functionDeclaration());
}
公共静态void main(字符串[]args)引发异常{
测试(“func test(){\n”+
"}");
测试(“\n”+
“\n”+
“func test(){\n”+
"}");
}
}
类TestListener扩展了TBaseListener{
@凌驾
公共无效enterFunctionDeclaration(TParser.FunctionDeclarationContext ctx){
令牌t=ctx.getStart();
int lineno=t.getLine();
System.out.println(“lineno=“+lineno”);
}
}
将打印:

lineno=1
lineno=3