Ирония поколения 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
,
НТН