{
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 можно считать две важные вещи - доработана система регулярных выражений, и она успешно проверена на тестовом примере.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.