2012-05-10 18 views
4

アイアン(バージョンIrony_2012_03_15)を使い始めましたが、ASTを生成しようとするとかなり早く立ち往生しました。できるだけ早く私はそれが文法エクスプローラまたはときに私はテストを解析するにはとNullReferenceExceptionをスローし、最後の行のコメントを外してアイロニーASTの生成はnullreference例外をスローします

[Language("myLang", "0.1", "Bla Bla")] 
    public class MyLang: Grammar { 
     public NModel() 
      : base(false) { 

      var number = TerminalFactory.CreateCSharpNumber("number"); 
      var binExpr = new NonTerminal("binExpr", typeof(BinaryOperationNode)); 
      var binOp = new NonTerminal("BinOp"); 

      binExpr.Rule = number + binOp + number; 
      binOp.Rule = ToTerm("+"); 
      RegisterOperators(1, "+"); 
      //MarkTransient(binOp); 
      this.Root = binExpr; 
      this.LanguageFlags = Parsing.LanguageFlags.CreateAst; // if I uncomment this line it throws the error 
     } 
    } 

:以下は例外をスローし、完全strpped言語です。このエラーは、AstBuilder.csの96行目にあります。

parseNode.AstNode = config.DefaultNodeCreator(); 

DefaultNodeCreatorは設定されていないデリゲートです。

私はMarkTransientなどで設定してみましたが、ダイスは使用しませんでした。

誰かが私を助けてくれますか?私は確かに何かが明らかに欠けている。 Web上のASTチュートリアルを探しましたが、どのように動作するのか説明できないようです。事前に

おかげで、

ゲルト - 01月

答えて

1

あなたは文法上LanguageFlags.CreateAstフラグを設定したら、あなたはASTを作成する方法の関連情報を提供する必要があります。

言語全体でAstContext.Default*Typeを設定することができますが、現在は盗聴されています。

  • セットTermFlags.NoAstNode。アイロニーはこのノードとその子を無視します。

  • セットAstConfig.NodeCreator。これは正しいことをすることができる代理人です。

  • AstConfig.NodeTypeをAstNodeのタイプに設定します。この型はアクセス可能で、IAstInitを実装し、パラメータなしのコンストラクタを持っている必要があります。この場合アクセス可能とは、InternalsVisibleTo属性のpublicまたはinternalのいずれかを意味します。

+0

こんにちはジェイ、あなたの答えをありがとう。利用可能なサポートのために、実際にアイオワをパーサーとして使用することをやめました。残念、それは非常に良い見え、あまりにも悪いそれはそれが値するものにキャッチしていない。あなたはこれのネクロマンサーバッジを持っていますように! – gjvdkamp

+0

@gjvdkampあなたは現在どのパーサーを使用していますか?私は同じ問題を抱えており、このプロジェクトのドキュメンテーションやWebチュートリアルのサポートにも満足していません。それは良いかもしれないが、それは完全にそれを伝えることに失敗し、役に立たない。 – ygoe

+0

実際にはうまくいった最後の文法は.Net上のANTLRであり、ANTLRWorksの多くの理由もあります。私は何年も前からこの話題から出てきたので、その間に多くのことが起きたかもしれません。両方の新しいバージョンはかなり有望です... F#では、fParsecまたはActive Patternsを見たいかもしれません。 – gjvdkamp

1

正直に言うと、私は同じ問題に直面していたし、それが有効なもの(多分それは古いです)のように見えるものの、ジェイBazuziの答えを理解していませんでした。

私のような人がいるなら、

私は文法をIrony.Interpreter.InterpretedLanguageGrammarクラスから継承しました。それは動作します。また、あなたのノードが「パブリック」であることを確認してください、ASTの作業を取得しようとしている誰: - )

0

ジェイさんの上にとERTI、クリスさんは、このスレッドにも便利です。

https://irony.codeplex.com/discussions/361018

Ironyの作成者は、InterpretedLanguageGrammar.BuildAstという関連する設定コードを指摘しています。

HTH

関連する問題