Лексика языков программирования. Конечные автоматы без памяти для обнаружения слов в тексте программы, страница 9

                  {

                        Lexem.groupIndex = -2147483647;

                        return Lexem;

                  }

                  ignoreLastWord = true; 

//для входа в основной цикл установим флажок игнорирования слова

                  while(ignoreLastWord)

                  {

                        ignoreLastWord = false;

//и сбросим его (возможно, он будет установлен действием)

                        //вызов лексического акцептора:

                        Lexem = lexAcceptor->getLexem();   

//получим лексему от текущего лексического акцептора

/*^if(arrayOfAutomat.hasManyItems)^*/

//для каждого автомата и каждой группы слов обеспечим возможность выполнения действий (имена автоматов и групп слов в примечаниях)

//индексы групп слов, имена которых используются в грамматике, преобразуются в те значения, который присвоил им построитель синтаксического акцептора

//в действиях, в частности, может быть взведен флажок ignoreLastWord и изменены поля лексемы, установленные акцептором

                        switch(lexAcceptor->getIndex())

                        {

            /*^forEach(currentAutomat in arrayOfAutomat)^*/

                        case /*^=currentAutomat.index^*/:  

// Автомат:

/*^=currentAutomat.name^*/switch(Lexem.groupIndex)

                              {

                              case -1: //EOF

Lexem.groupIndex = /*^=EndOfFile.indexForGrammar^*/;break;/*^forEach(finalState in currentAutomat.finalStates)^*/

                              case /*^=finalState.index^*/: ///*^=finalState.groupName^*//*^if(finalState.wordNameUseInGrammar)^*/

Lexem.groupIndex = /*^=finalState.indexForGrammar^*/;/*^endIf^*/

/*^=finalState.action^*/break;/*^endFor^*/

                              }

                              break; /*^endFor^*/

                        }/*^endIf^*//*^if(arrayOfAutomat.hasOneItem)^*/

//для каждой группы слов обеспечим возможность выполнения действий (имена групп слов в примечаниях)

//индексы групп слов, имена которых используются в грамматике, преобразуются в те значения, который присвоил им построитель синтаксического акцептора

//в действиях, в частности, может быть взведен флажок ignoreLastWord и изменены поля лексемы, установленные акцептором

                        switch(Lexem.groupIndex)

{

                        case -1: //EOF

Lexem.groupIndex=/*^=EndOfFile.indexForGrammar^*/;break;/*^forEach(finalState in currentAutomat.finalStates)^*/

                        case /*^=finalState.index^*/: ///*^=finalState.groupName^*//*^if(finalState.wordNameUseInGrammar)^*/      Lexem.groupIndex=/*^=finalState.indexForGrammar^*/;/*^endIf^*/

                              /*^=finalState.action^*/break;/*^endFor^*/

                        }/*^endIf^*/

                  }

                  return Lexem;

            }

};

//end of Part_4  

Выводы

В ходе лабораторной работы 2 была изучена структура программных модулей, построенных ВебТрансЛабом. Также были изучены алгоритмы работы лексического акцептора для графового и табличного способа реализации КА, реализация вызова действий, определенных в лексических правилах и алгоритм работы формирователя лексем. Еще были изучены, те элементы языка шаблонов, которые используются для преобразования внутреннего представления конечного автомата в программную реализацию лексического анализатора.

Проведена сравнительная характеристика двух способов реализации конечных автоматов, и какой из них лучше выявлять не удалось, что, в общем логично.

Итогом успешного выполнения  лабораторной работы 2 можно считать две важные вещи -  доработана система регулярных выражений, и она успешно проверена на тестовом примере.