8

Ironyコンソールで正常に機能および解析できる文法がありますが、ASTツリービューには何も表示されません。私はここにあるBASIC->Javascriptの記事をフォローしていました:http://www.codeproject.com/Articles/25069/JSBasic-A-BASIC-to-JavaScript-Compiler、しかしAstのものはすべてされているようです移動/削除されました。いくつかのAstのものが含まれているIrony.Interpreter.dllを見つけましたが、Expressionサンプルの実装ではすべてが拘束されているようです。

ここで何が欠けていますか?ツリーを歩いてソースコードを生成したいのですが、どこから始めればよいのかわかりません。

私はビジターパターンを使用することについていくつか言及しましたが、それを実装して、Ironyが好む方法で実行する方法がわかりません。

4

2 に答える 2

7

Irony上に構築された文法、パーサー、およびASTのリファレンス実装については、適切な名前のSarcasmプロジェクトを確認してください。著者によるこのブログエントリは、ASTの構築に役立つことがわかりました。

以下は、ASTを起動して実行するための汎用ガイドです。

  1. 文法を定義する(
  2. exampleMyBaseNode )から派生した抽象基本クラス()を作成します。例のメソッドをコピーして貼り付けますAstNode
  3. 各終端記号と非終端記号について、MyBaseNodeとから派生した新しいクラスを作成します。

    1. オーバーライドAcceptメソッド():

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

    1. Init必要に応じて、(主に終端記号で)または(非終端記号で)オーバーライドInitChildrenします。ここでASTの魔法が起こります。
  4. インターフェイスIMyNodeVisitorを追加Visitし、前の手順で定義したクラスごとにメソッドを追加します()。

    void Visit(MyDerivedNode1 node);

  5. ASTNodeType手順1の文法で、終端記号と非終端記号のそれぞれにを設定します。

    1. 端末の場合-(

      MyTerminal1.AstConfig.NodeType = typeof(MyDerivedNode1);

    2. 非終端記号の場合-(

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

  6. 文法でAST作成を有効にします:(

    LanguageFlags = LanguageFlags.CreateAst;

于 2015-09-22T05:47:26.393 に答える
4

Ironyでは、解析は2つのフェーズで行われます。最初に解析ツリーを作成し、次にASTツリーを作成します。

あなたは最初のステップだけを見ています。IronyがASTを作成するには、次のことができます。

  1. NonTerminalsをASTノードにマップする方法を教えてください。

    たとえば、Ironyサンプル文法のExpressionEvaluatorGrammarを見ると、次のようになります。

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

    ここでは、BinExprNonTerminalをASTノードであるBinaryOperationNodeにマップするようにIronyに指示しています。

  2. 解析時にASTを生成するようにします。

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

    this.LanguageFlags = LanguageFlags.CreateAst;
    

ASTツリーのルートは次のようになります。

parseTree.Root.AstNode

私はこの情報源が素晴らしい出発点であることに気づきました。

于 2013-10-18T10:08:49.623 に答える