{% include mathjax %}
Зміст:
Для визначення синтаксичної компоненти мови програмування використовують контекстно-вільні граматики (КС-граматики). На відміну від скінченно-автоматних граматик потужність класу КС-граматик достатня, щоб визначити майже всі так звані синтаксичні властивості мов програмування. Якщо цього недостатньо, то розглядають деякі спрощення у граматиках типу 2 або параметричні КC-граматики.
Звичайно, із синтаксичною компонентою мови програмування пов'язана семантична компонента. Тоді, якщо ми говоримо про семантику мови програмування, ми вимагаємо семантичної однозначності для кожної вірно написаної програми. За аналогією з семантикою, при описі синтаксичної компоненти мови програмування необхідно користуватися однозначними граматиками.
Граматика
Приклад. Розглянемо таку граматику
-
$$S \Rightarrow S + S \Rightarrow S + S + S \Rightarrow a + S + S \Rightarrow a + a + S \Rightarrow a + a + a$$ . -
$$S \Rightarrow S + S \Rightarrow a + S \Rightarrow a + S + S \Rightarrow a + a + S \Rightarrow a + a + a$$ .
В теорії граматик розглядається декілька стратегій виведення ланцюжка
Лівостороння стратегія виводу ланцюжка
Правостороння стратегія виводу
З виводом
Синтаксичне дерево виведення
Алгоритм [побудови синтаксичного дерева ланцюжка
-
Будуємо корінь дерева та позначимо його аксіомою
$$S$$ . -
В схемі
$$P$$ граматики$$G$$ візьмемо правило виду$$S \Rightarrow \alpha_1 \alpha_2 \ldots \alpha_p$$ , де$$\alpha_i \in N \cup \Sigma \cup {\varepsilon} $$ і побудуємо дерево висоти 1: -
На кроні дерева, побудованого на попередньому кроці, візьмемо перший зліва направо нетермінал. Нехай це буде
$$\alpha_i$$ . Тоді в схемі$$P$$ виберемо правило виду$$\alpha_i \Rightarrow \beta_1 \beta_2 \ldots \beta_l$$ , де$$\beta_i \in N \cup \Sigma \cup {\varepsilon}$$ і побудуємо наступне дерево:Цей крок виконується доки на кроні дерева є елементи з
$$N$$ .
Зауважимо очевидні факти, що випливають з побудови синтаксичного дерева:
-
крона дерева, зображеного на попередньому малюнку наступна:
$$\alpha_1 \alpha_2 \ldots \alpha_{i - 1} \beta_1 \beta_2 \ldots \beta_l \alpha_{i + 1} \ldots \alpha_p$$ ; -
ланцюжок
$$\alpha_1 \alpha_2 \ldots \alpha_{i - 1} \in \Sigma^\star$$ з крони — термінальний ланцюжок; -
для однозначної граматики
$$G$$ існує лише одне синтаксичне дерево виводу$$\omega$$ в$$G$$ .
Будемо говорити, що ланцюжок
Зафіксуємо послідовність номерів правил, які були використані під час побудови синтаксичного дерева виводу
Лівостороннім аналізом
Приклад: Для граматики
і для ланцюжка
Виведення має вигляд:
З наведеного вище виводу ланцюжка
Нехай
-
стратегія "зверху донизу";
-
стратегія "знизу догори".
Стратегія синтаксичного аналізу "зверху донизу" — це побудова синтаксичного дерева крок за кроком починаючи від кореня до крони.
Алгоритм [синтезу синтаксичного дерева на основі лівостороннього аналізу
-
Побудуємо корінь дерева та позначимо його аксіомою
$$S$$ . Тоді, якщо$$\pi = (p_1, p_2, \ldots, p_m)$$ , то -
Побудуємо дерево висоти один, взявши зі схеми
$$P$$ правило з номером$$p_1$$ виду$$S \Rightarrow \alpha_1 \alpha_2 \ldots \alpha_p$$ : -
На кроні дерева, отриманого на попередньому кроку, візьмемо перший зліва направо нетермінал (нехай це буде нетермінал
$$\alpha_i$$ ) та правило з номером$$p_j$$ вигляду:$$\alpha_i \Rightarrow \beta_1 \beta_2 \ldots \beta_l$$ та побудуємо нове дерево:Даний пункт виконувати доти, доки не переглянемо всі елементи з
$$\pi$$ .
Сформулюємо декілька проблему для стратегії аналізу "зверху донизу":
У загальному випадку у класі КС-граматик існує проблема неоднозначності (недетермінізму) виводу
Як наслідок, граматики з ліворекурсивним нетерміналом для стратегії аналізу "зверху донизу" недопустимі.
Зауважимо, що існують підкласи класу КС-граматик, які природно забезпечують стратегію аналізу "зверху донизу". Один з таких підкласів — це
-
Які граматики називаються однозначними?
-
Які дві стратегії виведення ви знаєте?
-
Що таке синтаксичне дерево виведення?
-
Що таке лівосторонній аналіз ланцюжка?
-
Що таке синтез дерева за аналізом?
-
Які дві стратегії синтезу дерева за аналізом ви знаєте?
-
Що таке граматика з циклами і які проблеми вона створює для стратегії "згори донизу"?
-
Який підклас КС-граматик забезпечує стратегію аналізу "зверху донизу"?
(традиційні відповіді можна переглянути у коментарях у вихідному коді цієї сторінки)