Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по СПО [укр. язык].DOC
Скачиваний:
21
Добавлен:
02.05.2014
Размер:
526.85 Кб
Скачать

Лекція №4. Синтаксичний розбір за допомогою lr(1)-граматики.

Цей метод розбору знизу вверх застосовується до широкого класу мов та граматик. Синтаксичний аналізатор, який працює за принципом “знизу вверх”, зводить речення мови до початкового символу шляхом послідовного застосування правил граматики. Розглянемо, наприклад, мову, яка генерується правилами:

Таблиця розбору.

стан

S

IDLIST

ID

real

,

a,b,c,d

#

1

End

S2

2

S5

S4

S3

3

R4

R4

4

R3

R3

5

S6

R1

6

S7

7

R2

S3

R2

Si - елементи зсуву, означають, що в стек символів занесемо заголовок колонки, в стек станів – i, якщо на вході термінал – він приймається та перехід в стан i.

Ri – виконується приведення за допомогою правила i. Із двох стеків виймаються стільки елементів скільки елементів в правій частині i-го правила. Поточним елементом стає нетермінал в лівій частині та виконується перехід в стан з вершини стеку станів.

Речення

real a,b,c

належить цій мові та може бути розібрана знизу вверх наступним чином:

Розшифруємо дії, які були виконані :

  1. Вхідний символ – real, із елементу таблиці розбору (1, real) зсув в стан 2;

  2. Вхідний символ – a, зсув в стан 3;

  3. Вхідний символ - <,>, скористаємося правилом 4;

  4. Вхідний символ – ID, зсув в стан 4;

  5. Вхідний символ - <,>, скористаємося правилом 3;

  6. Вхідний символ – IDLIST, зсув в стан 5;

  7. Вхідний символ - <,>, зсув в стан 6;

  8. Вхідний символ – b, зсув в стан 3;

  9. Вхідний символ - <,>, скористаємося правилом 4;

  10. Вхідний символ – ID, зсув в стан 7;

  11. Вхідний символ - <,>, приведення за допомогою правила 2;

  12. Вхідний символ – IDLIST, зсув в стан 5;

  13. Вхідний символ - <,>, зсув в стан 6;

  14. Вхідний символ – с, зсув в стан 3;

  15. Вхідний символ - <#>, скористаємося правилом 4;

  16. Вхідний символ – ID, зсув в стан 7;

  17. Вхідний символ - <#>, скористаємося правилом 2;

  18. Вхідний символ – IDLIST, зсув в стан 5;

  19. Вхідний символ - <#>, приведення за допомогою правила 1;

  20. Вхідний символ – S, тобто END.

Розбір успішно закінчено. Зазначимо, що після зсуву вхідним символом завжди є наступний символ, а після приведення – символ, до якого тільки що привела дія.

Лекція №5. Формування lr-таблиці розбору.

Щоб побудувати LR-таблицю розбору необхідно:

  1. Визначити множину станів (їх 7);

  2. Ввести поняття конфігурації: (i,j) – номер позиції в правій частині правила.

Стани в таблиці розбору приблизно відповідають конфігураціям в граматиці, з тією лише різницею, що конфігурації, які не відрізняються для аналізатора, є одним і тим же станом. Розпочавши з конфігурації (1,0) і послідовно виконуючи операцію замикання та утворення спадкоємця до тих пір, доки всі конфігурації не будуть включені в який-небудь стан. Там, де ряд конфігурацій міститься в одному замиканні, кожна із них буде відповідати одному станові. Нова конфігурація, яку отримуємо за допомогою операції утворення спадкоємця, називається базовою. Якщо за базовою конфігурацією, наступний нетермінал, тоді всі конфігурації, які відповідають точці зліва віл кожної правої частини правила для даного нетермінала (і далі рекурсивно), сконцентруються в замиканні цієї базової конфігурації. Так, сім станів можна описати наступним чином:

Стан

База

Замикання

1

(1,0)

(1,0)

2

(1,1)

(1,1) (2,0) (3,0) (4,0)

3

(4,1)

(4,1)

4

(3,1)

(3,1)

5

(1,2) (2,1)

(2,1) (1,2)

6

(2,2)

(2,2) (4,0)

7

(2,3)

(2,3)

В особливому випадку LR(0)-граматики отримаємо таблицю:

S

IDLIST

ID

real

a,b,c,d

,

#

1

S2

2

S5

S4

S3

3

R4

R4

R4

R4

R4

R4

R4

4

R3

R3

R3

R3

R3

R3

R3

5

R1

R1

R1

R1

R1

R1

S6

6

S7

S3

7

R2

R2

R2

R2

R2

R2

R2

Для всіх кінцевих станів у всьому рядку можемо проставити відповідні приведення. Якщо вдається всі рядки вдало заповнити символами приведення для кінцевого стану всіх правил, тоді побудова таблиці розбору є закінченою і дана граматика є LR(0)-граматикою, а якщо ні – виконується процедура побудови SLR(1)-граматики. Аналогічно будується таблиця зсувів, а для правил приведення беремо один символ слідування.

S

IDLIST

ID

real

a,b,c,d

,

#

1

S2

2

S5

S4

S3

3

R4

R4

4

R3

R3

5

S6

R1

6

S7

S3

7

R2

R2

LALR(1)-граматика (LR(1)-граматика з попереднім оглядом символів). Таблиця розбору має ту ж кількість станів, але множина символів слідування в ній зважують на лівий контекст. Маємо :

Стан

Конфігурація

Символи слідування

1

(1,0)

{#}

2

(1,1)

{a,b,c,d}

(2,0)

{a,b,c,d}

(3,0)

{a,b,c,d}

(4,0)

{a,b,c,d}

3

(4,1)

{, #}

4

(3,1)

{, #}

5

(2,1)

{,}

(1,2)

{#}

6

(2,2)

{a,b,c,d}

(4,0)

{a,b,c,d}

7

(2,3)

{, #}

Потім по описаним раніше правилам будується таблиця розбору LALR(1)-граматики. Якщо не вдалося побудувати LALR(1)-таблицю розбору, тоді застосовується, якщо можливо, метод LR(1)-таблиці розбору. Описаний алгоритм залишається постійним незалежно від того, яка граматика розглядається: LR(0), SLR(1), LALR(1), LR(1). Алгоритм побудови таблиці розбору стає складнішим по мірі ускладнення (універсальності) граматики.

Дамо порівняльну характеристику для LL(1) та LR(1)-розбору:

  1. Об’єм пам’яті для таблиці розбору по методу LR(1) на порядок більший від об’єму для LL(1) методу.

  2. LL(1) - аналізатор на 10-20% швидше діє ніж LR(1)-аналізатор.

  3. З технологічної точки зору LL(1)-таблиці будуються краще.

Соседние файлы в предмете Системное программное обеспечение