private void ExecuteExecuteStmt(Ast.ExecuteStmt stmt, ScriptEnv env) { var parser = new ScriptParser(_notebook); var runner = new ScriptRunner(_notebook, _scripts); var script = parser.Parse(GetScriptCode(stmt.ScriptName)); var subEnv = new ScriptEnv(); foreach (var arg in stmt.Arguments) { subEnv.Vars[arg.Name.ToLower()] = EvaluateExpr(arg.Value, env); } try { runner.Execute(script, subEnv); } catch (UncaughtErrorScriptException ex) { env.ErrorNumber = ex.ErrorNumber; env.ErrorMessage = ex.ErrorMessage; env.ErrorState = ex.ErrorState; env.DidThrow = true; return; } env.Output.Append(subEnv.Output); var returnCode = subEnv.Output.ScalarResult; if (stmt.ReturnVariableName != null) { var name = stmt.ReturnVariableName.ToLower(); env.Vars[name] = returnCode ?? 0L; } }
private Ast.Stmt ParseExecuteStmt(TokenQueue q) { var stmt = new Ast.ExecuteStmt { SourceToken = q.SourceToken }; q.Take("exec", "execute"); if (q.Peek(1) == "=") { stmt.ReturnVariableName = ParseVariableName(q); q.Take("="); } if (q.PeekToken().Type == TokenType.String || q.PeekToken().Type == TokenType.Id) { stmt.ScriptName = q.Take().GetUnescapedText(); } else { throw new SyntaxException(new[] { "string", "identifier" }, q); } if (IsVariableName(q.PeekToken()?.GetUnescapedText() ?? "") && q.Peek(1) == "=") { while (true) { var arg = new Ast.ArgumentPair(); arg.Name = ParseVariableName(q); q.Take("="); if (q.Peek() == "default") { q.Take(); } else { arg.Value = ParseExpr(q); } stmt.Arguments.Add(arg); if (!q.TakeMaybe(",")) { break; } } } ConsumeSemicolon(q); return(stmt); }