55 lines
1.5 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|