2013-02-21 30 views
8

私は、Ironyコンソールでうまく動作し、構文解析する文法を持っていますが、ASTツリービューでは何も得られません。私はここにあるBASIC-> Javascriptの記事:http://www.codeproject.com/Articles/25069/JSBasic-A-BASIC-to-JavaScript-Compilerに従っていましたが、Astのものはすべて移動/削除されているようです。私はIrony.Interpreter .dllを見つけましたが、これにはいくつかのAstが含まれていますが、Expressionサンプルの実装ではすべて結びついているようです。アイロニーでASTを使用するにはどうすればいいですか?

私はここで何が欠けていますか?私はツリーを歩き、ソースコードを生成したいと思っています。どこから始めるべきかわかりません。

ビジターパターンを使用したことについて私はよく知っていますが、それを実装してアイロニーが好きな方法で実行する方法はわかりません。

+2

私はちょうどANTLRに切り替えました。だから私は今これがすべて間違っていると思います。だから、少し助けて、それは痛い。ああ、時間をかけて見てくれてありがとう、ありがとう! –

答えて

5

Irony上に構築された文法、パーサー、およびASTのリファレンス実装については、Sarcasmプロジェクトを参照してください。私はASTを構築するのに役立つこの著者がblog entryを見つけました。

以下は、ASTを稼動させる一般的なガイドです。

  1. example)あなたの文法を定義するAstNodeexample)から派生する抽象基底クラス(MyBaseNode)を作成します。

public override void Accept(IMyNodeVisitor visitor) { visitor.Visit(this); }

:コピー/ MyBaseNode

  1. オーバーライドAccept方法(example)由来の新しいクラスを作成し、各端末と非末端について例
  2. からメソッドを貼り付け

    1. Init(主に端末)またはInitChildren(非終端必要に応じて)。 これは、ASTの魔法が起こる場所です。
  3. インタフェースIMyNodeVisitorを追加し、前のステップ(example)で定義された各クラスのVisitメソッドを追加します。あなたの端子と非のそれぞれについて、ASTNodeTypeを設定

    void Visit(MyDerivedNode1 node);

  4. あなたの文法のステップ1からの端末。

    1. example

      : - 非端末用(example

      MyTerminal1.AstConfig.NodeType = typeof(MyDerivedNode1);

    2. - 文法有効AST作成において(example

      var MyNonTerminal2 = new NonTerminal("MyNonTerminal2", typeof(MyDerivedNode2));

  5. 端末用

    LanguageFlags = LanguageFlags.CreateAst;

+0

聖なる煙。皮肉は単なる参考実装ではなく、「皮肉、アイロニーを生み出すEBNFのようなDSL」です!これは、ouroborosと混合された開始のようなものです。 – fostandy

+0

Sarcasmプロジェクトへのリンクが死んでいます。 (あるいは、私が得られなかった何らかの意図的な「誰が最初の冗談ですか?」) – alx9r

3

では、アイロニーの解析は2段階で行われます。最初に構文解析ツリーを作成し、ASTツリーを作成します。

最初の手順のみが表示されます。

  1. ASTノードへのあなたの非終端記号をマップするためにどのようにそれを教える::

    例えばあなたができるASTを作成するアイロニーためにはアイロニーのサンプル文法ExpressionEvaluatorGrammarを見て、私たちは以下を参照してください。ここ

    var BinExpr = new NonTerminal("BinExpr", typeof(BinaryOperationNode));`  
    

    我々はASTノードであるBinaryOperationNodeにBinExpr非終端をマッピングするためにアイロニーを語っています。

  2. を解析するとき、それはASTを生成してください:

    あなたが解析する際に、ASTツリーが生成されます。このフラグを設定すると。

    this.LanguageFlags = LanguageFlags.CreateAst; 
    

あなたのASTツリーのルートは、その後、次のようになります。

parseTree.Root.AstNode 

私はthisソース偉大な出発点を発見しました。

関連する問題