我将 ANTLR4 与 Java 一起使用,我想存储规则在解析输入时返回的值。我使用这样的语法:
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 大小)始终为 1。发生这种情况是因为每次在输入中识别出 QUERY 元素时,它都会添加到 $qs ArrayList 中,但是对于每个其他 QUERY,都会实例化一个新的 ArrayList,并且此查询会添加到这个新的 ArrayList 中。当所有查询都被识别时,db : 规则的操作被调用,但 $query.qs ArrayList 只有最后一个查询。我通过维护存储查询的全局 ArrayLists 解决了这个问题。但是,当规则返回并且没有我自己的全局 ArrayLists 时,还有另一种方法可以使用 ANTLR 吗?
非常感谢,迪莫斯。