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

17. Построение отношения предшествования операторов исходя из их ассоциативности и приоритета. Алгоритм разбора для грамматик простого предшествования.

Вход Д для этого алгоритма: разбираемая строка W и таблица, хранящая отн-я предшеств-я W=id1+id2*id3

Входные данные: если строка W написана грамотно, то на выходе дерево разбора, иначе сообщение об ошибке. Префиксная запись: 2 операнда и за ними след-т оператор: id1 id2 id3 + *.

Если использовать стек, то можно построить дерево. Алгоритм представляет собой цикл, который завершает свою работу, когда стек и буфер станут пустыми.

Пусть а – самый верхний терминал стека

a:= Top of Stack, в:= 1й символ буфера

Если а<•в или а=в, то выполняем сдвиг, т.е. Push в и берем новый текущий символ.

Иначе Если а•>в then свертка, т.е. из стека извлекаем символы, пока не обнаружим <•. Здесь же извлеченные символы заносятся в результирующую последовательность.

Иначе выдаем сообщение об ошибке.

Таблица заполняется на основе ассоциативности и приоритетов следующим образом:

1) если оператор А1 имеет больший приоритет к А2, то в таблицу заносим А1•>А2, а А2<•А1. Напр: *•>+, +<•*

2) если А1 и А2 имеют одинаковый приоритет, то для ассоциат-х влево операторов принимаем: А1<•А2, А2<•А1 и наоборот А1•>А2, А2•>А1. Т.о. задаем ассоциативность: +, -, *, /, ( - ассоц-ть влево, возвед-е в степень – ассоц-ть вправо.

3) Для всех А считаем: А <• id, id•>А, id<•’(’, ‘)’ •>А, A•>')', A•>$, $<•$.

Самый простой транслятор можно написать, используя LL1 для операторов, а для грамматик – ГПП-разбор.

Алгоритм:

Повторять бесконечно:

если в вершине стека $, и тек. символ - $, то успешный выход. иначе пусть a – самый верхний в стеке терминал,

b – первый символ входного буфера.

если a ⋖ b или a ≐ b то, (* сдвиг *)

1) делаем push b; 2) следующий вх. символ становится тек.

иначе если a ⋗ b то , (* свёртка *)

repeat pop Xi until (верш. стека ⋖ Xi) иначе ошибочная ситуация.

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

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

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

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

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

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

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

abbcdeaAbcdeaAdeaABeS

Это соответствует правому выводу: 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. Затем повторяем описанный процесс.

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

Подрезка основы