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