- •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) – таблиц разбора.
14. Построение таблицы разбора для ll(1) – грамматики
Таблица синтаксического разбора представляет собой двумерную таблицу, в которой строки соответствуют нетерминалам, а столбцы – терминалам грамматики. Значения в ячейках этой таблицы определяют продукцию, которая должна быть активирована на текущем шаге алгоритма при получении следующей лексемы. Для построения данной таблицы требуется предварительно построить для каждого нетеминала грамматики множества first и follow. Эта таблица определяет, какую продукцию нужно рассматривать для некоторой пары: терминал на входе и нетерминал в вершине стека. Таблица разбора строится следующим образом.
Для всех продукций А грамматики выполняем:
1 Для всех терминалов а, принадлежащих first() в клетку [А, а] таблицы разбора записываем продукцию А.
2 Если принадлежит first(), то для всех b, принадлежащих follow(А), в клетку [A, b] записываем продукцию А.
Во все остальные клетки таблицы записываем признак ошибки. Это означает, что при данном нетерминале в стеке не ожидается указанный терминал во входной последовательности.
Если при построении таблицы возникает попытка в одну клетку записать две или более продукции, то разбираемая грамматика не является LL(1)-грамматикой, следовательно, не может разбираться таким способом.
15. Алгоритм работы таблично управляемого анализатора для ll(1) – грамматики.
Состояние синтаксического анализатора можно сохранять в специальном стеке, и тогда можно уйти от рекурсии. А процедуру разбора можно сделать универсальной и управляемой таблично. Алгоритм разбора будет один и тот же, но его поведение будет определяться таблицей разбора.
Таблица разбора определяет для каждой пары (А,а), где А-нетерминал, а а-терминал продукцию или признак ошибки.
Алгоритм работы таблично управляемого синтаксического анализатора представлен ниже.
Занести символ окончания входной последовательности в стек
Занести в стек стартовый нетерминал
Распознать символ входной последовательности
Повторять
Если
в вершине стека находится терминал
то
Если
распознанный символа равен вершине стека
то
Извлечь из стека верхний элемент и распознать символ входной последовательности
иначе
вывести сообщение об ошибке;
иначе {если в вершине стека нетерминал}
Если
в клетке[вершина стека, распознанный символ] таблицы разбора существует правило
то
извлечь из стека элемент и занести в стек все терминалы и нетерминалы найденного в таблице правила в стек в порядке обратном порядку их следования в правиле
иначе
вывести сообщение об ошибке
пока
вершина стека не равна концу входной последовательности
Если
распознанный символ не равен концу входной последовательности
то
вывести сообщение об ошибке
Далее строится таблица разбора, а в те ячейки, которые оказались незаполненными, заносится признак ошибки. Построение таблицы станет невозможным при попытке вставить в одну и ту же ячейку два правила. Это значит, что используемая грамматика не относится к классу LL(1)-грамматик.
16. Грамматики простого предшествования. Использование отношения предшествования операторов
Грамматики простого предшествования отличаются следующим:
1) у них нет продукций, имеющих в правой части .
2) нет продукций, в которых два нетерминала стоят рядом.
Грамматики, удовлетворяющие второму требованию, называются операторными.
Например: E → EAE | (E )| -E | id
A → + | - | * | / | ^
можно преобразовать к операторному виду:
E → E+E | E-E | E*E | E/E | E^E | (E) | -E | id
Для нее на основе предшествующих операций можно строить дерево разбора. Для этого необходимо задать три отношения предшествования; на их основе можно выделить основы:
a ⋖ b - a уступает b
a ≐ b - a имеет одинаковый приоритет с b
a ⋗ b - a имеет приоритет над b
Эти операции имеют значение, отличное от арифметических, например, истинно a ⋖ b и b ⋖ a. Для некоторых нетерминалов могут вообще не выполняться такие операции. Отношение предшествования можно задать в форме таблицы, при помощи которой можно легко находить основы
id+id+id: $<• id•>+<•id•>*<•id•>$
Основы получаются: цепочка просматривается до знака •> метка идем обратно до знака <• метка. Между метками будет основа. Когда свернем эти основы, получим: Е+Е*Е. Нетерминалы нужны только для генерации результирующего кода.
Получим последовательность: + *.
|
id |
+ |
* |
$ |
id |
|
⋗ |
⋗ |
⋗ |
+ |
⋖ |
⋗ |
⋖ |
⋗ |
* |
⋖ |
⋗ |
⋗ |
⋗ |
$ |
⋖ |
⋖ |
⋖ |
|
