Ирония поколения AST выбрасывает исключение нулевой ссылки

Я начинаю с 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 или когда я хочу проанализировать тест. Ошибка в строке 96 AstBuilder.cs:

  parseNode.AstNode = config.DefaultNodeCreator();

DefaultNodeCreator - это делегат, который не был установлен.

Я пытался настроить вещи с помощью MarkTransient и т. Д., Но без игры в кости.

Может ли кто-нибудь помочь мне на плаву здесь? Я пропускаю что-то очевидное. Поискал учебники по AST по всем сетям, но я не могу найти объяснения, как это работает.

Заранее спасибо,

Герт-Ян

3 ответа

Решение

Как только вы установите LanguageFlags.CreateAst флаг на грамматике, вы должны предоставить дополнительную информацию о том, как создать AST.

Вы должны быть в состоянии установить AstContext.Default*Type для всего языка, но это в настоящее время прослушивается.

  • Задавать TermFlags.NoAstNode, Ирония будет игнорировать этот узел и его детей.

  • Задавать AstConfig.NodeCreator, Это делегат, который может делать правильные вещи.

  • Задавать AstConfig.NodeType к типу AstNode. Этот тип должен быть доступен, реализовать IAstInitи иметь открытый конструктор без параметров. Доступный в этом случае означает либо public или же internal с InternalsVisibleTo приписывать.

Честно говоря, я столкнулся с той же проблемой и не понял ответа Джея Базузи, хотя он выглядит верным (возможно, он устарел).

Если есть кто-то, как я;

Я только что унаследовал мою грамматику от Irony.Interpreter.InterpretedLanguageGrammar класс, и это работает. Кроме того, любой, кто пытается заставить AST работать, убедитесь, что ваши узлы "общедоступны":-)

Помимо ответов Джея и Эрти-Криса, эта ветка также полезна:

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

Создатель Иронии указывает на соответствующий код конфигурации в InterpretedLanguageGrammar.BuildAst,

НТН

Другие вопросы по тегам