Пример #1
0
        private Dictionary <string, string> GetConstructionsHelp()
        {
            var    answer = new Dictionary <string, string>();
            string main   = "После каждой команды нужно писать ;.\nЧтобы сделать команду асинхронной нужно добавить async перед ней. Конструкции так же считаются командами. Нераспознанные команды превращаются в строку. \nЧтобы создать строку, её нужно обернуть в двойные кавычки \". Чтобы написать кавычку внутри строки, нужно написать &quot;.";

            answer.Add("Основное", main);
            foreach (ISyntacticConstruction sc in SyntacticConstructionsManager.GetSyntacticConstructs())
            {
                answer.Add(sc.Name, sc.Description);
            }
            return(answer);
        }
Пример #2
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; };
            }
        }