Esempio n. 1
0
        public override object Выполнить(План вызывающееДействие)
        {
            bool значениеУсловия;

            проверкаУсловия : значениеУсловия = (bool)УсловиеВыхода.Выполнить(this);

            if (значениеУсловия == true)
            {
                var команда = (string)ТелоЦикла.Выполнить(this);
                if (команда == "готово")
                {
                    goto проверкаУсловия;
                }
                if (команда == "продолжить")
                {
                    goto проверкаУсловия;
                }
                if (команда == "прервать")
                {
                    return("готово");                       //выход из цикла = break
                }
            }

            return("готово");
        }
Esempio n. 2
0
        public override object Выполнить(План вызывающееДействие)
        {
            // найти определение функции в полученном окружении
            // здесь только
            var определениеФункции = (ОпределениеФункции)вызывающееДействие.ЗначениеПеременной(ИмяФункции);

            //создать контекст
            //СловарьВнутреннихПеременных = new Dictionary<string, object>();
            СоздатьСписокПеременных();

            // присвоить значение переданных параметров в текущий контекст
            foreach (var параметр in СписокИменованныхПараметров)
            {
                СловарьВнутреннихПеременных.Add(параметр.Key, параметр.Value); //значение параметра может быть действие = значение другой переменной или адрес этой переменной
                // ПолучитьЗначениеПеременной{переменая=Имя}результат будет либо адрес либо примитив, примитив надо полностью копировать
                //ПолучитьАдресПеременной(переменная=Имя), в функции появиться дубль внешней переменной , примитив тоже храниться по адресу в некоторой группе
            }
            // запустить список Действий, используется один список действий из определения, но с разным контекстом
            foreach (var действие in определениеФункции.ТелоФункции)
            {
                if (действие is ВернутьРезультат)
                {
                    езультат = действие.Выполнить(this);
                    break;
                }
                действие.Выполнить(this);
            }

            //вернуть результат

            return(езультат);
        }
Esempio n. 3
0
        public override object Выполнить(План вызывающееДействие)
        {
            ВышестоящийПлан = вызывающееДействие;// для доступа к вышележащим переменным
            СоздатьСписокПеременных();


            for (var индекс = 0; индекс < СписокДействий.Count;)
            {
                var действие = СписокДействий[индекс];
                if (действие is Прервать)
                {
                    return("прервать");
                }


                if (действие is ПерейтиК)
                {
                    индекс = СписокДействий.FindIndex(план => план.Метка == ((ПерейтиК)действие).МеткаКуда);
                }

                try
                {
                    действие.Выполнить(this);
                }
                catch (Exception exception)
                {
                    return("ошибка в " + действие + exception);
                }

                индекс++;
            }

            return("готово");
        }
        public List <ОпределениеПоля> СписокОпределенияПолей;     // например имена полей это может быть список внутренних переменных

        public override object Выполнить(План вызывающееДействие) // это может быть и не действие а другой класс
        {
            вызывающееДействие.СловарьВнутреннихПеременных.Add(ИмяКласса, this);
            вызывающееДействие.СловарьТипизированныхПеременных.Add(ИмяКласса, new ТипизированноеЗначение()
            {
                ИмяТипа = "Определение Типа", Значение = this
            });
            // проверить незанятость Имени Типа
            bool имяЗанято = вызывающееДействие.СписокТипизированныхПеременных.Exists(пер => пер.ИмяПеременной == ИмяКласса);

            if (!имяЗанято)
            {
                var новыйКласс = new ОпределениеКласса()
                {
                    ИмяКласса = ИмяКласса, СписокОпределеныхПолей = СписокОпределенияПолей
                };

                вызывающееДействие.СписокТипизированныхПеременных.Add(new ТипизированнаяПеременная()
                {
                    ИмяПеременной = ИмяКласса,
                    ИмяТипа       = "Определение Типа",
                    Значение      = новыйКласс // или this, это если данные совпадают с действием
                });
            }
            else
            {
                return("имя занято");
            }

            return("готово");
        }
Esempio n. 5
0
 public АМОбъект ВозращаемыйРезультат;  // может быть и просто значение
 public override object Выполнить(План вызывающееДействие)
 {
     if (ВозращаемыйРезультат is План)
     {
         return(((План)ВозращаемыйРезультат).Выполнить(вызывающееДействие));
     }
     return(ВозращаемыйРезультат);
 }
Esempio n. 6
0
        public override object Выполнить(План вызывающееДействие)
        {
            СозданиеИндекса.Выполнить(this);

            while ((bool)УсловиеВыхода.Выполнить(this))
            {
                ТелоЦикла.Выполнить(this);
                ИзменеениеИндекса.Выполнить(this);
            }
            return("готово");
        }
Esempio n. 7
0
        public override object Выполнить(План вызывающееДействие)
        {
            if (Значение.GetType() == Тип)
            {
                // проверить не занятость имени переменной

                вызывающееДействие.СловарьВнутреннихПеременных.Add(ИмяПеременной, Значение);
                return("готово");
            }

            return("ошибка типа");
        }
Esempio n. 8
0
 //этот метод лучше убрать из функции преобразовать в список действий т.к. их всего 2 вызова
 private ЦелоеЧисло ПреобразоватьСлогаемое(План вызывающееДействие, АМОбъект параметр)
 {
     if (параметр is План)
     {
         return((ЦелоеЧисло)((План)слогаемое1).Выполнить(this));
     }
     else if (слогаемое1 is СтрокаЮникода) // это должно быть действие ПолучитьЗначениеПеременной
     {
         return((ЦелоеЧисло)вызывающееДействие.СловарьВнутреннихПеременных[((СтрокаЮникода)параметр).Значение]);
     }
     else
     {
         return((ЦелоеЧисло)параметр);
     }
 }
Esempio n. 9
0
        public override object Выполнить(План вызывающееДействие)
        {
            ЦелоеЧисло[] слогаемое = new ЦелоеЧисло[2]; //это внутренние переменные



            слогаемое[0] = ПреобразоватьСлогаемое(вызывающееДействие, слогаемое1);
            слогаемое[1] = ПреобразоватьСлогаемое(вызывающееДействие, слогаемое2);


            езультатДействия = new ЦелоеЧисло()
            {
                Значение = слогаемое[0].Значение + слогаемое[1].Значение
            };

            return(езультатДействия);
        }
        public override object Выполнить(План вызывающееДействие)
        {
            var определениеПолей = экземпляр.Класс.СписокОпределеныхПолей;
            int номерПоля        = экземпляр.Класс.ДайНомерПоля(ИмяПоля);

            if (номерПоля == -1)
            {
                return("ошибка: нет такого поля");
            }

            var типПоля = определениеПолей[номерПоля].ИмяТипа;

            if (типПоля != ((ЭкземплярКласса)ПрисваиваемоеЗначение).Класс.ИмяКласса)
            {
                return("ошибка: несовпадение типов");
            }

            экземпляр.СписокЗначений[номерПоля] = ( АМОбъект)ПрисваиваемоеЗначение; return("готово");
        }
        public override object Выполнить(План вызывающееДействие)
        {
            var определениеКласса = (ОпределениеКласса)вызывающееДействие.СловарьВнутреннихПеременных[ИмяКласса];
            var экземпляр         = new ЭкземплярКласса
            {
                Класс          = определениеКласса,
                СписокЗначений = new List <АМОбъект>
                {
                    Capacity = определениеКласса.СписокОпределеныхПолей.Count // ограничение в создании полей
                }
            };

            езультатДействия = экземпляр;


            foreach (var определениеПоля in определениеКласса.СписокОпределеныхПолей)
            {
                // создать экземпляры классов для всех полей
            }
            return(езультатДействия);

            return("готово");
        }
Esempio n. 12
0
 public override object Выполнить(План вызывающееДействие)
 {
     return(true);
 }
Esempio n. 13
0
 public override object Выполнить(План вызывающееДействие)
 {
     // если такой переменной нет вернуть ошибку
     вызывающееДействие.СловарьВнутреннихПеременных[ИмяПеременной] = Значение;
     return("готово");
 }
Esempio n. 14
0
 public override object Выполнить(План вызывающееДействие)
 {
     // нужен рекурсивный поиск переменной в вышележащих
     return(вызывающееДействие.СловарьВнутреннихПеременных[ИмяПеременной]);
 }
Esempio n. 15
0
        public object Значение; //это может быть и действие

        public override object Выполнить(План вызывающееДействие)
        {
            вызывающееДействие.СловарьВнутреннихПеременных.Add(ИмяПеременной, Значение);
            return("готово");
        }
Esempio n. 16
0
        public List <План> ТелоФункции; // в теле функции не нужно определять переменные с именем параметров, будет ошибка,т.к. при вызове она уже будет создана

        public override object Выполнить(План вызывающееДействие)
        {
            // определение функции в текущем контексте, можно выбрать другой контекст
            вызывающееДействие.ДобавитьПеременную(ИмяФункции, "функция", this); //вместо "функция" можно добавить "поле" "переменная" получиться класс
            return("готово");
        }