static SyntaxTree ParseInternal(SourceText sourceText, [CanBeNull] Func <GdGrammar, ParserRuleContext> treeCreator, CancellationToken cancellationToken) { treeCreator ??= (p => p.guiDescription()); var diagnostics = ImmutableArray.CreateBuilder <Diagnostic>(); // Setup Lexer var stream = sourceText.ToCharStream(); var lexer = new GdTokens(stream); var lexerErrorListener = new GdLexerErrorListener(sourceText, diagnostics); lexer.RemoveErrorListeners(); lexer.AddErrorListener(lexerErrorListener); // Setup Parser var cts = new GdCommonTokenStream(lexer); var parser = new GdGrammar(cts); var parserErrorListener = new GdParserErrorListener(sourceText, diagnostics); parser.RemoveErrorListeners(); parser.AddErrorListener(parserErrorListener); var tree = treeCreator(parser); cancellationToken.ThrowIfCancellationRequested(); var errorNodes = new ErrorNodeVisitor(); errorNodes.Visit(tree); cancellationToken.ThrowIfCancellationRequested(); var tokens = TokenFactory.CreateTokens(cts, errorNodes.ErrorNodes); var visitor = new GdSyntaxSlotBuilder(tokens); var slot = visitor.Visit(tree); return(new SyntaxTree(sourceText, slot, diagnostics.ToImmutableArray())); }