5. Проверил функционирование конечных автоматов, построенных ВебТрансЛабом:
-Подготовил тестовый пример:
define Z7Enter
{
integer t1one, integer t2two;
w4medod1(float e5rr, float e5rrr)
{
e5rr:= 0.32;
e5rrrr:=5.444;
when (e5rr/2==e5rrrr*2) then e5rrrr-e5rr; //metod1
else e5rrrr-e5rr;
}
w4medod2(inte e5rr, intege e5rrr)
{
for f7ff from 65 to 70 step 7
{
t1one:=e5rr,
t2two:=e5rrr;
}
}
w4medod3(char e5rr, char e5rrr, bool t777)
{
when (bool!=L_T) then with (e5rr-e5rrr)
{
?5:e5rrr:='o';
?4:e5rrr:='r';
}
}
m7main() //главная функция
{
get z7Enter x5xxx;
float a55,a77;
x5xxx.w4metod1(a55,a77);
integer b77;
integ b66;
x5xxx.w4metod2(b77,b66);
char c77,c88;bool h99;
x5xxx.w4metod3(c77,c66,h99);
drop x5xxx;
}
-Запустил каждый автомат на выполнение, протрассировать работу лексического акцептора в графовой и табличной реализации,
-Убедился в работоспособности автоматов двумя способами:
1. Построил автомат при помощи шаблона
lexAsGraphSyntAsManySA_to_cpp, отрыл его в пакете Microsoft Visual Studio 2008 и проверил мой тестовой пример. Программа выдало сообщение: All right, если в программу добавить строчку – ааапппррр – то будет выдано сообщение Error.
2. Построил автомат при помощи усовершенствованного шаблона lexAsGraphSyntAsOneSA_to_jsp. Усовершенствование нужно для вывода групп слов - ti.put(Lexem.groupIndex,Lexem.textOfWord). Также убедился в правильности тестового примера.
6. Изучил те элементы языка шаблонов, которые используются для преобразования внутреннего представления конечного автомата в программную реализацию лексического анализатора.
Для графого способа:
class lexAnalyzer
{/*^if(arrayOfAutomat.hasManyItems)^*/
//Part_4_1: мультиавтоматный ЛА
vector<fAutomat*> lexAcceptors; //массив лексических акцепторов
fAutomat* lexAcceptor; //текущий (активный) лексический акцептор
bool ignoreLastWord;
//флажок необходимости не возвращать (игнорировать) последнюю обнаруженную лексему
lexem Lexem; //текущая лексема
WTStack<fAutomat*> lexStk; //стек индексов лексических акцепторов
//Part_4_3: конструктор мультиавтоматного ЛА
public:
lexAnalyzer(textReader &rdr)
{
lexAcceptors.resize(/*^=arrayOfAutomat.count^*/);
faState *state;
//переменная для временного хранения состояния конечного автомата
//дальше идет создание автоматов, их состояний, выходящих из них дуг и запоминание всего этого в соответствующих местах
/*^forEach(currentAutomat in arrayOfAutomat)^*/lexAcceptors[/*^=currentAutomat.index^*/] = new fAutomat(/*^=currentAutomat.index^*/,/*^=currentAutomat.states.count^*/,rdr);
/*^forEach(currentState in currentAutomat.states)^*/
state = new faState(/*^=currentState.arcs.count^*/);/*^forEach(currentArc in currentState.arcs)^*/state->setArc(/*^=currentArc.stateTo^*/, string("/*^=currentArc.mark^*/"));
/*^endFor^*/
lexAcceptors[/*^=currentAutomat.index^*/]->setState(/*^=currentState.index^*/,state);
/*^endfor^*//*^endFor^*/
lexAcceptor = lexAcceptors[0];
//установим автомат с индексом 0 в качестве стартового лексического акцептора
lexStk.push(lexAcceptor); //и запомним это в стеке
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.