using Antlr4.Runtime; using Antlr4.Runtime.Atn; using Antlr4.Runtime.Tree; using InkBlot.ParseHierarchy; using InkBlot.Visitor; namespace InkBlot; public class InkBlotParser { public (Story, IEnumerable) Parse(IFileReader fileReader, string mainFileName) { var stream = fileReader.GetContents(mainFileName); var inputStream = new AntlrInputStream(stream); var lexer = new InkBlotAntlrGrammarLexer(inputStream); var lexerErrorListener = new LexerErrorListener(); lexer.RemoveErrorListeners(); lexer.AddErrorListener(lexerErrorListener); var tokens = new CommonTokenStream(lexer); var parser = new InkBlotAntlrGrammarParser(tokens); var parserErrorListener = new ParserErrorListener(); parser.RemoveErrorListeners(); parser.AddErrorListener(parserErrorListener); #if DEBUG parser.AddErrorListener(new DiagnosticErrorListener()); parser.Interpreter.PredictionMode = PredictionMode.LL_EXACT_AMBIG_DETECTION; #endif var tree = parser.story(); var listener = new Listener(); var walker = new ParseTreeWalker(); walker.Walk(listener, tree); return (listener.Story, lexerErrorListener.Diagnostics.Concat(parserErrorListener.Diagnostics)); } }