【问题标题】:Getting the line number in the ParserVisitor?获取 ParserVisitor 中的行号?
【发布时间】:2013-11-16 05:19:08
【问题描述】:

我正在尝试在我的 ParserVisitor 中获取更具体的错误消息的行号(访问由 antlr 生成的解析树)。然而,我在这门课上只有上下文ctx,我可以做ctx.getText()之类的事情,但不能做getLine()。有没有办法做到这一点?

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

编辑:我正在使用 ANTLR 4 创建 java 文件。

尝试通过如下方法访问访问者中的行号:

@Override 
public Type visitStatAssign(@NotNull BasicParser.StatAssignContext ctx) {
...
// some semantic error detected
int lineNo = ...
System.err.("Semantic error at line " + lineNo); 
}

编辑 2: 我的词法分析器和解析器规则是相当标准的,例如在词法分析器中:

INT : 'int' ;
CHAR : 'char' ;
BOOL : 'bool' ;
STRING : 'string' ; 

...在解析器规则baseType中:

baseType : INT | CHAR | BOOL | STRING ; 

【问题讨论】:

  • 你能贴一些代码吗?您使用的是哪个版本的 ANTLR?
  • 你在使用树语法吗?可以发一下吗?
  • 树语法到底是什么意思?抱歉这是我第一次发帖!
  • 您必须编写一个用于词法分析的部分,它将您的输入转换为标记流。这是由词汇规则定义的。以及将您的标记转换为语义树的树语法。这是用解析器规则定义的。词法规则+解析器规则=语法规则。
  • 这里的树语法肯定是无关紧要的吗?解析器访问者只是遍历它生成的树。解析出来的程序中的行号不就和这些无关了吗?

标签: antlr parse-tree


【解决方案1】:

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

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

【讨论】:

  • 我尝试这个时没有 commonTokenStream
  • @johnktejik, commonTokenStreamAntlr-v3 中可用,您可以使用 Antlr-v4
【解决方案2】:

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

【讨论】:

  • 谢谢。我正在使用 Javascript 目标运行时,并且 ctx.start 肯定有行值。
【解决方案3】:

如果你有 ParserRuleContext 对象,你可以按照@njlarsson 的建议直接获取行号:

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

但是,如果您只有一个 RuleContext 对象,则需要先将其类型转换为 ParserRuleContext:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多