[英]ANTLR4: grammar with runtime matching of number of integers not working correctly
我正在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)))
我感到困惑。 为什么会这样? 这是测试装备中的错误吗? 还是(更有可能)我是否不了解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 ;
由于ANTLR 4.3中引入的错误,您的局部变量i
从未初始化(从0开始)而不是从1开始。
该错误的详细说明, 请参见https://github.com/antlr/antlr4/issues/672 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.