34 lines
1.3 KiB
C#
34 lines
1.3 KiB
C#
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<Diagnostic>) 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));
|
|
}
|
|
} |