ANTLR4:具有整数数的运行时匹配无法正常工作的语法



我正在尝试ANTLR 4书中的语法(第48-9页(,但语法的行为并不像宣传的那样。

输入是一系列整数。一个整数表示以下整数的数量。例如,以下输入中的前 2 表示有两个后续整数,然后 3 表示有三个后续整数:

2    9    10    3    1    2    3

这篇文章的底部是书中给出的语法。当我使用 -tree 标志运行 ANTLR 测试台 (grun( 时,使用语法和上述输入:

grun Data file -tree

我得到这个不正确的输出树:

(file (group 2 (sequence 9 10 3)) (group 1 (sequence 2 3)))

通过一些实验,我发现如果我改变语法,不再使用这个语义谓词:

{$i<=$n}?

使用此不正确的语义谓词:

{$i<$n}?

然后我得到正确的输出树:

(file (group 2 (sequence 9 10)) (group 3 (sequence 1 2 3)))

我很困惑。关于为什么会发生这种情况的任何想法?是测试台(grun(中的错误吗?或者(更有可能(我对 ANTLR 的语义谓词和动作的工作原理有所了解?

grammar Data;
file: group+ ;
group: INT sequence[$INT.int] ;
sequence[int n]
locals [int i = 1;]
      : ( {$i<=$n}? INT {$i++;} )*  // match n integers
      ;
INT  : [0-9]+ ;
WS  : [ trn]+ -> skip ;

由于ANTLR 4.3中引入的错误,您的局部变量i开始未初始化(从0开始(而不是1。

该错误在 https://github.com/antlr/antlr4/issues/672 中有更详细的描述。

相关内容

  • 没有找到相关文章

最新更新