gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:30:41 26 4
gpt4 key购买 nike

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

例如解析器语法

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

树语法:

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

我尝试查看 a.start.token 等,但我查看的都是空值。

最佳答案

如果解析器规则 a 包含一个 real 标记作为其根,则以下方法有效:

parse
: ^(PLUS a b) {System.out.println("line=" + $a.start.getLine());}
;

但是,如果 a 有一个虚构的标记作为其根:

grammar T;

tokens {
IMAG;
}

a : SomeToken -> ^(IMAG SomeToken)
;

那么标记IMAG(显然)没有与之关联的行号(毕竟它并不真正在输入中!)。在这种情况下,您需要手动创建一个 token ,为该 token 设置行号,并将其插入到 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 相同的行号。

关于antlr - 保留树语法中的行号和位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9954882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com