我在Java中使用ANTLR4,我希望在解析输入时存储规则返回的值。我使用这样的语法:
db : 'DB' '(' 'ID' '=' ID ',' query* ')'
{
System.out.println("creating db");
System.out.println("Number of queries -> "+$query.qs.size());
}
;
query returns [ArrayList<Query> qs]
@init
{
$qs = new ArrayList<Query>();
}
: 'QUERY' '(' 'ID' '=' ID ',' smth ')'
{
System.out.println("creating query with id "+$ID.text);
Query query = new Query();
query.setId($ID.text);
$qs.add(query);
}
;
但是会发生的是打印的查询数($ query.qs size)总是一个。发生这种情况是因为每次在输入处识别QUERY元素时,它都会被添加到$ qs ArrayList中,但是对于彼此QUERY,将实例化一个新的ArrayList,并将此查询添加到此新的ArrayList中。当识别出所有查询时,将调用db:规则的操作,但$ query.qs ArrayList只有最后一个查询。我通过维护存储查询的全局ArrayLists解决了这个问题。但是,当规则返回时,是否还有另一种方法可以使用ANTLR,而不是拥有自己的全局ArrayLists?
非常感谢, DIMOS。
答案 0 :(得分:1)
嗯,问题解决了。我刚刚将ArrayList添加到db规则中,如下所示:
db [ArrayList queries]:'DB'....
然后在查询规则:
$分贝:: queries.add(查询)
所以,一切都很好!
无论如何,谢谢你的期待!