2013-07-22 53 views
0

我一直在尋找解決這個問題的辦法,但到目前爲止我找不到任何答案。我正在開發一個ANTLR項目,該項目基本上應該實現一個像Haskell一樣的語法。ANTLR找不到計數器符號

listDecl: 
LIST {int count=0; ArrayList<Integer> list = new ArrayList<Integer>();} (WS)+ ID '=' '[' a1=atom {count++; list.add($a1.value);} (',' a2=atom {count++; list.add($a2.value);})* ']' {listMemory.put($ID.text, list);} 
; 

代碼與遵循相同的基本格式,其他幾個人都讓我有以下錯誤沿着上述部分:

TParser.java:510: error: cannot find symbol 
      count++; list.add(a1); 
     ^
symbol: variable count 
location: class TParser 
TParser.java:510: error: cannot find symbol 
      count++; list.add(a1); 
       ^
symbol: variable list 
location: class TParser 
TParser.java:534: error: cannot find symbol 
        count++; list.add(a2); 
       ^
symbol: variable count 
location: class TParser 
TParser.java:534: error: cannot find symbol 
        count++; list.add(a2); 
         ^
symbol: variable list 
location: class TParser 
TParser.java:547: error: cannot find symbol 
      listMemory.put((ID6!=null?ID6.getText():null), list); 
                 ^

我很抱歉,如果這已經出現,但之後問廣泛的研究,我如果想countlist局部變量在整個規則可見已經老老實實地放棄希望 感謝所有幫助

+0

對不起,我忘了提及這個規則是聲明和存儲整數列表......我不知道它是否有任何區別,但我想我會提及它... ... – user2607080

回答

1

,你需要聲明他們的@init塊。

listDecl 
@init { 
    int count = 0; 
    ArrayList<Integer> list = new ArrayList<Integer>(); 
} 
    : LIST WS+ ID '=' '[' a1=atom {count++; list.add($a1.value);} 
    (',' a2=atom {count++; list.add($a2.value);} 
    )* 
    ']' {listMemory.put($ID.text, list);} 
    ;