Зміст:
Синтаксичний аналіз
Для визначення синтаксичної компоненти мови програмування використовують контекстно-вільні граматики (КС-граматики). На відміну від скінченно-автоматних граматик потужність класу КС-граматик достатня, щоб визначити майже всі так звані синтаксичні властивості мов програмування. Якщо цього недостатньо, то розглядають деякі спрощення у граматиках типу 2 або параметричні КC-граматики.
Звичайно, із синтаксичною компонентою мови програмування пов’язана семантична компонента. Тоді, якщо ми говоримо про семантику мови програмування, ми вимагаємо семантичної однозначності для кожної вірно написаної програми. За аналогією з семантикою, при описі синтаксичної компоненти мови програмування необхідно користуватися однозначними граматиками.
Граматика називається неоднозначною, якщо існує декілька варіантів виводу в .
Приклад. Розглянемо таку граматику з двома правилами у схемі : , і . Покажемо, що для ланцюжка існує щонайменше два варіанти виводу:
-
.
-
.
Стратегії виведення
В теорії граматик розглядається декілька стратегій виведення ланцюжка в . Визначимо дві стратегії, які будуть використані в подальшому.
Лівостороння стратегія виводу ланцюжка в — це послідовність кроків безпосереднього виводу, при якій на кожному кроку до уваги береться перший зліва направо нетермінал.
Правостороння стратегія виводу в протилежна лівосторонній стратегії.
З виводом в пов’язане синтаксичне дерево, яке визначає синтаксичну структуру програми.
Синтаксичні дерева
Синтаксичне дерево виведення в — це впорядковане дерево, корінь котрого позначено аксіомою, в проміжних вершинах знаходяться нетермінали, а на кроні — елементи з . Побудова синтаксичного дерева виведення в виконується покроково з урахуванням стратегії виводу в .
Алгоритм [побудови синтаксичного дерева ланцюжка в граматиці урахуванням лівосторонньої стратегії виводу].
-
Будуємо корінь дерева та позначимо його аксіомою .
-
В схемі граматики візьмемо правило виду , де і побудуємо дерево висоти 1:
-
На кроні дерева, побудованого на попередньому кроці, візьмемо перший зліва направо нетермінал. Нехай це буде . Тоді в схемі виберемо правило виду , де і побудуємо наступне дерево:
Цей крок виконується доки на кроні дерева є елементи з .
Зауважимо очевидні факти, що випливають з побудови синтаксичного дерева:
-
крона дерева, зображеного на попередньому малюнку наступна: ;
-
ланцюжок з крони — термінальний ланцюжок;
-
для однозначної граматики існує лише одне синтаксичне дерево виводу в .
Власне аналіз
Будемо говорити, що ланцюжок , побудований на основі граматики проаналізований, якщо відоме одне з його дерев виводу.
Зафіксуємо послідовність номерів правил, які були використані під час побудови синтаксичного дерева виводу в з урахуванням стратегії виводу.
Лівостороннім аналізом ланцюжка будемо називати послідовність номерів правил, які були використані при лівосторонньому виводі в .
Приклад: Для граматики зі схемою :
і для ланцюжка побудуємо лівосторонній аналіз :
Виведення має вигляд:
З наведеного вище виводу ланцюжка лівосторонній аналіз буде: , а синтаксичне дерево виводу наступне:
Синтез дерева за аналізом
Нехай — лівосторонній аналіз ланцюжка . Знаючи досить легко побудувати (відтворити) синтаксичне дерево. Відтворення (синтез) синтаксичного дерева можна виконати, скориставшись однією з стратегій синтаксичного аналізу:
-
стратегія “зверху донизу”;
-
стратегія “знизу догори”.
Стратегія синтаксичного аналізу “зверху донизу” — це побудова синтаксичного дерева крок за кроком починаючи від кореня до крони.
Алгоритм [синтезу синтаксичного дерева на основі лівостороннього аналізу ланцюжка ].
-
Побудуємо корінь дерева та позначимо його аксіомою . Тоді, якщо , то
-
Побудуємо дерево висоти один, взявши зі схеми правило з номером виду :
-
На кроні дерева, отриманого на попередньому кроку, візьмемо перший зліва направо нетермінал (нехай це буде нетермінал ) та правило з номером вигляду: та побудуємо нове дерево:
Даний пункт виконувати доти, доки не переглянемо всі елементи з .
Проблеми стратегії “зверху донизу”
Сформулюємо декілька проблему для стратегії аналізу “зверху донизу”:
У загальному випадку у класі КС-граматик існує проблема неоднозначності (недетермінізму) виводу . Як приклад можемо розглянути граматику з “циклами”. Це така граматика, у якої в схемі існує така послідовність правил за участю нетермінала , що: і , де — будь-який нетермінал граматики .
Як наслідок, граматики з ліворекурсивним нетерміналом для стратегії аналізу “зверху донизу” недопустимі.
Зауважимо, що існують підкласи класу КС-граматик, які природно забезпечують стратегію аналізу “зверху донизу”. Один з таких підкласів — це -граматики, які забезпечують синтаксичний аналіз ланцюжка за час , де , та при цьому аналіз є однозначним.
Контрольні запитання
-
Які граматики називаються однозначними?
-
Які дві стратегії виведення ви знаєте?
-
Що таке синтаксичне дерево виведення?
-
Що таке лівосторонній аналіз ланцюжка?
-
Що таке синтез дерева за аналізом?
-
Які дві стратегії синтезу дерева за аналізом ви знаєте?
-
Що таке граматика з циклами і які проблеми вона створює для стратегії “згори донизу”?
-
Який підклас КС-граматик забезпечує стратегію аналізу “зверху донизу”?
(традиційні відповіді можна переглянути у коментарях у вихідному коді цієї сторінки)