我一直在寻找这个问题的答案,但到目前为止我还没有找到。我正在研究一个基本上应该像语法一样实现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);
^
我很抱歉,如果之前有人问过这个问题,经过广泛的研究后我真诚地放弃了希望 谢谢你的帮助
答案 0 :(得分:1)
如果您希望count
和list
局部变量在整个规则中可见,则需要在@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);}
;