Page 37 - 4761
P. 37

Кінцевий автомат має  наступні умови працездатності :
                         -      має деякий початковий стан з якого починається робота;
                         -      має скінчену кількість станів.
                         Для кожного стану не може бути одночасно справедливими кілька умов переходу.
                  Тобто  автомат  повинен  бути  детермінованим  (кінцевий  автомат  не  може  перейти
                  одночасно в кілька станів і не може мати кілька таких умов переходу)
                         Приклад  3.2.  Розробити  алгоритм  програми  кінцевого  автомата,  що  виключає  з
                  рядків коментарі виду  /*…..*/.
                         Спочатку необхідно визначити стани кінцевого автомату:
                         0-  звичайний текст;
                         1-  виявлено термінальний символ;
                         2-  виявлено початок коментаря  '/*';
                         3-  в коментарі виявлено  ' * '.
                         Таким чином програма що реалізує поданий алгоритм функціонування кінцевого
                  автомату має наступний вигляд:

                         void f(char*  in[],char out [] )
                         {
                         int i,s,j;
                         for(i=0,s=0,j=0; in[i]!=0;i++)
                         switch(s)
                         {
                         case 0:if(in[i]!='/') out [j++]=in[i];
                              else s=1;break;
                         case 1:if(in[i]!='*') out {[j++]=in[i-1];
                                out [j++]=in[i]; s=0;}
                                else s=2; break;
                         case 2: if(in[i] =='*')
                                else s=3; break;
                         case 3: if(in[i] =='/')
                                else s=0; break;}
                         }
                         Наведена  програма  реалізовується  на  основі  циклу,  кожен  крок  якого  аналізує
                  черговий символ із вхідного рядка. Аналізується тільки черговий символ без врахування
                  попередніх  і наступних .Фактично  черговий символ  відіграє роль вхідного сигналу за
                  яким кінцевий автомат переходить з одного стану в інший . Змінна s представляє собою
                  поточний стан кінець автомату на основі мультиумовного оператора switch відбувається
                  переключеня  (зміна)  за  всіма    можливими  значеннями  (станами)  кінцевого  автомату.  В
                  кожному з кінцевих станів (при аналізі поточного символу) реалізується логіка переходу
                  на основі на налізу вхідного сигналу  згідно чого виконується відповідна дія. Наприклад
                  ,якщо  кінцевий  автомат  знаходиться  в  стані    1  (виявлено  символ  «  /  »  )  –  можливий
                  початок  коментаря  ,то  перевірка  поточного  символа  відбувається  на  наявність  символа
                  «*». Якщо це так, то автомат переходить в стан 2 (вхід в  середину коментаря). Якщо ні,то
                  у  всіх  рядок  переписується  попередній  «  /  »  і  поточний    символ  ,а    кінцевий  автомат
                  скидається в нульовий стан.

                         Діаграма станів і переходів при лексичному аналізі
                         Найбільш  зручно  (для  розуміння  суті  роботи  кінцевого  автомату)  представляти
                  переходи  з одного  стану  в  інший   у  вигляді  діаграми  станів  переходів.  Кожному стану
                  автомату відповідає кожна дія (поведінка), яку потрібно виконувати, тобто якщо автомат
                  розпізнає константу як послідовність цифр, то в ньому необхідно передбачити стан, який
                  можна назвати як «очікування наступної цифри». Переключення автомату з одного стану


                                                                35
   32   33   34   35   36   37   38   39   40   41   42