- •1. Операции над языками. Регулярные выражения.
- •4) Положительное замыкание Клини (без пустой строки):
- •2. Недетерминированный конечный автомат: формальное определение, построение множества достижимых состояний.
- •3. Преобразование регулярных выражений в недетерминированный конечный автомат
- •4. Преобразование недетерминированного конечного автомата в детерминированный.
- •5. Минимизация детерминированного конечного автомата.
- •6. Контекстно-свободные языки. Вывод. Дерево вывода.
- •7. Контекстно-свободные грамматики для регулярных языков.
- •9. Исключение левой рекурсии.
- •8. Метод грамматического разбора сверху - вниз. Ll(1) – грамматики.
- •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) – таблиц разбора.
27. Lr(1) анализ. Lr(1)-ситуация. Замыкание множества ситуаций. Определение переходов.
В названии LR(1) символ L указывает на то, что входная цепочка читается слева-направо, R - на то, что строится правый вывод, наконец, 1 указывает на то, что анализатор видит один символ непрочитанной части входной цепочки.
LR(1)-анализ привлекателен по нескольким причинам:
LR(1)-анализ - наиболее мощный метод анализа без возвратов типа сдвиг-свертка;
LR(1)-анализ может быть реализован довольно эффективно;
LR(1)-анализаторы могут быть построены для практически всех конструкций языков программирования;
класс грамматик, которые могут быть проанализированы LR(1)-методом, строго включает класс грамматик, которые могут быть проанализированы предсказывающими анализаторами (сверху-вниз типа LL(1)).
LR(1) - синтаксический анализатор для исходных кодов программ, написанных на некотором языке программирования, который читает входной поток слева направо и производит наиболее правую продукцию контекстно-свободной грамматики, использует в предпросмотре 1 грамматический символ, на основании которого принимает решение при анализе.
Для исключения некорректных сверток в состояние добавляют дополнительную информацию в состояние. Разделяя при необходимости состояния, мы можем заставить каждое состояние LR-анализа точно указывать, какой входной символ может следовать за основой. Дополнительная информация внедряется в состояние путем переопределения пунктов для включения терминального символа в качестве второго компонента. Общим видом пункта становиться [A -> α*β, a], где A -> α*β представляет собой продукцию, a – терминал или маркер $. Такой объект называется LR(1)-ситуация.
Предпросмотр не играет роль в пункте вида [A -> α*β, a], где β ≠e, но [A -> α*, a] вызывает свертку по продукции A-> α только тогда, когда очередной входной символ – α.
Метод построения замыкания множества ситуаций LR(1) аналогичен LR(0). Необходимо ввести внести изменения только в две функции – closure и goto. (G’ – расширенная грамматика)
function closure(I) begin repeat
for
каждый
пункт
[A -> α*Bβ, a]
I
каждая продукция B>γ из G’ и каждый терминал b из FIRST(βa)
такой, что [B>* γ, b] не I do
добавить [B>* γ, b] в I;
until пунктов для добавления в I больше нет
return I;
end;
Определение переходов:
function goto(I,X)
begin
Пусть J- множество пунктов [A -> αX*β, a]
таких, что [A > αX*β, a] I
return closure(J)
end;
Основная подпрограмма для построения множеств пунктов:
procedure items(G’);
begin
C:={closure ({[S’>*S,$]})};
repeat
for каждое множество пунктов I C и каждый
символ грамматики X, такие, что goto(I,X)
не пусто и не принадлежит С do
добавить goto(I,X) в С
until множеств пунктов для добавления в С больше нет
end;
нужно структуру LR(1)-анализатора?
30. Lr(1) анализ. Заполнение таблиц lr-разбора
В названии LR(1) символ L указывает на то, что входная цепочка читается слева-направо, R - на то, что строится правый вывод, наконец, 1 указывает на то, что анализатор видит один символ непрочитанной части входной цепочки.
LR(1)-анализ привлекателен по нескольким причинам:
LR(1)-анализ - наиболее мощный метод анализа без возвратов типа сдвиг-свертка;
LR(1)-анализ может быть реализован довольно эффективно;
LR(1)-анализаторы могут быть построены для практически всех конструкций языков программирования;
класс грамматик, которые могут быть проанализированы LR(1)-методом, строго включает класс грамматик, которые могут быть проанализированы предсказывающими анализаторами (сверху-вниз типа LL(1)).
Рассмотрим теперь алгоритм конструирования таблицы, управляющей LR(1)-анализатором.
Пусть G = (N, T, P, S) - КС-грамматика. Пополненной грамматикой для данной грамматики G называется КС-грамматика
т.е.
эквивалентная грамматика, в которой
введен новый начальный символ S' и новое
правило вывода S'
S.
Это дополнительное правило вводится для того, чтобы определить, когда анализатор должен остановить разбор и зафиксировать допуск входа. Таким образом, допуск имеет место тогда и только тогда, когда анализатор готов осуществить свертку по правилу S' S.
LR(1)-ситуацией
называется пара [A
.
,
a], где A
-
правило грамматики, a - терминал или
правый концевой маркер $. Вторая компонента
ситуации называется аванцепочкой.
Будем
говорить, что LR(1)-ситуация [A
.
,
a] допустима для активного префикса
,
если существует вывод S
r*
Aw
r
w,
где
=
и
либо a - первый символ w, либо w = e и a = $.
Будем говорить, что ситуация допустима,
если она допустима для какого-либо
активного префикса.
