parsing - 具有讽刺意味的 AST 生成抛出 nullreferenceexception

标签 parsing irony

我开始使用 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 是一个尚未设置的委托(delegate)。

我试过用 MarkTransient 等设置东西,但没有骰子。

有人可以帮我在这里漂浮吗?我可能遗漏了一些明显的东西。在整个网络上寻找 AST 教程,但我似乎无法找到有关其工作原理的解释。

提前致谢,

格特-扬

最佳答案

一旦设置 LanguageFlags.CreateAst语法上的标志,您必须提供有关如何创建 AST 的附加信息。

你应该能够设置AstContext.Default*Type对于整个语言,但目前是错误的。

  • 设置 TermFlags.NoAstNode . Irony 将忽略此节点及其子节点。
  • 设置 AstConfig.NodeCreator .这是一个可以做正确事情的代表。
  • 设置 AstConfig.NodeType到 AstNode 的类型。这种类型应该是可访问的,实现 IAstInit ,并且有一个公共(public)的、无参数的构造函数。在这种情况下,可访问意味着 publicinternalInternalsVisibleTo属性。
  • 关于parsing - 具有讽刺意味的 AST 生成抛出 nullreferenceexception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10541289/

    相关文章:

    regex - 正则表达式是否用于构建解析器?

    parsing - 开发一个简单的解析器

    parsing - 适用于 C# 以外其他语言的类似 Irony 解析器的软件?

    c# - 具有讽刺意味的.NET : Expression operator precedence

    parsing - 解决我的语法中的 shift-reduce 冲突的问题

    java - 解析特定类之前的某个标签的数据

    parsing - 递归下降解析器容易得到解释

    c# - 我的自定义 XML 阅读器是一条两条腿的乌龟。建议?

    c# - 具有讽刺意味的是:关于评估 AST 节点的教程?

    c# - 如何定义 "else" block ?