解析 – 反讽AST生成抛出null引用除外

我开始使用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教程,但我似乎无法找到有关其工作原理的解释.

提前致谢,

格特 – 扬

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

您应该能够为整个语言设置AstContext.Default * Type,但这当前是错误的.

>设置TermFlags.NoAstNode.反讽会忽略这个节点及其子节点.
>设置AstConfig.NodeCreator.这是一个可以做正确事情的代表.
>将AstConfig.NodeType设置为AstNode的类型.此类型应该是可访问的,实现IAstInit,并具有public,no-parameters构造函数.在这种情况下,可访问意味着具有InternalsVisibleTo属性的public或internal.

点赞