С помощью antlr я пытаюсь сделать TreeWalker для дерева следующим образом:
ввод: int x = 3
выход AST: ^(VARDEF int x 3)
Мой анализатор работает просто отлично и также генерирует AST, как показано выше, но всякий раз, когда я хочу разрешить что-либо из AST, например, с помощью $ variableType.text, всегда возникает исключение NullReferenceException в сгенерированном TreeWalker на C # 2.0.
Мой TreeWalker:
tree grammar SGLTreeWalker;
options {
tokenVocab = SGL;
language = 'CSharp2';
}
[...]
compilationUnit
: (statement)+
;
statement
: variableDefinitionList
;
variableDefinitionList
: ^(VARDEF variableType variableName expression) { Console.WriteLine($variableType.text); }
;
[...]
Проблемная часть, генерируемая правилом "variableDefinitionList", выглядит следующим образом:
Match(input, Token.UP, null);
Console.WriteLine(((variableType1 != null) ? input.TokenStream.ToString(
input.TreeAdaptor.GetTokenStartIndex(variableType1.Start),
input.TreeAdaptor.GetTokenStopIndex(variableType1.Start)) : null));
Оказывается, что input.TokenStream имеет значение null, поэтому он генерирует исключение NullReferenceException. Я читал, что это может произойти, если используемый TreeNodeStream не буферизован, но я использовал CommonTreeNodeStream, поэтому я думаю, что он должен быть буферизован. Вот код, который я использовал для фиксации AST:
[...]
SGLParser parser = new SGLParser(tStream);
CommonTree t = (CommonTree) parser.compilationUnit().Tree;
Console.WriteLine("; " + t.ToStringTree());
CommonTreeNodeStream treeStream = new CommonTreeNodeStream(t);
SGLTreeWalker tw = new SGLTreeWalker(treeStream);
tw.compilationUnit();
Любая идея о том, почему input.TokenStream преобразуется в ноль, когда я просто хочу получить атрибут $variableType.text
?