示例#1
0
    private void ExecuteExecuteStmt(Ast.ExecuteStmt stmt, ScriptEnv env)
    {
        var subOutput = ExecuteSubScript(stmt.ScriptName, stmt.Arguments, env);

        env.Output.Append(subOutput);
        var returnCode = subOutput.ScalarResult;

        if (stmt.ReturnVariableName != null)
        {
            var name = stmt.ReturnVariableName.ToLower();
            env.Vars[name] = returnCode ?? DBNull.Value;
        }
    }
示例#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);
    }