我正在尝试在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 : [ \t\r\n]+ -> skip ;
发布于 2014-12-22 19:47:53
您的局部变量i
开始未初始化( 0),而不是1,因为ANTLR 4.3中引入了一个bug。
这个bug在https://github.com/antlr/antlr4/issues/672中有更详细的描述。
https://stackoverflow.com/questions/27474527
复制相似问题