//Функция для занесения элемента в одну из таблиц, а так же в таблицу стандартных символов 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); } }
//Заполняем таблицы public void FillTables(Table tlex, Table tTer, Table tDel, Table id, Table tLit, Table tFinal) { //Заполним таблицы терминалов и разделителей FillTerminalsAndDelimiters(tTer, tDel); //Значения основной таблицы запишем как массив лексем Lexem[] temp = new Lexem[tlex.GetCountLexem()]; temp = tlex.GetTableString(); //Запускаем цикл распределения лексем по таблицам и занесения в финальную for (int i = 0; i < temp.Length; i++) { //Работаем с разделителями if (temp[i].GetTypeString() == "Delimiter") { //Вскрываем таблицу разделителей Lexem[] temp2 = new Lexem[tDel.GetCountLexem()]; temp2 = tDel.GetTableString(); //Проверяем лексему на соответствие им for (int j = 0; j < temp2.Length; j++) { if (temp[i].Get() == temp2[j].Get()) { StandartSymbol le = new StandartSymbol(); le.TableNumber = 2; le.ItemNumber = j; le.Set(temp[i].Get()); tFinal.SetTableString(le); } } } if (temp[i].GetTypeString() == "Identifier") { Byte B = 0; //Вскрываем таблицу терминалов Lexem[] temp2 = new Lexem[tTer.GetCountLexem()]; temp2 = tTer.GetTableString(); //Проверяем лексему на соответствие им for (int j = 0; j < temp2.Length; j++) { if (temp[i].Get() == temp2[j].Get()) { StandartSymbol le = new StandartSymbol(); le.TableNumber = 1; le.ItemNumber = j; le.Set(temp[i].Get()); tFinal.SetTableString(le); B = 1; break; } } //Если в таблице терминалов соответствие не найдено, переходим к заполнению финальной таблицы //обычными идентификаторами if (B == 0) { Fill(temp[i], id, tFinal); } } if (temp[i].GetTypeString() == "Literal") { Fill(temp[i], tLit, tFinal); } } }