antlr-在树语法中保留行号和位置?
是否有一种简单的方法向树语法中创建的节点添加行号信息 e、 语法分析器antlr-在树语法中保留行号和位置?,antlr,Antlr,是否有一种简单的方法向树语法中创建的节点添加行号信息 e、 语法分析器 rule: a '+' b -> ^(PLUS a b); 树语法: rule: ^(PLUS a b) { print_message_with_line_number_of(a); }; 我尝试查找.start.token等,但我查找的是空的。如果解析器规则a包含一个真正的标记作为其根,则此操作有效: parse : ^(PLUS a b) {System.out.println("line=" + $a.s
rule: a '+' b -> ^(PLUS a b);
树语法:
rule: ^(PLUS a b) { print_message_with_line_number_of(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
相同的行号 非常感谢。我发现的所有教程都没有提到阅读课堂参考资料是学习时的一个难题。