2012-03-31 72 views
3

是否有一种简单的方法在树语法中为创建的节点添加行号信息?antlr - 在树语法中保留行号和位置?

例如解析器语法

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

树语法:

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

我试图寻找到a.start.token,等等,但我看了看的那些都是空值。

回答

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

+0

非常感谢。我发现的教程都没有提到,并且在学习时阅读课堂参考是一个艰难的主张。 – Baczek 2012-04-02 20:16:41

+0

不客气@Baczek。 – 2012-04-02 21:01:44