[英]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.