using Irony.Interpreter; using Irony.Parsing; using Xunit.Sdk; namespace test.core; public class GrammarTester { private Grammar grammar; private LanguageData language; private Parser parser; public GrammarTester(Grammar grammar) { this.grammar = grammar; language = new LanguageData(grammar); parser = new Parser(language); } public Exception LastException { get; private set; } public AppStatus Status { get; private set; } public ParseTree LastScript { get; private set; } public object Parse(string script) { try { var parsedScript = parser.Parse(script); if (parsedScript.HasErrors()) { Status = AppStatus.SyntaxError; var ex = new ScriptException("Syntax errors found: " + string.Join(", ", parsedScript.ParserMessages.Select(m => $"{m.Message} at line {m.Location.Line}, column {m.Location.Column}" ))); ex.Location = parsedScript.ParserMessages.First().Location; throw ex; } if (parser.Context.Status == ParserStatus.AcceptedPartial) { throw new Exception("AcceptedPartial"); } LastScript = parsedScript; return parsedScript; } catch (Exception ex) { this.LastException = ex; this.Status = AppStatus.Crash; throw; } } }