Esempio n. 1
0
        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()));
        }