public void SyntaxError(IRecognizer recognizer, IToken offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e)
        {
            AnyErrors = true;
            CrawlParser parser = (CrawlParser)recognizer;

            IntervalSet set = parser.GetExpectedTokens();

            string help =
                $"Symbolet {CrawlLexer.ruleNames[offendingSymbol.Type]} er ikke tilladt på dette punkt. En af de følgende var forventet:\n\t" +
                string.Join("\n\t", set.ToArray().Select(x => parser.Vocabulary.GetDisplayName(x)));

            int intrestinglocation = offendingSymbol.TokenIndex;

            //for (int i = intrestinglocation; i < offendingSymbol.TokenIndex + 20; i++)
            //{
            //    if (parser.TokenStream.Get(i).Channel == Lexer.DefaultTokenChannel)
            //    {
            //        intrestinglocation = i;
            //        break;
            //    }
            //}


            Errors.Add(CompilationMessage.Create(
                           parser.TokenStream,
                           Interval.Of(intrestinglocation, intrestinglocation),
                           MessageCode.UnexpectedSymbol,
                           $"{_file}:{line},{charPositionInLine}",
                           help,
                           MessageSeverity.Error));
        }
        private static CrawlParser.Translation_unitContext ParseFile(Stream file)
        {
            //First we need to open specified file.
            AntlrInputStream fs = new AntlrInputStream(file);
            //An ITokenSource lets us get the tokens one at a time.
            ITokenSource ts = new CrawlLexer(fs);
            //An ITokenStream lets us go forwards and backwards in the token-series.
            ITokenStream tstream = new CommonTokenStream(ts);
            //That's what our parser wants.
            CrawlParser parser = new CrawlParser(tstream);

            return(parser.translation_unit());
        }
        public static ParseTreeData ReadFileToPt(string path, SideeffectHelper helper)
        {
            ICharStream  charStream  = new AntlrFileStream(path, Encoding.UTF8);
            CrawlLexer   tokenSource = new CrawlLexer(charStream);
            ITokenStream tokenStream = new CommonTokenStream(tokenSource);

            CompilationMessageErrorListner cm = new CompilationMessageErrorListner(helper.CompilationMessages, path);

            CrawlParser parser = new CrawlParser(tokenStream);

            parser.RemoveErrorListeners();
            parser.AddErrorListener(cm);

            CrawlParser.Translation_unitContext translationUnit = parser.translation_unit();

            return(new ParseTreeData(tokenStream, translationUnit, path));
        }
        public static CrawlSyntaxTree ReadFile(string filename)
        {
            ICharStream  charStream  = new AntlrFileStream(filename, Encoding.UTF8);
            CrawlLexer   tokenSource = new CrawlLexer(charStream);
            ITokenStream tokenStream = new CommonTokenStream(tokenSource);
            CrawlParser  parser      = new CrawlParser(tokenStream);


            //The translation_unit is the top rule in our grammar.
            //Asking the parser to match that from the token stream leaves us at the top of the parse tree.
            CrawlParser.Translation_unitContext rootContext = parser.translation_unit();


            TranslationUnitNode node = ParseTreeParser.ParseTranslationUnit(rootContext);

            node.OwningTree.CompilationUnitName = filename;

            return(node.OwningTree);
        }