Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
8_Vsi_razom.doc
Скачиваний:
7
Добавлен:
10.09.2019
Размер:
347.65 Кб
Скачать

23.Контекстно-выльны граматики.

Контекстно-вільною, або КВ-граматикою, називається граматика, в якій ліві частини всіх продукцій є нетерміналами. Зміст терміну "контекстно-вільна" полягає в тім, що застосування продукції A w до ланцюжка uAv не залежить, тобто є вільним від сусідніх з A символів, які утворюють контекст uv.

Зазначимо, що БНФ вигляду A::=w цілком аналогічна продукції A w. Отже, сукупності БНФ є просто іншою формою КВ-граматик.

Контекстно-вільною мовою (КВ-мовою) називається мова, що може бути задана КВ-граматикою.

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

24. Синтаксично-керований переклад

У нас є правила S→E; E→T; E→E+T; T→F; T→T*F; F→(a); F→(E)

E-вираз T-термін F-формула a-ідентифікатор

Перебирати варіанти будемо доти, поки не вийде фраза, що складається лише з термінальних символів – це так званий лівий вивід. Наприклад: а+а*а

S→E→E+T→E+T*F→T+T*F→F+F*F→a+a*a

Щоб сформувати використаємо прийом: застосування кожного правила граматики буде викликати виконання тої чи іншої процедури.

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

E→E+T E=E+T

Правило

Елемент перекладу

E→E+T

E=ET+

E→T

T=T

T→T*F

T=TF*

T→F

T=F

F→(E)

F=E

F→a

F=a

Визначимо вихід згідно схеми перекладу, що відповідає ланцюжку а+а*а. Спочатку за правилами схеми перекладу знайдемо вивід ланцюжка а*а, починаючи з S, потім визначимо послідовність пар множників.

(E,E) => (E+T,ET+) => (T+T,TT+) => (F+T,FT+) => (a+T,At+) =>(a+T*F,aTF*+) =>

(a+F*F,aFF*+) => (a+a*F,aaf*+) =>(a+a*a,aaa*+)

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

Застосуємо наступний метод: застосування певного правила викликає дію, ці дії називаються семантичними процедурами

Розглянемо це на прикладі, але спочатку запишемо більш складну граматику.

Z::=E

E::=T|E+T|E-T|-T

T::=F|T*F|T/F

F::=a|(E)

N

Правило

Семант-програма

1

Z::=E

нема

2

E::=T

нема

3

E::=E+T

Push(‘*’)

4

E::=E-T

Push(‘-’)

5

E::=-T

Push(‘@’)

6

T::=F

нема

7

T::=T*F

Push(‘*’)

8

T::=T/F

Push(‘/’)

9

T::=a

Push(a)

10

F::=(a)

нема

Push(‘…’) – здійснює додавання в кінець вихідного ланцюжка відповідного символа.

Потрібно враховувати наступне:

  • правило 1 застосовувати то, коли R= #

  • правила 2,3,4 застосовуються тоді, коли в R міститься №, +, -, ).

Таким чином для організації розбору без певного перебору нам потрібно буде стек S і куди заносимо розпізнаний вираз і змінна R – де зберігається символ, що зчитуємо.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]