1

私は宣言型言語を設計しています。私の言語では、後で再利用できる「ノード」の定義があります。プロトタイプやテンプレートのようなものと考えてください。必要に応じてそれらのコピーを作成できます。定義段階で適切な Java オブジェクトを生成するバージョンのインタープリターがあります。最近まで、ディープ コピー ライブラリを使用してノードの Java 表現のコピーを作成し、ノードのインスタンスを作成していました。私が見つけたほとんどのディープ コピー ライブラリには制限があり、システム内のすべてのオブジェクトに対してコピー コンストラクターを作成する必要がないため、別のアプローチを採用したいと考えています。私の言語の一部は、ディープ コピー ライブラリで問題を引き起こす GUI Java Swing オブジェクトを指定しています。

オブジェクト宣言の AST サブグラフを保存し、ノードのインスタンスを作成するときに再処理する方法はありますか? ANTLR AST に関して質問していますが、言語の実装に関するアドバイスがあれば、それも歓迎します。

4

1 に答える 1

1

ANTLRパーサー/レクサー文法では、にアクセスできます$ruleName.tree。このルール属性は、解析中に生成されたASTサブツリーへの参照です。@afterフィールドとフィールドを使用して@members、サブツリーを保存できます。披露させて。

@members{
private List<CommonTree> defs = new ArrayList<CommonTree>();

public List<CommonTree> getDefs(){
    return defs;
}

}

以下の文法で

ruleName 
@after{
    defs.add($ruleName.tree);
}
: IDENT ;

これにより、すべてのruleNameASTサブツリーのリストが作成されます。これらのツリーは、CommonTreeNodeStreamに変換して、ツリー文法コードで使用できます。

CommonTree defTree = Parser.getDefs().get(0); // just getting the first tree for example
CommonTreeNodeStream defStream = new CommonTreeNodeStream(defTree);
TreeWalker walker = new TreeWalker(defStream);
//assuming that I have a tree grammar that has been defined to return a list of nodes

ANTLR文法規則からデータを返す方法の詳細については、この質問を参照してください。

List<Node> nodes = walker.topRule() 

これにより、保存されたASTサブグラフを再処理してノードインスタンスを作成できます。TreeNodeStreamを作成し、インスタンスを作成する必要があるときはいつでもウォーカーを呼び出すことができます。

于 2012-08-25T00:46:08.453 に答える