1

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 サイズ) は常に 1 です。これは、入力時に QUERY 要素が認識されるたびに $qs ArrayList に追加されるためですが、他の QUERY ごとに新しい ArrayList がインスタンス化され、このクエリがこの新しい ArrayList に追加されるためです。すべてのクエリが認識されると、 db : ルールのアクションが呼び出されますが、$query.qs ArrayList には最後のクエリしかありません。クエリを格納するグローバル ArrayLists を維持することで、この問題を解決しました。しかし、ルールが戻ってきて、独自のグローバルArrayListsを持っていない間に、ANTLRでそれを行う別の方法はありますか?

前もって感謝します、Dimos。

4

1 に答える 1

1

さて、問題は解決しました。次のように ArrayList を db ルールに追加しました。

db [ArrayList クエリ] : 'DB' ....

次にクエリルールで:

$db::queries.add(クエリ)

だから、すべてが大丈夫です!

とにかく、見てくれてありがとう!

于 2013-03-05T08:00:39.837 に答える