Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
antlr-在树语法中保留行号和位置?_Antlr - Fatal编程技术网

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

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

是否有一种简单的方法向树语法中创建的节点添加行号信息

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.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
相同的行号

非常感谢。我发现的所有教程都没有提到阅读课堂参考资料是学习时的一个难题。