antlr - 如何在树语法中保留行号和位置信息?

3
有没有一种简单的方法在树语法中为创建的节点添加行号信息?
例如,解析器语法。
rule: a '+' b -> ^(PLUS a b);

树形语法:

rule: ^(PLUS a b) { print_message_with_line_number_of(a); };

我尝试查看a.start.token等内容,但我看到的都是空值。

1个回答

4
如果解析规则 a 的根节点是一个 real token,则这样处理:
parse
 : ^(PLUS a b) {System.out.println("line=" + $a.start.getLine());}
 ;

然而,如果a的根节点是虚拟标记:
grammar T;

tokens {
  IMAG;
}

a : SomeToken -> ^(IMAG SomeToken)
  ;

如果标记IMAG没有关联的行号(因为它实际上不在输入中!),那么你需要手动创建一个标记,为该标记设置行号,并将其插入AST的根节点。代码如下:

grammar T;

tokens {
  IMAG;
}

@parser::members {
  private CommonToken token(String text, int type, int line) {
    CommonToken t = new CommonToken(type, text);
    t.setLine(line);
    return t;
  }
}

a : SomeToken -> ^({token("imag", IMAG, $SomeToken.getLine())} SomeToken)
  ;

那样,根标签IMAG将获得与SomeToken相同的行号。

非常感谢。我找到的所有教程都没有提到这一点,而在学习时阅读类参考是一个艰巨的任务。 - Baczek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接