- •2. Недетерминированный конечный автомат: формальное определение, построение множества достижимых состояний.
- •4. Преобразование недетерминированного конечного автомата в детерминированный.
- •6. Контекстно-свободные языки. Вывод. Дерево вывода.
- •8. Метод грамматического разбора сверху - вниз. Ll(1) – грамматики.
- •10. Левая факторизация.
- •12. Построение множества follow
- •14. Алгоритм работы таблично управляемого анализатора для ll(1) – грамматики.
- •32. Генератор компиляторов уасс. Использование неоднозначных грамматик.
- •18. Разбор методом «сдвиг – свертка» (shift – reduce) на основе стека.
- •24. Алгоритм заполнения таблиц разбора для slr (1) анализатора.
- •28. Построение абстрактного синтаксического дерева.
- •22. Каноническая совокупность множеств ситуаций.
- •34. Автомат с магазинной памятью. Допустимость по заключительному состоянию и по пустому магазину.
- •36. Lr(1) анализ. Lr(1)-ситуация. Замыкание множества ситуаций. Определение переходов.
- •16. Построение отношения предшествования операторов исходя из их ассоциативности и приоритета. Алгоритм разбора для грамматик простого предшествования.
- •38. Lalr(1) – грамматики. Построение lalr(1) – таблиц разбора.
- •1. Операции над языками. Регулярные выражения.
- •4) Положительное замыкание Клини (без пустой строки):
- •3. Преобразование регулярных выражений в недетерминированный конечный автомат
- •5. Минимизация детерминированного конечного автомата.
- •13. Построение таблицы разбора для ll(1) – грамматики
- •7. Контекстно-свободные грамматики для регулярных языков.
- •11. Построение множества first
- •9. Исключение левой рекурсии.
- •15. Грамматики простого предшествования. Использование отношения предшествования операторов
- •21. Алгоритм вычисления замыкания множества ситуаций (Closure).
- •17. Синтаксический анализ снизу – вверх. Основа. Подрезка основы.
- •19. Активный префикс. Обосновать, что основа всегда формируется в вершине стека.
- •27. Синтезируемые атрибуты. Их обработка в алгоритме сдвиг–свертка.
- •23. Переходы в slr (1) анализаторе. Функция goto. Допустимая ситуация.
- •29. Наследуемые атрибуты. Граф зависимостей.
- •25. Алгоритм lr – разбора.
- •33. Автомат с магазинной памятью. Графическое представление автомата с магазинной памятью. Вычислительный процесс в мп – автомате.
- •37. Lr(1) анализ. Заполнение таблиц lr-разбора
- •35. Типы и проверка типов.
- •26. Контекстно–зависимый анализ. Синтаксически управляемая трансляция.
6. Контекстно-свободные языки. Вывод. Дерево вывода.
КСЯ можно разбирать на части. Паскаль имеет вложенную структуру. If E then S1 (оператор) else S2 (оператор). Здесь можно выделить синтаксические категории (S1) – нетерминалы и ключевые слова – терминалы (имеют законченный вид). Для описания синтаксиса ЯП используется БНФ. В ней даются определения нетерминалов через терминалы и нетерминалы. Для оператора if:
<оператор>::= if <выражение> then <оператор> else <оператор>. Далее каждый оператор также можно раскрыть.
Для каждой грамматики можно определить правило непосредственного вывода: если определены последовательности символов и такие, что V* и V* (конечное множество грамматических символов), и если задана продукция А→Р, то из последовательности символов А можно получить .
Здесь → означает применение правила подстановки или непосредственного вывода.
Допустим, если есть последовательность аАВС, то используя грамматику, применив правило 5 только к В, получим:
аАВС→аАвВС
↑
5
Выводом называется последовательность постановок, она обозначается →*. Эта запись означает, что из выводится за 0 или более шагов. →+: из выводится за 1 или более шагов.
Каждая цепочка символов, встречающихся в выводе, называется промежуточной цепочкой. Если промежуточная цепочка выводима из начального символа, то она называется выводимой цепочкой (сентенциальной формой).
Вывод цепочки можно представить в виде дерева. Построение дерева начинаем с корня, и применяя продукции строим ветви.(каждой части правила будет соответствовать ветвь)
Вывод цепочки можно представить в виде дерева. Если на каждом шаге заменяется самый левый нетерминал, то вывод называется левосторонним, если самый правый, то правосторонний.
В общем случае грамматика может порождать несколько различных деревьев вывода для одной и тоже цепочки (неоднозначная). Однозначная - если каждой выводимой цепочке соответствует единственное дерево вывода.
8. Метод грамматического разбора сверху - вниз. Ll(1) – грамматики.
Суть: начинаем разбор со стартового нетерминала и, применяя продукции, заменяем нетерминал ее левой части на последовательность символов ее правой части. Цель: получить в обрамлении листьев этого дерева исходную последовательность.
Процедура рекурсивного разбора сверху вниз состоит из следующих шагов:
- Для узла дерева, помеченного, как нетерминал А, выбирают одну из продукций вида A. После этого строим от А ветви, соответствующие .
- Если в процессе применения продукций получено обрамление, несоответствующее входной последовательности, то производится откат.
- Находим следующий узел, помеченный нетерминалом, для подстановки правила.
Очень важно уметь правильно выбрать продукцию.
Для этого существует разновидность грамматик, называемых LL(k)-грамматики, которые позволяют сделать выбор продукции на основе первых k символов входной последовательности.
Самый распространенный вид - LL(1)-грамматики, когда выбрать продукцию можно только на основе 1-го символа.
L – входная последовательность обрабатывается слева направо, L – используется левый вывод (заменяется самый левый нетерминал), 1 – количество знаков из входной последовательности, необходимых для выбора продукции.
Как сделать выбор среди двух продукций: A → α | β?
Находим м-во FIRST для каждой продукции. Если из последовательности α ⇒* x γ (x принадлежит FIRST(α) ) и FIRST(α) ⋂ FIRST(β) = ∅ то выбор продукции можно сделать по одному символу продукции.
Если ε принадлежит FIRST(α) ≡ α ⇒ ε
Для такого случая выбор продукций будет определятся исходя из того какие терминалы могут встречаться непосредственно за А в какой либо сентенциальной форме.
Грамматика относится к классу LL(1) если FIRST(α) ⋂ FIRST(β) = ∅ ,
а если α ⇒* ε то должно выполняться FIRST(β) ⋂ FOLLOW(A) = ∅ .
