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

5. Методи синтаксичного ааналізу

5.1. Спадний аналіз

У цьому пункті розглядаються основні ідеї спадного розбору й показується, як побудувати ефективний спадний синтаксичний аналізатор без відкоту, називаний предиктивнм синтаксичним аналізатором. Буде визначимо клас граматик LL(1), на основі яких ці аналізатори можуть будуватися автоматично. Крім формалізації предиктивнх синтаксичних аналізаторів розглядаються нерекурсивні предиктивні синтаксичні аналізатори. Висхідні синтаксичні аналізатори будуть розглянуті в пункті 5.2.

5.1.1 Аналіз методом рекурсивного спуска

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

Нижче наведений приклад, у якому відкат необхідний. Тут же запропонований спосіб відстеження вхідного потоку при відкаті.

Приклад 5.1. Розглянемо граматику

S ::= cAd

А ::= abа

і вхідний рядок ‘w = cad. При спадній побудові дерева розбору для цього рядка ми спочатку створюємо дерево, що складається з одного вузла, позначеного як S. Покажчик входу вказує на c, перший символ рядка w. Тепер скористаємося першою продукцією для S, щоб одержати дерево, показане на рис. 5.1а.

Рис. 5.1. Кроки спадного розбору

Крайнє зліва листя, c, відповідає першому символу w, так що перемістимо покажчик входу до а, другому символу рядка w, і розглянемо наступне листя дерева, позначене А. Тепер можна скористатися для А першою альтернативою й одержати дерево, зображене на рис. 5.1б. Нами виявлена відповідність зчитаного символу а листю дерева, і ми переходимо до наступного символу – d. Однак d не відповідає листю дерева b, а виходить, ми повинні повернутися до А задля того, щоб вибрати нову альтернативу для роботи.

Повертаючись до А, ми повинні повернути покажчик входу в позицію 2, у якій він був, коли ми вперше прийшли до розкриття А. Це означає, що процедура для А повинна зберігати покажчик входа в локальній змінній. При розгляді другої альтернативи для А ми получаем дерево, показане на рис. 5.1в. Листя а відповідає другому символу w, а листя d - третьому. Оскільки в цей момент нами побудоване дерево розбору для w, ми завершуємо роботу й повідомляємо про успішне завершення розбору.

Ліворекурсивна граматика може викликати зациклення синтаксичного аналізатора, що працює методом рекурсивного спуска, навіть із відкатами (при розборі А може знадобитися знову проаналізувати А, перебуваючи в тій же вхідній позиції, що автоматично приводить до нескінченної рекурсії).

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