//Точка входа в разбор 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); }
//Функция для занесения элемента в одну из таблиц, а так же в таблицу стандартных символов 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); } }
// 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); }
//Функция разбора сложного выражения 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; } } } } }