
- •1. Операции над языками. Регулярные выражения.
- •4) Положительное замыкание Клини (без пустой строки):
- •2. Недетерминированный конечный автомат: формальное определение, построение множества достижимых состояний.
- •3. Преобразование регулярных выражений в недетерминированный конечный автомат
- •4. Преобразование недетерминированного конечного автомата в детерминированный.
- •5. Минимизация детерминированного конечного автомата.
- •6. Контекстно-свободные языки. Вывод. Дерево вывода.
- •7. Контекстно-свободные грамматики для регулярных языков.
- •8. Метод грамматического разбора сверху - вниз. Ll(1) – грамматики.
- •9. Исключение левой рекурсии.
- •10. Левая факторизация.
- •11. Построение множества first
- •12. Построение множества follow
- •14. Построение таблицы разбора для ll(1) – грамматики
- •15. Алгоритм работы таблично управляемого анализатора для ll(1) – грамматики.
- •16. Грамматики простого предшествования. Использование отношения предшествования операторов
- •17. Построение отношения предшествования операторов исходя из их ассоциативности и приоритета. Алгоритм разбора для грамматик простого предшествования.
- •18. Синтаксический анализ снизу – вверх. Основа. Подрезка основы.
- •19. Разбор методом «сдвиг – свертка» (shift – reduce) на основе стека.
- •20. Активный префикс. Обосновать, что основа всегда формируется в вершине стека.
- •22. Алгоритм вычисления замыкания множества ситуаций (Closure).
- •23. Каноническая совокупность множеств ситуаций.
- •24. Переходы в slr (1) анализаторе. Функция goto. Допустимая ситуация.
- •25. Алгоритм заполнения таблиц разбора для slr (1) анализатора.
- •26. Алгоритм lr – разбора.
- •33. Контекстно–зависимый анализ. Синтаксически управляемая трансляция.
- •34. Синтезируемые атрибуты. Их обработка в алгоритме сдвиг–свертка.
- •35. Построение абстрактного синтаксического дерева.
- •36. Наследуемые атрибуты. Граф зависимостей.
- •42. Генератор компиляторов уасс. Использование неоднозначных грамматик.
- •43. Автомат с магазинной памятью. Графическое представление автомата с магазинной памятью. Вычислительный процесс в мп – автомате.
- •44. Автомат с магазинной памятью. Допустимость по заключительному состоянию и по пустому магазину.
- •35. Типы и проверка типов.
- •27. Lr(1) анализ. Lr(1)-ситуация. Замыкание множества ситуаций. Определение переходов.
- •30. Lr(1) анализ. Заполнение таблиц lr-разбора
- •31. Lalr(1) – грамматики. Построение lalr(1) – таблиц разбора.
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 сл. образом:
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. Затем повторяем описанный процесс.
При использования стека в момент появления основы в нем определяется левый край основы(т.е сколько позиций менять) и каким нетерминалом.
Подрезка основы