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

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);     //и запомним это в стеке