2010-11-22 17 views
2

私はDSLのタイプのJJTree(JavaCC)設定を書いており、指定されたフォーマットのファイルを正しくトークン化し、要求されたときにASTをダンプします。JavaCC/JJTreeを使用してトークンを格納するにはどうすればよいですか?

問題は、現在トークンを格納していないため、ツリー内の各ノードが空であることです(例はわかりません)。ここで

は私.jjtファイルの一部です:

SimpleNode Start() #Root : {} { 
    (
    (Section1())? 
    (Section2())? 
    (Section3())* 
) { 
    return jjtThis; 
    } 
} 

void Section3() #Section3 : {} 
{ 
    <SECTION_3> Identifier() <LBRACE > 
    Header() 
     (Details() <SEMICOLON>)* 
    <RBRACE> 
} 

私はセクション1、2節とSECTION3への参照のリストへの参照を格納するために、ルートノードをしたいと思います。私はSection3ノードに識別子、ヘッダブロックを保存し、詳細ブロックのリストを保持したいと思います。

私の埋め込み.jjtファイルは数百行にもなりますが、この2つのセクションで理解できれば、JJTreeの動作を理解できます。 JJTreeの使い方を教えてください。

ありがとうございました。

答えて

2

SimpleNodeクラスを見ると、そのインスタンスが親ノードと子ノードへの参照を自動的に格納することがわかります(#voidを使用してその作成が抑制されていない場合)。たとえば、ルートノードには、0..1 Section1ノード、0..1 Section2ノード、0 .. * Section3ノードへの参照が含まれ、Nodeオブジェクトを返すjjtGetChild()メソッドを使用してアクセスできます。この子ノードがSection1、Section2、またはSection3ノードであるかどうかを判断するには、toString()メソッドを呼び出すことができます(dump()と同じ)。

また、単純なノードの反復およびtoStringチェックのこのスタイルに悩まされた場合は、SimpleNode実装に頼るのではなく、独自のノードタイプを定義できます。以下の私の例では、Start()は単純なSimpleNodeの代わりにカスタムRootNodeを返すようになりました。 RootNodeには、その子ノードへの特定の参照が含まれています(これについてはgetterを適切に定義してください)。私の簡単なスニペットは、1節/ 2/3()はすべてのカスタム・ノードを返しますが、これはは(あなたがSECTION3のためのカスタム・ノードをしたいと思い、あなたが言ったから...ケースのようにを持っていない前提としています)が、 Section1/2が簡単な場合は、SimpleNodesのままにしておきます。

RootNode Start() : 
{ 
    Section1Node s1Node = null; 
    Section2Node s2Node = null; 

    List s3Nodes = new LinkedList(); 
    Section3Node s3Node = null; 
} 
{ 
    (
    (s1Node = Section1())? 
    (s2Node = Section2())? 
    (s3Node = Section3() {s3Nodes.add(s3Node); })* 
) { 

    return new RootNode(s1Node, s2Node, s3Nodes); 
    } 
} 

あなたのパースツリーをトラバースして、ノードと複雑なことをやっている場合、あなたがあなたのノードとやっていることから分離されるようにVisitor classにそれのいくつかを移動することは良い考えかもしれませんノードクラスそのもの。いくつかのビジタークラスで終わる可能性があり、それぞれがパースツリー上で関数を実行し、ノードのタイプごとにvisitメソッドのオーバーロードが発生します。

わからないことがあれば教えてください。私はJavaCCのの専門家だ(私は一度ユニでそれを使用)が、私はあなた:)情報について

+0

感謝を助けることができるはずです。可能であれば、カスタムノードクラスを定義せずにこのサンプルを処理する方法を教えてください(既存のJJTreeで定義されたノードタイプでカスタムトークンを保存するフィールドを追加するにはどうすればよいですか)。つまり、最初の段落で説明した方法の例を挙げてください。 – Chris