Пример #1
0
        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;
            }
        }
Пример #2
0
        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);
        }