Beispiel #1
0
 //Точка входа в разбор
 private int S()
 {
     L = Next();
     while (L.Get() == "#")
     {
         Strn++;
         L = Next();
     }
     //Лексемы, с которых может начинаться выражение
     if (L.Get() == "dim" || L.Get() == "select" || L.TableNumber == 4)
     {
         //Передаем лексему в программу для продолжения разбора. При удаче, завершится на $
         if (program() == 1)
         {
             return(1);
         }
         else
         {
             return(0);
         }
     }
     //Конец разбора
     if (L.Get() == "$")
     {
         return(0);
     }
     //Ошибка
     //Проверяемая строка не подходит под грамматику языка
     err.AddText(er.FindErrors(5, Strn));
     return(1);
 }
Beispiel #2
0
        //Функция для занесения элемента в одну из таблиц, а так же в таблицу стандартных символов
        private void Fill(Lexem a, Table tbl, Table final)
        {
            //Переменная состояния
            Byte B = 0;
            //Временный стандартный символ
            StandartSymbol le = new StandartSymbol();

            //Извлекаем значения из таблицы лексем
            Lexem[] temp = new Lexem[tbl.GetCountLexem()];
            temp = tbl.GetTableString();
            //Запускаем цикл
            for (int i = 0; i < temp.Length; i++)
            {
                //Если лексема совпадает с табличной
                if (a.Get() == temp[i].Get())
                {
                    //меняем состояние
                    B = 1;
                    //Смотрим на тип лексемы
                    if (a.GetTypeString() == "Identifier")
                    {
                        le.TableNumber = 4;
                    }
                    if (a.GetTypeString() == "Literal")
                    {
                        le.TableNumber = 3;
                    }
                    //Запоминаем номер лексемы в таблице
                    le.ItemNumber = i;
                }
            }
            //Если состояние не было изменено
            //Добавляем лексему к таблице
            //И вызываем функцию еще раз
            if (B == 0)
            {
                tbl.SetTableString(a);
                Fill(a, tbl, final);
            }
            //Если состояние все же изменилось
            //Добавляем лексему к финальной таблице
            else
            {
                le.Set(a.Get());
                final.SetTableString(le);
            }
        }
Beispiel #3
0
 //
 private int program()
 {
     //Пока конец таблицы не достигнут
     while (L.Get() != "$")
     {
         //Если в выражении ошибка
         if (statement() == 1)
         {
             return(1);
         }
         //Если выражение не заканчивается символом конца строки
         if (L.Get() != "#")
         {
             //Ошибка. Отсутствует знак конца строки в строке №
             err.AddText(er.FindErrors(6, Strn));
             return(1);
         }
         while (L.Get() == "#")
         {
             Strn++;
             L = Next();
         }
     }
     return(0);
 }
Beispiel #4
0
        //Функция разбора сложного выражения
        public void Analise(Statement str)
        {
            //Лексема для работы. В нее будем помещать каждый следующий символ из потока
            Lexem lex = new Lexem();

            lex = ReadCh();
            //Пока в выражении не закончатся элементы
            while (!End)
            {
                //Если лексема - операнд, то
                if (lex.TableNumber == 3 || lex.TableNumber == 4)
                {
                    lex = Kid(lex.Get());
                    continue;
                }
                else
                {
                    //Если вершина стека - скобка
                    if (T.GetS() == "(")
                    {
                        //Входной символ - завершающий
                        if (lex.Get() == "#")
                        {
                            //Выводим сообщение об ошибке
                            Errors = err.FindErrors(21, 0);
                            D5(lex.Get());
                            continue;
                        }
                        //Входной символ - (+-*/
                        if (lex.Get() == "(" || lex.Get() == "+" || lex.Get() == "-" || lex.Get() == "*" || lex.Get() == "/")
                        {
                            lex = D1(lex.Get());
                            continue;
                        }
                        //Входной символ )
                        if (lex.Get() == ")")
                        {
                            lex = D3();
                            continue;
                        }
                    }
                    //Если вершина стека +-
                    if (T.GetS() == "+" || T.GetS() == "-")
                    {
                        //Входной символ - #)
                        if (lex.Get() == "#" || lex.Get() == ")")
                        {
                            D4(lex.Get());
                            continue;
                        }
                        //Входной символ - (*/
                        if (lex.Get() == "(" || lex.Get() == "*" || lex.Get() == "/")
                        {
                            lex = D1(lex.Get());
                            continue;
                        }
                        ///////////////////////////////////////////////////////////////////////
                        //Входной символ - +-
                        if (lex.Get() == "+" || lex.Get() == "-")
                        {
                            lex = D2(lex.Get());
                            continue;
                        }
                    }
                    //Если вершина стека */
                    if (T.GetS() == "*" || T.GetS() == "/")
                    {
                        //Входной символ - #)
                        if (lex.Get() == "#" || lex.Get() == ")" || lex.Get() == "+" || lex.Get() == "-")
                        {
                            D4(lex.Get());
                            continue;
                        }
                        //Входной символ - (
                        if (lex.Get() == "(")
                        {
                            lex = D1(lex.Get());
                            continue;
                        }
                        //Входной символ - */
                        if (lex.Get() == "*" || lex.Get() == "/")
                        {
                            lex = D2(lex.Get());
                            continue;
                        }
                    }
                    //если вершина стека пуста
                    if (T.isEmpty())
                    {
                        //Входной символ - */+-(
                        if (lex.Get() == "(" || lex.Get() == "*" || lex.Get() == "/" || lex.Get() == "+" || lex.Get() == "-")
                        {
                            lex = D1(lex.Get());
                            continue;
                        }
                        //Входной символ - #
                        if (lex.Get() == "#")
                        {
                            D6(lex.Get());
                            return;
                        }
                        //Входной символ - )
                        if (lex.Get() == ")")
                        {
                            //Выводим сообщение об ошибке
                            Errors = err.FindErrors(22, 0);
                            D5(lex.Get());
                            return;
                        }
                    }
                }
            }
        }