51 lines
1.5 KiB
C#

using System.Collections.Generic;
using Upsilon.BaseTypes;
using Upsilon.Binder;
using Upsilon.Parser;
using Upsilon.Text;
using Upsilon.Utilities;
namespace Upsilon.Evaluator
{
public class Script
{
private SourceText ScriptString { get; }
private Evaluator Evaluator { get; }
private readonly BlockStatementSyntax _parsed;
public Diagnostics Diagnostics { get; }
private Binder.Binder Binder { get; }
public EvaluationScope Scope { get; }
public Script(string scriptString, Dictionary<VariableSymbol, LuaType> variables = null)
{
ScriptString = new SourceText(scriptString);
Diagnostics = new Diagnostics(ScriptString);
_parsed = Parser.Parser.Parse(scriptString, Diagnostics);
if (variables == null)
variables = new Dictionary<VariableSymbol, LuaType>();
Binder = new Binder.Binder(Diagnostics, variables);
Evaluator = new Evaluator( Diagnostics, variables);
Scope = Evaluator.Scope;
}
public BoundScript Bind()
{
return Binder.BindScript(_parsed);
}
public object Evaluate()
{
return Evaluator.Evaluate(Bind());
}
public T Evaluate<T>() where T : LuaType
{
return (T)Evaluator.Evaluate(Bind());
}
public string PrettyPrintSyntaxTree()
{
return _parsed.Print();
}
}
}