Parsing 反语AST生成抛出空引用例外

Parsing 反语AST生成抛出空引用例外,parsing,irony,Parsing,Irony,我刚开始使用Irony(版本Irony_2012_03_15),但在尝试生成AST时,我很快就被卡住了。下面是引发异常的完全strpped语言: [Language("myLang", "0.1", "Bla Bla")] public class MyLang: Grammar { public NModel() : base(false) { var number = TerminalFactory.CreateCSh

我刚开始使用Irony(版本Irony_2012_03_15),但在尝试生成AST时,我很快就被卡住了。下面是引发异常的完全strpped语言:

[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教程,但我似乎找不到关于如何工作的解释

提前感谢,


Gert Jan

设置语法上的
LanguageFlags.CreateAst
标志后,必须提供有关如何创建AST的其他信息

您应该能够为整个语言设置
AstContext.Default*Type
,但目前存在错误

  • 设置
    termsflags.NoAstNode
    。Irony将忽略此节点及其子节点

  • 设置
    AstConfig.NodeCreator
    。这是一个可以做正确事情的委托

  • AstConfig.NodeType
    设置为AstNode的类型。此类型应该是可访问的,实现
    IAstInit
    ,并且具有公共的无参数构造函数。在这种情况下,可访问性表示具有
    InternalsVisibleTo
    属性的
    public
    internal


老实说,我也面临着同样的问题,不理解杰伊·巴祖的答案,尽管它看起来是有效的(可能已经过时了)

如果有像我这样的人


我刚从Irony.Translator.TranslationLanguageGrammar类继承了我的语法,它很有效。此外,任何试图让AST正常工作的人,请确保您的节点是“公共的”:-

除了Jay和Erti Chris的回复之外,此线程也很有用:

Irony的创建者指出了
解释器LanguageGrammar.BuildAst
中的相关配置代码


嗨,杰,谢谢你的回答。实际上,由于可用的支持,已停止使用Irony作为解析器。遗憾的是,它看起来很好,可惜它没有抓住它应得的东西。希望你有一个亡灵巫师徽章@gjvdkamp您现在使用的解析器是什么?我有同样的问题,我也不满意这个项目的文档或网络教程支持。它可能是好的,但它完全无法传达它,使它毫无用处。最后一个真正运行良好的语法是.Net上的ANTLR,这在很大程度上也是因为ANTLRWorks。我已经离开这个话题很多年了,所以在此期间可能发生了很多事情。这两个版本的新版本看起来都很有希望。。。在F#上,您可能希望查看fParsec或活动模式。