3
是否有一种简单的方法在树语法中为创建的节点添加行号信息?antlr - 在树语法中保留行号和位置?
例如解析器语法
rule: a '+' b -> ^(PLUS a b);
树语法:
rule: ^(PLUS a b) { print_message_with_line_number_of(a); };
我试图寻找到a.start.token,等等,但我看了看的那些都是空值。
是否有一种简单的方法在树语法中为创建的节点添加行号信息?antlr - 在树语法中保留行号和位置?
例如解析器语法
rule: a '+' b -> ^(PLUS a b);
树语法:
rule: ^(PLUS a b) { print_message_with_line_number_of(a); };
我试图寻找到a.start.token,等等,但我看了看的那些都是空值。
如果解析器规则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
。
非常感谢。我发现的教程都没有提到,并且在学习时阅读课堂参考是一个艰难的主张。 – Baczek 2012-04-02 20:16:41
不客气@Baczek。 – 2012-04-02 21:01:44