我正在尝试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 中有更详细的描述。