2012-03-07 11 views
5

私はC#インタープリタを学習体験のためにゼロから作成していますが、これまでのところすべてがスムーズに行われています。私はすべての種類のトークンをパーサーに出力する、完全に機能するC#レクサーを持っています。どのようにトークンを解析するのかは分かりますが、どのようにAST(抽象構文ツリー)を構造化すべきかはわかりません。抽象構文木の一部を設計するには?

たとえば、私は簡単なコードの断片がある場合:

using System.Xml; 

ツリーが解析されたときのように何を見てでしょうか?

このようにします。

UsingDirective 
    Identifier(System) 
     Identifier(Xml) 

などですか?

UsingDirective 
    Identifier(System) 
    Identifier(Xml) 

私は/他/ else文は、1つのステートメントで組み合わせた変数の宣言/代入(I int型ならばならば、私は、彼らにドットでの識別子のようなものを構築できる方法をいくつかの提案および/または例を得ることができれば= 0;)、関数の定義などに役立ちます。私はちょうど木をどのように構造化するかのより良い考えを得る必要があり、私は自分自身で残りの部分を把握することができます。ありがとう。

+0

C#のすべてを実装したいと思えば、それは長い学習経験になるでしょう: – svick

+0

私はクラスライブラリの大半を省いています。基本的なクラス/関数定義、変数の作成/使用法、関数呼び出しのために実装する必要のあるものを実装しています。 –

答えて

2

私は過去にパーサのカップルを書いた、と私は一般的にこのような何かのために行くだろう:Roslynのとは異なり、このusing System.Collections.Generic

UsingDirective 
    IdentifierList 
     IdentifierList (LeftNode) 
      Identifier (LeftNode) (System) 
      Identifier (RightNode) (Collections) 
     Identifier (RightNode) (Generic) 

の場合

UsingDirective 
    IdentifierList 
    Identifier (LeftNode) (System) 
    Identifier (RightNode) (Xml) 

、私は好みますセミコロンなどのトークンを含まないことで私のASTを軽く保ちます。usingキーワードなどはコンパイラには必要ありません。

私は特にIDEのために書いたパーサーは違って見えます - この余分なものは、行番号や列番号などのより多くの情報とともに持ち歩きます。

+0

なぜあなたは 'IdentifierList'に2人の子供しか持たないのですか?なぜ必要な数の子を持つ単一の 'IdentifierList'を持たないのでしょうか? – svick

+0

はい、無制限の子供を持つ単一のIdentifierListが良いと思います。いずれにせよ、あなたの答えはxbonezに感謝します。 –

+0

それもうまくいくと私は確信しています。私は個人的には、それが単にidentsのリストであった場合よりも、この方法(再帰的に)をトラバースする方が簡単です。私は関数 'traverIdentList'を設定します:if(identlist.leftnode is identlistnode){traverseIdentList(leftnode); } else {traverseident(leftnode);} } traverseident(右ノード); ' – xbonez

2

MicrosoftがRoslynでこれをやっている様子を見ることができます。 C#(とVB.NET)の構文木はどのように宣言されているのでしょうか?また、あなたが書く前にインタプリタの部分の代わりにそれを使用することもできます。

具体的には、あなたのusingディレクティブのロザリン構文木は、次のようになります。2番目のバージョンに似ていますが、より詳細なので

UsingDirective 
    UsingKeyword 
    QualifiedName 
     IdentifierName (System) 
     DotToken 
     IdentifierName (Xml) 
    SemicolonToken 

、。

あなたの最初のバージョンはあまり意味がないと思います。 Xmlは構文レベルでSystemの子ではありません(意味レベルで後で "親の名前空間"という概念を持つかもしれませんが)。

+0

しかし、これは抽象構文木ではありません。具体的な構文木です。ドットやセミコロンのようなソースコードの部分が含まれています。 –

+0

ええ、そうです。しかし、私はあなたがあなたのASTをこの上に置くことができると思う。 – svick

+0

あなたの答えをありがとう!それは助けになった。 –

関連する問題