
- •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. Контекстно–зависимый анализ. Синтаксически управляемая трансляция.
32. Генератор компиляторов уасс. Использование неоднозначных грамматик.
Одним из средств автоматизированного построения трансляторов является генератор компиляторов Yacc. Yacc строит синтаксический анализатор, работающий на основе метода “сдвиг - приведение”.
Этот генератор работает с атрибутными грамматиками. Атрибутные грамматики характеризуются тем, что с каждым грамматическим символом связывается множество атрибутов. Атрибуты в атрибутных грамматиках могут быть двух видов: синтезируемые и наследуемые. Синтезируемые атрибуты вычисляют свои значения, используя только значения атрибутов потомков. Наследуемые атрибуты при вычислении значений используют значения атрибутов соседей и родителей. Исходный текст для Yacc, основой которого являются продукции и семантические правила, пишется в текстовом редактор и сохраняется в файле с расширением y. Если исходный текст содержит ошибки, то при генерации транслятора будет создан файл ошибок с расширением lst. Полученный в результате работы yacc модуль присоединяется к проекту Delphi, который содержит текст основной программы. Транслятор строится Yacc в виде функции yyparse, которая вызывается из основной программы. Исходный текст для yacc состоит из трех частей: определения, продукции и вспомогательные процедуры. Части разделяются символами %%.
В части определений можно указать код, который должен быть перенесен в текст результирующего транслятора без изменения. В качестве такого кода могут выступать заголовок модуля или объявления типов, используемые затем для описания атрибутов терминалов и нетерминалов. В результирующем коде будет объявлена переменная yyLval. Эта переменная всегда автоматически определяется YACC в тексте синтаксического анализатора и используется для хранения атрибутов терминалов, которые должны быть переданы из лексического анализатора в синтаксический.
Часть определений включает следующие разделы.
1 Задание стартового символа.
2 Определение атрибутов терминалов грамматики.
3 Задание ассоциативности операций.
4 Задание типов атрибутов нетерминалов
Вторая часть Yacc-программы содержит продукции и связанные с ними семантические правила. Левая часть продукции отделяется от правой символом “:”.
Третья часть Yacc-программы содержит вспомогательные процедуры. Эта часть переносится в результирующий код без изменения.
Если мы используем неоднозначную грамматику, то LALR-алгоритм будет генерировать конфликты действий синтаксического анализа. Yacc может автоматически решать конфликты исходы из правил:
1) Конфликт свертка/свертка разрешает выбором продукции, находящейся первой в спецификации Yacc.
2) конфликт перенос/свертка разрешается в пользу переноса. Это правило корректно разрешает конфликт, возникающий из-за неоднозначности появления else.
Yacc разрешает конфликты перенос/свертка назначением приоритета и ассоциативности каждой продукции, участвующей в конфликте. Если необходимо осуществить выбор между переносом входного символа a и сверкой в соответствии с продукцией A-> α, то Yacc выполняет свертку, если приоритет продукции выше приоритета a, или если приоритеты одинаковы, и ассоциативность продукции – левая. В противном случае перенос.