knu/csc/appl-math/c3s2/sys-prog

синтез і аналіз мовних процесорів

Зміст:

Синтаксичний аналіз

Для визначення синтаксичної компоненти мови програмування використовують контекстно-вільні граматики (КС-граматики). На відміну від скінченно-автоматних граматик потужність класу КС-граматик достатня, щоб визначити майже всі так звані синтаксичні властивості мов програмування. Якщо цього недостатньо, то розглядають деякі спрощення у граматиках типу 2 або параметричні КC-граматики.

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

Граматика називається неоднозначною, якщо існує декілька варіантів виводу в .

Приклад. Розглянемо таку граматику з двома правилами у схемі : , і . Покажемо, що для ланцюжка існує щонайменше два варіанти виводу:

  1. .

  2. .

Стратегії виведення

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

Лівостороння стратегія виводу ланцюжка в — це послідовність кроків безпосереднього виводу, при якій на кожному кроку до уваги береться перший зліва направо нетермінал.

Правостороння стратегія виводу в протилежна лівосторонній стратегії.

З виводом в пов’язане синтаксичне дерево, яке визначає синтаксичну структуру програми.

Синтаксичні дерева

Синтаксичне дерево виведення в — це впорядковане дерево, корінь котрого позначено аксіомою, в проміжних вершинах знаходяться нетермінали, а на кроні — елементи з . Побудова синтаксичного дерева виведення в виконується покроково з урахуванням стратегії виводу в .

Алгоритм [побудови синтаксичного дерева ланцюжка в граматиці урахуванням лівосторонньої стратегії виводу].

  1. Будуємо корінь дерева та позначимо його аксіомою .

  2. В схемі граматики візьмемо правило виду , де і побудуємо дерево висоти 1:

    img-10

  3. На кроні дерева, побудованого на попередньому кроці, візьмемо перший зліва направо нетермінал. Нехай це буде . Тоді в схемі виберемо правило виду , де і побудуємо наступне дерево:

    img-11

    Цей крок виконується доки на кроні дерева є елементи з .

Зауважимо очевидні факти, що випливають з побудови синтаксичного дерева:

Власне аналіз

Будемо говорити, що ланцюжок , побудований на основі граматики проаналізований, якщо відоме одне з його дерев виводу.

Зафіксуємо послідовність номерів правил, які були використані під час побудови синтаксичного дерева виводу в з урахуванням стратегії виводу.

Лівостороннім аналізом ланцюжка будемо називати послідовність номерів правил, які були використані при лівосторонньому виводі в .

Приклад: Для граматики зі схемою :

і для ланцюжка побудуємо лівосторонній аналіз :

Виведення має вигляд:

З наведеного вище виводу ланцюжка лівосторонній аналіз буде: , а синтаксичне дерево виводу наступне:

img-12

Синтез дерева за аналізом

Нехай — лівосторонній аналіз ланцюжка . Знаючи досить легко побудувати (відтворити) синтаксичне дерево. Відтворення (синтез) синтаксичного дерева можна виконати, скориставшись однією з стратегій синтаксичного аналізу:

Стратегія синтаксичного аналізу “зверху донизу” — це побудова синтаксичного дерева крок за кроком починаючи від кореня до крони.

Алгоритм [синтезу синтаксичного дерева на основі лівостороннього аналізу ланцюжка ].

  1. Побудуємо корінь дерева та позначимо його аксіомою . Тоді, якщо , то

  2. Побудуємо дерево висоти один, взявши зі схеми правило з номером виду :

    img-13

  3. На кроні дерева, отриманого на попередньому кроку, візьмемо перший зліва направо нетермінал (нехай це буде нетермінал ) та правило з номером вигляду: та побудуємо нове дерево:

    img-14

    Даний пункт виконувати доти, доки не переглянемо всі елементи з .

Проблеми стратегії “зверху донизу”

Сформулюємо декілька проблему для стратегії аналізу “зверху донизу”:

У загальному випадку у класі КС-граматик існує проблема неоднозначності (недетермінізму) виводу . Як приклад можемо розглянути граматику з “циклами”. Це така граматика, у якої в схемі існує така послідовність правил за участю нетермінала , що: і , де — будь-який нетермінал граматики .

Як наслідок, граматики з ліворекурсивним нетерміналом для стратегії аналізу “зверху донизу” недопустимі.

Зауважимо, що існують підкласи класу КС-граматик, які природно забезпечують стратегію аналізу “зверху донизу”. Один з таких підкласів — це -граматики, які забезпечують синтаксичний аналіз ланцюжка за час , де , та при цьому аналіз є однозначним.

Контрольні запитання

  1. Які граматики називаються однозначними?

  2. Які дві стратегії виведення ви знаєте?

  3. Що таке синтаксичне дерево виведення?

  4. Що таке лівосторонній аналіз ланцюжка?

  5. Що таке синтез дерева за аналізом?

  6. Які дві стратегії синтезу дерева за аналізом ви знаєте?

  7. Що таке граматика з циклами і які проблеми вона створює для стратегії “згори донизу”?

  8. Який підклас КС-граматик забезпечує стратегію аналізу “зверху донизу”?

(традиційні відповіді можна переглянути у коментарях у вихідному коді цієї сторінки)

Назад до лекцій

Назад на головну