Esempio n. 1
0
        /// <summary>
        /// проверяет символ на соответствие заданному
        /// возвращает головку в начало проверяемого символа, если символы не совпали,
        /// иначе оставляет головку в конце проверяемого симовола
        /// выполняет отсылку на команду, обозначенную в index
        /// длина команды - 3*length
        /// </summary>
        /// <param name="symbol">проверямый символ</param>
        /// <param name="reference1">индекс отсылки в случае верной проверки</param>
        /// <param name="reference2">индекс отсылки в случае неуспешной проверки</param>
        /// <returns>количетво созданных комманд</returns>
        public void Check(string checker, int reference1, int reference2, string com = null)
        {
            int leftmover = prog.Count + length * 2 + 2, //переменная, указывающая на первую комманду сдвига влево
                index     = prog.Count + 1;

            for (int i = 0; i < length; i++)
            {
                if (checker[i] == 'V')
                {
                    string[] s  = PostCommands.CreateConditionCommand(i != 0 ? leftmover + length - i - 1 : reference2, ++index, com);
                    string[] s2 = PostCommands.CreateRightCommand(++index, com);
                    prog.Add(s); prog.Add(s2);
                }

                if (checker[i] == ' ')
                {
                    string[] s  = PostCommands.CreateConditionCommand(++index, i != 0 ? leftmover + length - i - 1 : reference2, com);
                    string[] s2 = PostCommands.CreateRightCommand(++index, com);
                    prog.Add(s); prog.Add(s2);
                }
            }

            // успешная проверка
            string[] s1 = PostCommands.CreateLeftCommand(reference1, com);
            prog.Add(s1);
            index = prog.Count + 1;
            // создаем комманды для сдвига
            for (int i = 0; i < length - 1; i++)
            {
                string[] s = PostCommands.CreateLeftCommand(++index, com);
                prog.Add(s);
            }
            prog[prog.Count - 1] = PostCommands.CreateLeftCommand(reference2, com);
        }
Esempio n. 2
0
        /// <summary>
        /// замена символа
        /// длина команды - динамическая
        /// </summary>
        /// <param name="one">заменяемый символ</param>
        /// <param name="two">заменяющий символ</param>
        /// <param name="pos">позиция головки</param>
        /// <returns>длину команды</returns>
        public void Replace(string one, string two, string com = null, HeadPosition pos = HeadPosition.End)
        {
            int index = prog.Count + 1;

            if (pos == HeadPosition.End)
            {
                // остановка в начале замененного символа
                for (int i = two.Length - 1; i >= 0; i--)
                {
                    //Console.WriteLine(one + " " + two);
                    if (one[i] == two[i])
                    {
                        string[] s = PostCommands.CreateLeftCommand(++index, com);
                        prog.Add(s);
                    }
                    else
                    if (one[i] != two[i] && one[i] == 'V')
                    {
                        string[] s  = PostCommands.CreateClearCommand(++index, com);
                        string[] s2 = PostCommands.CreateLeftCommand(++index, com);
                        prog.Add(s); prog.Add(s2);
                    }
                    else
                    {
                        string[] s  = PostCommands.CreateTagCommand(++index, com);
                        string[] s2 = PostCommands.CreateLeftCommand(++index, com);
                        prog.Add(s); prog.Add(s2);
                    }
                }
            }
            else if (pos == HeadPosition.Start)
            {
                // остановка в начале следующего символа
                for (int i = 0; i < two.Length; i++)
                {
                    if (one[i] == two[i])
                    {
                        string[] s = PostCommands.CreateRightCommand(++index, com);
                        prog.Add(s);
                    }
                    else
                    if (one[i] != two[i] && one[i] == 'V')
                    {
                        string[] s  = PostCommands.CreateClearCommand(++index, com);
                        string[] s2 = PostCommands.CreateRightCommand(++index, com);
                        prog.Add(s); prog.Add(s2);
                    }
                    else
                    {
                        string[] s  = PostCommands.CreateTagCommand(++index, com);
                        string[] s2 = PostCommands.CreateRightCommand(++index, com);
                        prog.Add(s); prog.Add(s2);
                    }
                }
            }

            string[] s1 = PostCommands.CreateRightCommand(++index); // TODO
            prog.Add(s1);
        }
Esempio n. 3
0
        /// <summary>
        /// позиция головки находится в самой первой ячейке кода символа
        /// сдвигаемся в начало следующей ячейки
        /// длина команды - length
        /// </summary>
        public void MoveRight(string com = null)
        {
            int index = prog.Count + 1;

            for (int i = 0; i < length; i++)
            {
                string[] s = PostCommands.CreateRightCommand(++index, com);
                prog.Add(s);
            }
        }