0

我一直在到处寻找这个问题的答案,但到目前为止我还没有找到。我正在开发一个 ANTLR 项目,该项目基本上应该实现类似 Haskell 的语法。

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);
                                                         ^

很抱歉,如果之前有人问过这个问题,但经过广泛的研究,我真的放弃了希望 感谢您的帮助

4

1 回答 1

1

如果您希望countlist局部变量在整个规则中可见,则需要在@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);}
  ;
于 2013-07-22T22:32:09.030 回答