Page 47 - 4761
P. 47

Матрицю  операторно  передування  будують  аналогічно  матриці  простого
                  передування.  Основна  відмінність  –  відсутність  нетермінальних  символів  в  структурі
                  матриці.
                         Оскільки,  алгоритм  розбору  вхідного  ланцюга  ігнорує  на  термінальні  символи,
                  перетворимо правила заданої граматики таким чином, щоб залишити в ній тільки один
                  нетермінальний символ.
                         Приведена граматика буде мати вигляд:
                                G({+,-,*,/,a,b}, {S,T,E}, P, S)
                                P:
                             S       S+S | S-S | S (правила 1, 2, 3)
                             T      S*S | S/S |S   (правила 4, 5, 6)
                             E      (S) | a  |  b      (правила 7, 8, 9)
                         Таке  перетворення  не  призводить  до  створення  еквівалентної  граматики  і
                  виконується  тільки  для  спрощення  алгоритму.  Отримана  в  результаті  перетворення
                  граматика  не  є  однозначною,  але  в  алгоритм  розпізнавання  уже  були    закладені  всі
                  необхідні дані про порядок застосування правил при побудові матриці передування.
                         Використовуючи  матрицю  ОП,  запишемо  послідовність  розбору  для  ланцюга
                  a+a*b.

                      15. {a+a*b   к ;   п }  п
                      16. {+ a*b   к ;   п a}   з
                      17. {+a*b   к ;   п S; 8}   п
                      18. {a*b   к ;   п S+; 8}   п
                      19. {*b   к ;   п S+a; 8}   з
                      20. {*b   к ;   п S+S; 8; 8}   п
                      21. {b   к ;   п S+S*; 8; 8}   п
                      22. {  к ;   п S+S*b; 8; 8}   з
                      23. {  к ;   п S+S*S; 8; 8; 9}   з
                      24. {  к ;   п S+S; 8; 8; 9; 4}   з
                      25. {  к ;   п S; 8; 8; 9; 4; 1}.

                         Ланцюг має вигляд:
                         S   S+S   S+S+S   S+S+b    S+a*b   a+a*b.

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

                         3.9 Семантичний аналіз. Призначення семантичного аналізу

                         Всі  мови  програмування  не  є  КВ-мовами.  Тому  повний  розбір  вхідної  програми
                  компілятор  не  може  виконати  в  межах  КВ-мов  за  допомогою  КВ-граматик  та  МП-
                  автоматів.
                         Повний  розпізнавач  для  більшості  мов  програмування  може  бути  побудований в
                  рамках КЗ-мов. Оскільки, розпізнавач КЗ-мов має експоненціальну залежність потрібних

                                                                45
   42   43   44   45   46   47   48   49   50   51   52