示例#1
0
 private Task <object> Execute(CommandModel cmd, InterpretationData data)
 {
     return(Task.Factory.StartNew <object>(() =>
     {
         int milliseconds = (int)Interpreter.ExecuteCommand(cmd.GetParameters()[0], data);
         Stopwatch sw = new Stopwatch();
         sw.Start();
         while (sw.ElapsedMilliseconds < milliseconds)
         {
             if (data.Stopper.IsStopped)
             {
                 throw new StopException();
             }
             if (milliseconds - sw.ElapsedMilliseconds > 1100)
             {
                 Thread.Sleep(1000);
             }
             if (milliseconds - sw.ElapsedMilliseconds > 50)
             {
                 Task.Delay(1).Wait();
             }
         }
         sw.Stop();
         return milliseconds;
     }, TaskCreationOptions.LongRunning));
 }
示例#2
0
 private Task <object> Execute(CommandModel cmd, InterpretationData data)
 {
     return(Task.Run(new Func <object>(() =>
     {
         var parameters = cmd.GetParameters();
         if (parameters.Length != 1)
         {
             throw new WrongNumberOfParametersException(parameters.Length, 1);
         }
         object num = Interpreter.ExecuteCommand(parameters[0], data);
         if (!(num is int))
         {
             throw new ConversionFailedException("Не удаётся конвертировать " + parameters[0] + " в int.");
         }
         int numberRepetitions = (int)num;
         string script = cmd.Command;
         int bracerIndex = script.IndexOf('{');
         script = script.Substring(bracerIndex + 1, (script.Length - 1) - bracerIndex - 1).Trim();
         while (numberRepetitions-- > 0)
         {
             try { Interpreter.ExecuteScript(script, data); }
             catch (BreakException) { break; }
             catch (Exception e) { throw e; }//прокидываем выше
         }
         return null;
     })));
 }
示例#3
0
 public Task <object> TryExecute(CommandModel cmd, InterpretationData data)
 {
     if (cmd.KeyWord == "CheckVar" && cmd.GetParameters().Length == 1)
     {
         return(Execute(cmd, data));
     }
     return(null);
 }
示例#4
0
 private Task <object> Execute(CommandModel cmd, InterpretationData data)
 {
     return(Task.Run(new Func <object>(() =>
     {
         var pars = cmd.GetParameters();
         if (pars.Length == 1)
         {
             return data.Vars.HasVar(Interpreter.ExecuteCommand(pars[0].Trim(), data).ToString());
         }
         return false;
     })));
 }
        private Task <object> Execute(CommandModel cmd, InterpretationData data)
        {
            return(Task.Factory.StartNew(new Func <object>(() =>
            {
                string description = "";
                if (cmd.Command.StartsWith("["))
                {
                    description = cmd.Command.Substring(0, cmd.Command.IndexOf("func") - 1).Trim();
                    description = description.Remove(description.Length - 1, 1).Remove(0, 1);
                }

                CommandModel newModel = new CommandModel(cmd.Command.Substring(cmd.Command.IndexOf("func") + 4).Trim());
                string name = newModel.KeyWord;
                string script = cmd.Command;
                int bracerIndex = script.IndexOf('{');
                script = script.Substring(bracerIndex + 1, (script.Length - 1) - bracerIndex - 1).Trim();
                var buf = new UserFunc(name, newModel.GetParameters(), script, description);
                data.InterpretationFuncs.RemoveAll(func => func.Name == buf.Name);
                data.InterpretationFuncs.Add(buf);
                return null;
            }), TaskCreationOptions.AttachedToParent));
        }
示例#6
0
 private bool IsValidConstruction(CommandModel cmd, InterpretationData data)
 {
     return(cmd.KeyWord.StartsWith("Delay") && cmd.GetParameters().Length == 1);
 }
 private bool IsValidConstruction(CommandModel cmd)
 {
     return(cmd.KeyWord == "if" && cmd.GetParameters().Length == 1);
 }
示例#8
0
        public static object ExecuteCommand(string cmdString, InterpretationData data)
        {
            if (data.Stopper.IsStopped)
            {
                throw new StopException();
            }

            CommandModel  cmd         = new CommandModel(cmdString.Trim());
            Task <object> commandTask = null;

            if (Converter.CanConvertToSimpleType(cmd.Command))//берём простой тип
            {
                commandTask = Converter.ToSimpleType(cmd.Command);
            }
            if (commandTask == null)
            {
                SyntacticConstructionsManager.TryExecute(cmd, data, out commandTask);
            }
            if (commandTask == null)
            {
                //ищем функцию по имени во всей библиотеке, начинаем с функций этой интерпретации
                IInterpreterFunction func = data.InterpretationFuncs.FirstOrDefault(Func => Func.Name == cmd.KeyWord);
                if (func == null)
                {
                    func = AdditionalLibrary.FirstOrDefault(Func => Func.Name == cmd.KeyWord);
                }
                if (func == null)
                {
                    func = MainLibrary.FirstOrDefault(Func => Func.Name == cmd.KeyWord);
                }
                if (func != null)
                {
                    var      stringParameters = cmd.GetParameters();
                    object[] parameters       = new object[stringParameters.Length];
                    for (int i = 0; i < parameters.Length; i++)
                    {
                        parameters[i] = ExecuteCommand(stringParameters[i], data);
                    }
                    commandTask = func.GetResult(parameters, data);
                }
            }


            if (commandTask == null)//если ничего не удалось, возвращаем входную команду, как строку
            {
                commandTask = Task.FromResult <object>(cmdString);
            }

            if (commandTask.Status == TaskStatus.Created)//если задача создана, но не запущена
            {
                commandTask.Start();
            }
            if (cmd.IsAsync)//если асинхронно, на всё пофиг
            {
                return(null);
            }
            else
            {
                try { return(commandTask.Result); }//если что то не так, прокидываем исключение выше
                catch { throw commandTask.Exception.InnerException; };
            }
        }