feat: temporary grammar

This commit is contained in:
Mattia Belletti
2025-03-01 12:30:36 +01:00
parent aa3baa780d
commit eed28168ad
31 changed files with 1409 additions and 479 deletions

View File

@@ -3,20 +3,17 @@ using Antlr4.Runtime.Atn;
using Antlr4.Runtime.Tree;
using InkBlot.ParseHierarchy;
using InkBlot.Visitor;
using Microsoft.Extensions.Logging;
namespace InkBlot;
public class InkBlotParser
{
public (Story, IEnumerable<Diagnostic>) Parse(IFileReader fileReader, string mainFileName)
public static (Story, IEnumerable<Diagnostic>) Parse(IFileReader fileReader, ILoggerFactory loggerFactory,
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 tokens = GetTokenStream(fileReader, mainFileName, out var lexerErrorListener);
var parser = new InkBlotAntlrGrammarParser(tokens);
var parserErrorListener = new ParserErrorListener();
parser.RemoveErrorListeners();
@@ -26,9 +23,27 @@ public class InkBlotParser
parser.Interpreter.PredictionMode = PredictionMode.LL_EXACT_AMBIG_DETECTION;
#endif
var tree = parser.story();
var listener = new Listener();
var listener = new Listener(loggerFactory.CreateLogger<Listener>());
var walker = new ParseTreeWalker();
walker.Walk(listener, tree);
return (listener.Story, lexerErrorListener.Diagnostics.Concat(parserErrorListener.Diagnostics));
}
private static CommonTokenStream GetTokenStream(IFileReader fileReader, string mainFileName,
out LexerErrorListener lexerErrorListener)
{
var stream = fileReader.GetContents(mainFileName);
var inputStream = new AntlrInputStream(stream);
var lexer = new InkBlotAntlrGrammarLexer(inputStream);
lexerErrorListener = new LexerErrorListener();
lexer.RemoveErrorListeners();
lexer.AddErrorListener(lexerErrorListener);
var tokens = new CommonTokenStream(lexer);
return tokens;
}
public static CommonTokenStream GetTokenStream(IFileReader fileReader, string mainFileName)
{
return GetTokenStream(fileReader, mainFileName, out _);
}
}