- •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) – таблиц разбора.
8. Метод грамматического разбора сверху - вниз. Ll(1) – грамматики.
Суть: начинаем разбор со стартового нетерминала и, применяя продукции, заменяем нетерминал ее левой части на последовательность символов ее правой части. Цель: получить в обрамлении листьев этого дерева исходную последовательность.
Процедура рекурсивного разбора сверху вниз состоит из следующих шагов:
- Для узла дерева, помеченного, как нетерминал А, выбирают одну из продукций вида A. После этого строим от А ветви, соответствующие .
- Если в процессе применения продукций получено обрамление, несоответствующее входной последовательности, то производится откат.
- Находим следующий узел, помеченный нетерминалом, для подстановки правила.
Очень важно уметь правильно выбрать продукцию.
Для этого существует разновидность грамматик, называемых LL(k)-грамматики, которые позволяют сделать выбор продукции на основе первых k символов входной последовательности.
Самый распространенный вид - LL(1)-грамматики, когда выбрать продукцию можно только на основе 1-го символа.
L – входная последовательность обрабатывается слева направо, L – используется левый вывод (заменяется самый левый нетерминал), 1 – количество знаков из входной последовательности, необходимых для выбора продукции.
Как сделать выбор среди двух продукций: A → α | β?
x принадлежит FIRST(α) ≡ α ⇒* x γ
ε принадлежит FIRST(α) ≡ α ⇒ ε
Грамматика относится к классу LL(1) если FIRST(α) ⋂ FIRST(β) = ∅ ,
а если α ⇒* ε то должно выполняться FIRST(β) ⋂ FOLLOW(A) = ∅ .
9. Исключение левой рекурсии.
При процедуре рекурсивного разбора сверху вниз может возникнуть проблема бесконечного цикла.
В грамматике для арифметических операций применение второго правила приведет к зацикливанию процедуры разбора. Подобные грамматики называются леворекурсивными. Грамматика называется леворекурсивной, если в ней существует нетерминал А, для которого существует вывод А=>+А. В простых случаях левая рекурсия вызвана правилами вида
AA|
В этом случае вводят новый нетерминал и исходные правила заменяют следующими.
AB
BB|
(если есть нетерминал А, для которого существует вывод А→+А за 1 или более шагов). Левой рекурсии можно избежать, преобразовав грамматику.
Например, продукции A→A
│β
Можно заменить на эквивалентные:
A→ β В
В→ В
│ ε
Для такого случая существует алгоритм, исключающий левую рекурсию:
1) определяем на множестве нетерминалов какой-либо порядок (А1, А2, …, Аn)
2) берем каждый нетерминал, если для него есть продукция, учитывающая нетерминал, стоящий левее, и преобразуем грамматику:
for i:=1 to n do
for j:=1 to i-1 do
if Ai → Ajγ then Ai→δ1γ
│ δ2γ
│ δkγ, где
Aj → δ1│ δ2│ …│ δk
3) исключаем все случаи непосредственной левой рекурсии (правило1)
Т.о. алгоритм помогает избежать зацикливания.
Исключение левой рекурсии из грамматики арифметических выражений и общий вид правила исключения левой рекурсии:
Общий вид правила исключения левой рекурсии
A → A α1
| A α2
...
| A αM
| β1
| β2
...
| βN
A → β1 A´
| β2 A´
...
| βN A´
A´ → α1 A´
| α2 A´
...
| αM A´
| ε
