Antlr 在ParserVisitor中获取行号?

Antlr 在ParserVisitor中获取行号?,antlr,parse-tree,Antlr,Parse Tree,我试图在我的ParserVisitor(访问antlr生成的解析树)中获取更多特定错误消息的行号。然而,我在这个类中拥有的只是上下文ctx,我可以做类似ctx.getText()的事情,但不能做getLine()。有办法做到这一点吗 这里可以使用ctx.getPayload()吗?如果是,怎么做 编辑:我正在使用Antlr4创建java文件 尝试使用以下方法访问访问者中的行号: @Override public Type visitStatAssign(@NotNull BasicParser

我试图在我的ParserVisitor(访问antlr生成的解析树)中获取更多特定错误消息的行号。然而,我在这个类中拥有的只是上下文
ctx
,我可以做类似
ctx.getText()
的事情,但不能做
getLine()
。有办法做到这一点吗

这里可以使用
ctx.getPayload()
吗?如果是,怎么做

编辑:我正在使用Antlr4创建java文件

尝试使用以下方法访问访问者中的行号:

@Override 
public Type visitStatAssign(@NotNull BasicParser.StatAssignContext ctx) {
...
// some semantic error detected
int lineNo = ...
System.err.("Semantic error at line " + lineNo); 
}
编辑2: 我的lexer和解析器规则相当标准,例如在lexer中:

INT : 'int' ;
CHAR : 'char' ;
BOOL : 'bool' ;
STRING : 'string' ; 
…位于解析器规则基类型中:

baseType : INT | CHAR | BOOL | STRING ; 

您可以使用
ctx.getSourceInterval()
获取规则使用的令牌范围。您可以使用获取与源间隔关联的令牌,然后从令牌获取位置信息

Interval sourceInterval = ctx.getSourceInterval();
Token firstToken = commonTokenStream.get(sourceInterval.a);
int line = firstToken.getLine();

您可以使用
ctx.start
ctx.getStart()
获取规则中的第一个令牌。然后在令牌上使用
getLine()
获取行号(并使用
getCharPositionInLine()
获取列)。

如果您有一个parserureContext对象,您可以按照@njlarsson的建议直接获取行号:

ParserRuleContext ctx; 
int line = ctx.getStart().getLine();
但是,如果您只有一个RuleContext对象,则需要先将其类型转换为ParserRuleContext:

RuleContext rctx;
ParserRuleContext ctx = (ParserRuleContext) rctx; 
int line = ctx.getStart().getLine();

注意:>>我在上面的代码片段中使用了ANTLR4>>,
ctx
rctx
为简洁起见没有初始化。您需要使用适当的值初始化它们,例如
ParserRuleContext ctx=parser.compilationUnit()

你能发布一些代码吗。您使用的是哪个版本的ANTLR?您使用的是树语法吗?你能把它贴出来吗?你说的树语法到底是什么意思?对不起,这是我第一次发帖!您必须编写一个词法分析部分,将您的输入转换为令牌流。这是由词汇规则定义的。和树语法,它将标记转换为语义树。这是用解析器规则定义的。词法规则+语法分析器规则=语法规则。树语法肯定与此无关吗?解析器访问者只是浏览它生成的树。解析程序中的行号不是独立于这些吗?谢谢。我正在使用Javascript目标运行时,ctx.start肯定有行值。尝试时没有commonTokenStreamthis@johnktejik,
commonTokenStream
Antlr-v3
中提供,您可以使用Antlr-v4