Page 39 - 4761
P. 39

3- інші символи, кінець ідентифікатора;
                         4 – інший символ, кінець константи.





















                        Рисунок 3.3 – Діаграма станів-переходів КА при визначення константи та
                                                        ідентифікатора

                         Реалізація лексичного аналізатора на основі діаграми станів переходів є найбільш
                  простим  і  традиційним  способом  побудови  таких  програм.  Існує  також  інший  варіант
                  реалізації кінцевого автомату для лексичного аналізу, як і для попереднього випадку тут
                  використовується  змінна,  що  визначає  стан  кінцевого  автомату,  а    вхідні  символи
                  розбивають  на  множини  класи,  які  не  пересікаються.  В  даному  випадку  класи
                  вибираються  таким  чином,  щоб  забезпечити  однозначне  переключення  кінцевого
                  автомата  в процесі аналізу уже не символу, а класу до якого він відноситься ,наприклад,
                  який  лексичний  аналізатор  повинен  розрізняти  коментарі,  ідентифікатори,    вісімкові,
                  десяткові і шістнадцяткові символьні константи, та всю множину  можливих символів (як
                  один з варіантів) можна розділити на наступні класи:
                         -      0 – клас 1
                         -      1…7 – клас 2
                         -      8…9- клас 3
                         -      букви  A….F, a….f – клас 4
                         -      буква  x - клас 5
                         -      всі інші букви клас – клас 6
                         -      символ « / »-  клас 7
                         -      символ « * »- клас 8
                         -      символ  «” »- клас 9
                         -      всі інші символи клас 10
                         Таким  чином  формуються  відповідні  класи  символів  на  основі    яких,  кінцевий
                  автомат забезпечує реалізацію різної реакції (переліку операцій), при чому для визначення
                  класу, до якого належить поточний символ, створюється поточна функція, яка для даного
                  прикладу має наступний вигляд:

                   void class(char c)
                   {
                   swich (c)
                   {
                   case 0:"*":return(7);
                   case 1:""":return(8);
                   case 2:"/":return(6);
                   case 3:"0":return(0);
                   case "8": return(2);

                                                                37
   34   35   36   37   38   39   40   41   42   43   44