irules/test/test.core/GrammarTester.cs

55 lines
1.5 KiB
C#

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;
}
}
}