antlr - 保留树语法中的行号和位置?

时间:2012-03-31 09:54:51

标签: antlr

是否有一种简单的方法可以在树语法中为创建的节点添加行号信息?

e.g。解析器语法

rule: a '+' b -> ^(PLUS a b);

树语法:

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

我试着查看a.start.token等,但我看到的是空的。

1 个答案:

答案 0 :(得分:4)

如果解析器规则a包含真实的标记作为其根,那么这可行:

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相同的行号。