1

我将 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 吗?

非常感谢,迪莫斯。

4

1 回答 1

1

好了,问题解决了。我刚刚将 ArrayList 添加到 db 规则中,如下所示:

db [ArrayList 查询]:'DB' ....

然后在查询规则:

$db::queries.add(查询)

所以,一切都很好!

无论如何,感谢您的关注!

于 2013-03-05T08:00:39.837 回答