Синтаксичний аналіз. Спадний аналіз. Предиктивний аналізатор. Висхідний аналіз, страница 13

Тепер обчислимо goto(I0 , X) для різних значень X. Для X = S ми повинні замкнути пункт [S' S, $]. Ніяких інших пунктів у замиканні немає, оскільки точка в пункті знаходиться справа. Таким чином, множина пунктів має вигляд

I1 :   S' S', $ .

Для X = С замикаємо [S → CC, $]. Ми додаємо С-продукції з другим компонентом $ і після цього додати вже нічого. Тим самим одержуємо

I2 :   S → CC, $ ,

СсC, $,

Сd, $  .

Далі нехай Х= c, і замикається {[ С сC, c|d]}. Додаємо C-продукції з другим компонентом c|d, одержуючи

I3 :       С сC, c|d ,

С с C, c|d ,

Сd, c|d  .

І нарешті, для X=d знаходимо

I4:С d, c|d .

На цьому ми завершуємо розгляд gotoна множині I0. Для I1 нові множині не утворюються, але I2 має переходи за C, c і d. Для C знаходимо

            I5 :       С CC, $.

Для c розглядаємо замикання {[С сC, $]}, одержуючи

I6 :       С cC, $ ;

Сc C, $ ;

Сd, $  .

Продовжуючи розгляд функції goto для I2, знаходимо goto (12, d):

I7:С d, $  .

Переходячи до I3, знайдемо, що переходи з I3 по символах  с  і dявляють собою відповідно I3 та I4, а goto(I3,C)  

18:           С сC, c|d .

I4 і I5переходів не мають. Переходи з 16 по символах с і dявляють собою відповідно I6 та I7, а goto(16,C)

19:      С сC, $ .

Інші множини пунктів не мають переходів, і на цьому наша робота завершена. На рис. 4.7 показані знайдені десять множин пунктів з їх переходами.

Тепер наведемо правила, за допомогою яких на основі множин LR(1)-пунктів будуються функції actionі gotoLR(1)-аналізу. Функції представлені, як і раніше, у вигляді таблиці; відмінність полягає у значеннях записів.

Алгоритм 4.10 Побудова канонічної таблиці LR-аналізу

1 Побудуємо C = {10,11,..., 1n}, систему множин LR(1)-пунктів для G'.

Рисунок 4.7 - Діаграма переходів для граматики 4.6

2 Стан i синтаксичного аналізатора будується на основі множини 1i. Дії синтаксичного аналізу для стану i визначаються в такий спосіб:

а) якщо   α•aβ, b]Ii і   goto(Ii, а) = Ij ,   то   установимо   action[i, а] таким, що дорівнює “перенесення j”;  

б) якщо α, a]Ii,  А≠S', то визначимо action[i,a] як “згортання Aα”;

с) якщо [S'→S•, $]Ii, то установимо action[i,$] таким, що дорівнює “допуск”.

Якщо застосування цих правил приводить до конфлікту, граматика не є LR(1)-граматикою, і даний алгоритм до неї незастосовний.

3 Переходи   gotoдля   стану   i   визначаються   в   такий спосіб:   якщо goto(Ii, A) = Ij, то goto[i, А] =j.

4 Усі записи, не визначені правилами (2) і (3), задаються як “помилка”.

5  Початковий стан синтаксичного аналізатора являє собою стан, побудований з множини, що містить пункт [S'→S•, $].

Таблиця, побудована на основі функцій actionі gotoсинтаксичного аналізу, отриманих з використанням даного алгоритму, називається канонічною таблицею LR(1)-аналізу. LR-аналізатор, що використовує цю таблицю, називається канонічним LR(1)-аналізатором. Якщо функція actionсинтаксичного аналізу не має множинних записів, то дана граматика називається LR(1)-граматикою.

Таблиця 4.7

Стан

action

goto

    c            d            $

       S              C

0

1

2

3

4

5

6

7

8

9

    s3         s4

                              acc

   s6          s7                  

   s3          s4

   r3         r3

                             r1

   s6         s7

                             r3

   r2         r2

                             r2  

1  2

5

                  8

                  9              

Таблиця 4.7 являє  собою таблицю синтаксичного аналізу для граматики (4.6). Продукціями 1, 2  і  3 є відповідно S→CC, С сCіС d.

Будь-яка SLR(1)-граматика є LR(1)-граматикою, але для SLR(1)-граматики канонічний LR-аналізатор може мати більше станів, ніж SLR-аналізатор для тієї самої граматики.

Граматика з попереднього прикладу є SLR-граматикою; SLR-аналізатор для неї має сім станів, а в даній таблиці їх десять.

Завдання до розділу 4

1 Побудувати предиктивний синтаксичний аналізатор для граматики

bexpr → bexpr or bterm | bterm

bterm → bterm  and  bfactor | bfactor

bfactor not bfactor  | (bexpr) | true | false.

2 Побудувати таблицю SLR-аналізу для граматики

E→E+T | T ;

T→TF | F;

F→F* | a | b .

3  Побудувати таблицю SLR-аналізу для граматики із завдання 2.