4

私は Irony (バージョン Irony_2012_03_15) を使い始めていますが、AST を生成しようとするとすぐに行き詰まりました。以下は、例外をスローする完全に制限された言語です。

[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
        }
    } 

最後の行のコメントを外すとすぐに、文法エクスプローラーで、またはテストを解析したいときに NullReferenceException がスローされます。エラーは AstBuilder.cs の 96 行目にあります。

  parseNode.AstNode = config.DefaultNodeCreator();

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

MarkTransient などで設定しようとしましたが、サイコロはありません。

誰か私がここで浮くのを手伝ってくれませんか? 私はおそらく明らかな何かを見逃しています。ウェブ全体で AST チュートリアルを探しましたが、それがどのように機能するかについての説明が見つからないようです。

前もって感謝します、

ゲルト・ヤン

4

3 に答える 3

2

正直なところ、私は同じ問題に直面していて、ジェイ・バズジの答えを理解していませんでしたが、有効なもののように見えます(おそらく時代遅れです)。

私のような人がいたら;

クラスから文法を継承した Irony.Interpreter.InterpretedLanguageGrammarところ、うまくいきました。また、ASTを機能させようとしている人は、ノードが「パブリック」であることを確認してください:-)

于 2014-03-19T12:16:24.000 に答える
2

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

AstContext.Default*Type言語全体を設定できるはずですが、現在のところバグがあります。

  • 設定しTermFlags.NoAstNodeます。Irony は、このノードとその子を無視します。

  • 設定しAstConfig.NodeCreatorます。これは、正しいことを行うことができるデリゲートです。

  • AstConfig.NodeTypeAstNode のタイプに設定します。この型は、アクセス可能で、実装IAstInitし、パブリックでパラメーターのないコンストラクターを持つ必要があります。この場合のアクセス可能とは、または属性を使用してのいずれpublicinternalを意味しInternalsVisibleToます。

于 2012-08-21T23:37:17.587 に答える
0

Jay と Erti-Chris の回答に加えて、次のスレッドも役立ちます。

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

Irony の作成者は、関連する構成コードを で指摘していますInterpretedLanguageGrammar.BuildAst

HTH

于 2014-03-27T18:59:55.623 に答える