Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры_по тяпу готовые.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
952.32 Кб
Скачать

21. Алгоритм вычисления замыкания множества ситуаций (Closure).

Для заданного множества ситуаций I грамматики G, замыкание этого множества Closure(I) строится по двум правилам:

Базовый случай: все ситуации I Î closure(I).

Общий случай (шаг индукции): если ситуация [ A → α • B β ] Î closure(I), правило может начать ожидать свою основу B → γ (существует такая продукция), то добавим ситуацию [ B → • γ ] Î closure(I).

Этот процесс выполняется до тех пор, пока что-то можно добавить в множество closure(I).

Пример:

Для пополненной грамматики:

E’ → E [E’ → • E]

E → E + T | T [E → • E + T]

T → T * F | F [E → • T]

F → ( E ) | id [T → • T * F]

Если вначале множество I содержит 1 ситуацию: [T → • F]

Построим closure(I), где I = {[E’ → •E]}: [F → •( E )]

closure(I) будет содержать: [F → • id]

17. Синтаксический анализ снизу – вверх. Основа. Подрезка основы.

Основная идея разбора снизу вверх состоит в следующем. Находим продукцию, правая часть которой совпадает с фрагментом входной последовательности. Заменяем найденный фрагмент нетерминалом левой части продукции.

При таком разборе применяется метод “сдвиг-приведение”. В процессе разбора этим методом строится дерево разбора входной строки с листьев к корню. Этот процесс можно рассматривать как приведение (свертку) входной строки к стартовому символу грамматики. Если на каждом шаге выбирается правильная подстрока для замены нетерминалом по некоторому правилу, то в обратном порядке прослеживается правосторонний вывод.

Из входной последовательности берем по символу и сдвигаем в стек. Если в стеке окажется правая часть правила, то замещаем ее на нетерминал левой части. Просматривая входную последовательность слева на право, находим в ней правую часть правила, и заменяем на нетерминал в левой части (Должен быть правый вывод). Основой правой сентенциальной γ называется продукция А→β , и позиция в γ , где находится фрагмент β, который можно заменить на А, и при этом получится предыдущая правая сентенциальная форма с правым выводом γ. Основа – самое левое полное поддерево, состоящее из узла и потомков.

Возьмем грамматику:

1) S → a A B e 2) A → A b c 3)A → b 4)B → d

Последовательность abbcde можно привести к S сл. образом:

abbcde aAbcde aAde aABe S

Это соответствует правому выводу: S aABe aAde aAbcde abbcde

Подрезка основы – это главная задача анализатора, с помощью её можно получить обращенное правое порождение. Мы начинаем процесс со строки терминалов w, которую хотим проанализировать. Если w – предложение рассматриваемое грамматики, то w = γn где γn - n-я правосентенциальная форма некоторого, ещё неизвестного правого порождения S => γ0 => γ1=> γ2 => … γn = w. Для воссоздания этого порождения в обратном порядке мы находим основу βn в γn и заменяем её левой частью продукции An -> βn для получения (n-1)-й сентенциальной формы γn-1. Затем повторяем описанный процесс.

При использования стека в момент появления основы в нем определяется левый край основы (т.е сколько позиций менять) и каким нетерминалом.

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