14 using System.Collections.Generic;
17 using System.Threading;
18 using Irony.Interpreter.Ast;
21 namespace Irony.Interpreter {
33 #region Fields and properties
39 public Thread WorkerThread {
get;
private set; }
44 public bool RethrowExceptions =
true;
45 public bool PrintParseErrors =
true;
47 get {
return Parser.Context.Mode; }
48 set { Parser.Context.Mode = value; }
51 get {
return EvaluationContext.TopFrame.Values; }
63 Runtime = Language.Grammar.CreateRuntime(Language);
64 Parser =
new Parser(Language);
66 Status = _internalStatus = InterpreterStatus.Ready;
70 #region Evaluate overloads
76 ParsedScript = parsedScript;
81 _internalStatus = Status = InterpreterStatus.Evaluating;
84 Status = _internalStatus;
93 ParsedScript = parsedScript;
98 Status = _internalStatus = InterpreterStatus.Evaluating;
99 WorkerThread =
new Thread(AsyncThreadStart);
100 WorkerThread.Start(null);
104 #region Other public members: Script, ParsedScript, IsBusy(), GetOutput()
105 public string Script {
106 get {
return _script; }
110 _parsedScript = null;
115 get {
return _parsedScript; }
117 _parsedScript = value;
118 _script = (_parsedScript == null ? null : _parsedScript.SourceText);
123 return Status == InterpreterStatus.Evaluating;
127 return EvaluationContext.OutputBuffer.ToString();
130 EvaluationContext.OutputBuffer.Length = 0;
134 if (ParsedScript == null)
137 return ParsedScript.ParserMessages;
142 if (WorkerThread == null)
return;
143 WorkerThread.Abort();
144 WorkerThread.Join(50);
150 #region private implementations -------------------------------------------------------------------------------
151 private void AsyncThreadStart(
object data) {
155 Status = _internalStatus;
158 private void CheckNotBusy() {
160 throw new Exception(Resources.ErrInterpreterIsBusy);
163 private void ParseAndEvaluate() {
164 EvaluationContext.EvaluationTime = 0;
166 LastException = null;
167 if(ParsedScript == null) {
169 if (Script == null || Script.Trim() == string.Empty && Status == InterpreterStatus.Ready)
return;
170 ParsedScript = this.Parser.Parse(Script,
"source");
174 if(ParsedScript == null)
176 EvaluateParsedScript();
177 _internalStatus = InterpreterStatus.Ready;
180 _internalStatus = InterpreterStatus.RuntimeError;
181 if (LastException != null && RethrowExceptions)
186 private void EvaluateParsedScript() {
187 var iRoot = GetAstInterface();
188 if (iRoot == null)
return;
189 EvaluationContext.ClearLastResult();
190 var start = Environment.TickCount;
191 iRoot.Evaluate(EvaluationContext, AstMode.Read);
192 EvaluationContext.EvaluationTime = Environment.TickCount - start;
193 if (EvaluationContext.HasLastResult)
194 EvaluationContext.Write(EvaluationContext.LastResult + Environment.NewLine);
198 Check(ParsedScript != null, Resources.ErrParseTreeNull);
199 Check(ParsedScript.Root != null, Resources.ErrParseTreeRootNull);
200 var astNode = ParsedScript.Root.AstNode;
201 Check(astNode != null, Resources.ErrRootAstNodeNull);
203 Check(iInterpNode != null, Resources.ErrRootAstNoInterface);
207 private bool CheckParseStatus() {
208 if (ParsedScript == null)
return false;
209 if (ParsedScript.HasErrors()) {
210 _internalStatus = InterpreterStatus.SyntaxError;
211 if (PrintParseErrors) {
212 foreach(var err
in ParsedScript.ParserMessages) {
214 this.EvaluationContext.OutputBuffer.AppendLine(msg);
219 switch (ParsedScript.Status) {
220 case ParseTreeStatus.Error:
221 _internalStatus = InterpreterStatus.SyntaxError;
223 case ParseTreeStatus.Partial:
224 _internalStatus = InterpreterStatus.WaitingMoreInput;
227 _internalStatus = InterpreterStatus.Evaluating;
232 private static void Check(
bool condition,
string message) {
readonly EvaluationContext EvaluationContext
readonly LanguageRuntime Runtime
void EvaluateAsync(string script)
void Evaluate(string script)
readonly LanguageData Language
ParserMessageList GetParserMessages()
void EvaluateAsync(ParseTree parsedScript)
void Evaluate(ParseTree parsedScript)
static string ErrOutErrorPrintFormat
Looks up a localized string similar to {0}: {1}.
ScriptInterpreter(LanguageData language)
ScriptInterpreter(Grammar grammar)