是否有一种简单的方法可以在树语法中为创建的节点添加行号信息?
e.g。解析器语法
rule: a '+' b -> ^(PLUS a b);
树语法:
rule: ^(PLUS a b) { print_message_with_line_number_of(a); };
我试着查看a.start.token等,但我看到的是空的。
答案 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
相同的行号。