
- •Содержание
- •1.Рабочая программа
- •2.Модуль Вводный
- •3.Модуль Формальные грамматики и языки
- •3.1.Языки и цепочки символов. Способы задания языков
- •3.1.1.Цепочки символов. Операции над цепочками символов
- •3.1.2.Понятие языка. Формальное определение языка
- •3.1.3.Способы задания языков
- •3.1.4.Синтаксис и семантика языка
- •3.2.Определение грамматики
- •3.2.1.Особенности языков программирования
- •3.2.2.Определение грамматики. Форма Бэкуса—Наура
- •3.2.3.Принцип рекурсии в правилах грамматики
- •3.2.4.Другие способы задания грамматик
- •3.3.Классификация языков и грамматик
- •3.3.1.Классификация грамматик
- •3.3.2.Классификация языков
- •3.4.Контроль
- •4.Модуль Распознаватели, механизм вывода цепочек символов
- •4.1.Цепочки вывода. Сентенциальная форма.
- •4.1.1.Сентенциальная форма грамматики. Язык, заданный грамматикой
- •4.1.2.Левосторонний и правосторонний выводы
- •4.1.3.Однозначные и неоднозначные грамматики
- •4.1.4.Эквивалентность и преобразование грамматик
- •4.2.Распознаватели. Задача разбора
- •4.2.1.Общая схема распознавателя
- •4.2.2.Виды распознавателей
- •4.2.3.Классификация распознавателей по типам языков
- •4.3.Контроль
- •5.Модуль Регулярные грамматики и языки
- •5.1.Регулярные языки и грамматики
- •5.2.Леволинейные и праволинейные грамматики. Автоматные грамматики
- •5.3.Алгоритм преобразования регулярной грамматики к автоматному виду
- •5.4.Конечные автоматы
- •5.4.1.Определение конечного автомата
- •5.4.2.Детерминированные и недетерминированные конечные автоматы
- •5.4.3.Преобразование конечного автомата к детерминированному виду
- •5.5.Контроль
- •6.Модуль Контекстно-свободные грамматики и языки
- •6.1.Контекстно-свободные языки
- •6.1.1.Распознаватели кс-языков. Автоматы с магазинной памятью. Определение мп-автомата
- •6.2.Классы кс-языков и грамматик. Класс ll(k) грамматик.
- •6.3.Принципы построения распознавателей для ll(k)-грамматик
- •6.4.Левая факторизация
- •6.5.Удаление левой рекурсии
- •6.6.Алгоритм разбора для ll(1)-грамматик
- •6.7.Алгоритм построения множества first(1,a)
- •6.8.Алгоритм построения множества follow(1,a)
- •6.9.Восходящие распознаватели кс-языков без возвратов
- •6.9.1.Определение lr(k)-грамматики
- •6.10.Принципы построения распознавателей для lr(k)-грамматик
- •6.10.1.Грамматики простого предшествования
- •6.11.Распознаватели для lr(0) и lr(1) грамматик
- •6.11.1.Распознаватель для lr(0)-грамматики
- •6.11.2.Распознаватель для lr(1) грамматики
- •6.12.Контроль
- •7.Модуль Инструментальные средства для построения трансляторов
- •7.1.Инструментальные средства для построения компиляторов
- •7.1.1.Построитель лексических анализаторов Lex
- •7.2.Контроль
- •8.Модуль Особенности программирование трансляторов
- •8.1.Использование значений произвольных типов, алгоритм разбора
- •8.1.1.Алгоритм синтаксического разбора
- •8.1.2.Семантический стек
- •8.2.Неоднозначности и конфликты
- •8.3.Старшинство операций
- •8.4.Дополнительные возможности программ yacc и lex
- •8.4.1.Обработка ошибок
- •8.5.Совместное использование lex и yacc
- •8.5.1.Кодировка лексем и интерфейс
- •8.5.2.Сборка yacc-программ
- •8.6.Советы по подготовке спецификаций
- •8.6.1.Стиль
- •8.6.2.Использование левой рекурсии
- •8.6.3.Уловки анализа лексики
- •8.6.4.Входной синтаксис yacc'а
- •8.7.Контроль
- •9.Модуль Заключение
- •10.Обеспечение лабораторного практикума
- •11.Дополнительная информация. Примеры
- •11.4.Пример простейшего интерпретатора формул
- •11.5.Простой пример
- •11.6.Более сложный пример
- •11.7.Генераторы лексических и синтаксических анализаторов
- •11.8.Генераторы лексических и синтаксических анализаторов на java
- •11.9.Пакеты для разработки компиляторов
- •Список сокращений
- •Литература
- •Приложения Приложение 1. Учебно–методическая карта дисциплины “Системное программное обеспечение. Синтаксические анализаторы”
- •Приложение 2. Вопросы для зачета по дисциплине “Системное программное обеспечение. Синтаксические анализаторы”
- •Приложение 3. Методические указания к лабораторным работам по дисциплине «Системное программное обеспечение. Синтаксические анализаторы»
- •Порядок выполнения работы:
- •Контрольные вопросы
- •Лексический анализатор lex. Анализ структуры программ
- •Краткая теория:
- •Рассмотрим примеры:
- •Порядок выполнения работы:
- •Контрольные вопросы
- •Лексический анализатор lex, синтаксический анализатор yacc. Алгебраические вычисления
- •Краткая теория:
- •Порядок выполнения работы:
- •Контрольные вопросы
- •Лексический анализатор lex и синтаксический анализатор yacc. Изображение геометрических фигур
- •Краткая теория:
- •Создание метафайла и работа сним
- •Порядок выполнения работы:
- •Контрольные вопросы
- •Приложение 4. Организация рейтингового контроля по дисциплине «Системное программное обеспечение. Синтаксические анализаторы»
6.11.2.Распознаватель для lr(1) грамматики
Другим употребительным классом LR(k)- грамматика являются LR(1)-грамматики. В этих грамматиках основанием для принятия расширенным МП-автоматом решения о выполнении сдвига или свертки служит информация о содержимом стека автомата и текущий символ, обозреваемый считывающей головкой.
Рассмотрим простую КС-грамматику G({a,b}, {S}, {S→SaSb|}, S). Пополненная грамматика для нее будет иметь вид G({a,b}, {S, S'}, {S'→S, S→SaSb|}, S'). Эта грамматика является LR(1)-грамматикой. Управляющая таблица для нее приведена в табл. 6.2.
Колонка «Стек», присутствующая в таблице, в принципе не нужна для распознавателя. Она введена исключительно для пояснения каждого состояния стека автомата. Пустые клетки в таблице соответствуют состоянию «ошибка».
Правила в грамматике пронумерованы от 1 до 3 (при этом будем считать, что состоянию «успех» — свертке к нулевому символу — в пополненной грамматике всегда соответствует первое правило). Колонка «Действие» и таблице содержит перечень действий, соответствующих текущему входному символу, обозреваемому считывающей головкой расширенного МП-автомата.
Таблица 6.2 Пример управляющей таблицы для LR(1)-грамматики
-
Стек
Действие
Переход
a
b
^к
а
b
S
^и
свертка, З
свертка, 3
1
S
сдвиг
успех, 1
2
Sa
свертка, 3
свертка, 3
3
SaS
сдвиг
сдвиг
4
5
SaSa
свертка, 3
свертка, 3
6
SaSb
свертка, 2
свертка, 2
SaSaS
сдвиг
сдвиг
4
7
SaSaSb
свертка, 2
свертка, 2
Рассмотрим примеры распознавания цепочек этой грамматики но шагам, которые совершает распознаватель. Конфигурацию расширенного МП-автомата будем отображать в виде трех компонентов: не прочитанная еще часть входной цепочки символов, содержимое стека МП-автомата, последовательность номеров примененных правил грамматики (поскольку автомат имеет только одно состояние, его можно не учитывать). В стеке МП-автомата имеете с помещенными туда символами показаны и номера строк управляющей таблицы, соответствующие этим символам » формате (символ, номер строки}.
Разбор цепочки abababb
1. (abababb^к, (^и,0), )
2. (abababb^к, {^и,0}{S,1}, 3)
3. (bababb^к, {^и,0){S,l}{a,2}, 3)
4. (bababb^к, {^и,0}(S,l}{a,2}{S,3}, 3,3)
5. (ababb^к, {^и,0}{S,l}{a,2}{S,3}{b,5}, 3,3)
6. (ababb^к, {^и,0}{S,1}, 3,3,2)
7. (babb^к, {^и,0}{S,l){a,2}, 3,3,2)
8. (babb^к, {^и,0}{S,l}{a,2}{S,3}, 3,3,2,3)
9. (abb^к, {^и,0}{S,l}{a,2}{S,3}{b,5}, 3,3,2,3)
10. (abb^к, {^и,0}{S,1}, 3,3,2,3,2)
11. (bb^к, {^и,0}{S,l}{a,2}, 3,3,2,3,2)
12. (bb^к, {^и,0}{S,l}{a.2}{S,3}, 3,3,2,3,2,3)
13. (^к, {^и,0}{S,l}{a,2}{S,3}{b.5}, 3,3,2,3,2,3)
14. Ошибка, нет данных для «b» в строке 5.
Разбор цепочки aababb.
1. (aababb^к, {^и,0}, )
2. (aababb^к, {^и,0}{S,1}, 3)
3. (аbabb^к, {^и,0}{S,1}{а,2}, 3)
4. (ababb^к, {^и,0}{S,1}{а,2}{S,3}, 3,3)
5. (bаbb^к, {^и,0){S,l}{a,2}{S,3}{a,4}, 3,3)
6. (babb^к, {^и ,0}{S,l}{a,2}{S,3}{a,4}{S,6}, 3,3,3)
7. (abb^к, {^и,0}{S,l}{a,2}{S,3}{a,4}{S,6}{b,7}, 3,3,3)
8. (abb^к, {^и,0}{S,l}{a,2}{S,3}, 3,3,3,2)
9. (bb^к, {^и,0}{S,l}{a,2}{S,3}{a,4}, 3,3,3,2)
10. (bb^к, {^и,0}{S,l}{a,2}{S,3}{a,4}{S,6}, 3,3,3,2,3)
11. (b^к, {^и,0}{S,l}{a,2}{S,3}{a,4}{S,6}{b,7}, 3,3,3,2,3)
12. (b^к, {^и,0}{S,l}{a,2}{S,3}, 3,3,3,2,3,2)
13. (^к, {^и,0}{S,l}{a,2}{S,3}{b,5}, 3,3,3,2,3,2)
14. (^к, {^и,0}{S,1}, 3,3,3,2,3,2,2)
15. (^к, {^и,0}{S',*}, 3,3,3,2,3,2,2,1) - разбор завершен.
Соответствующая цепочка вывода будет иметь вид (используется правосторонний вывод): S' S SaSb SaSaSbb SaSabb SaSaSbabb SaSababb Saababb aababb.
Невозможно непосредственно сравнить работу двух рассмотренных вариантов распознавателей: восходящего (LR) и нисходящего (LL). Это очевидно, поскольку приведенная в примере грамматика не является LL(l)- грамматикой. Соответственно, она не может быть разобрана и методом рекурсивного спуска (можно убедиться в этом, построив множества FIRST и FOLLOW для символов грамматики: FIRST(1,S) = {a}, FOLLOW(l,S) - {α,b,}; FIRST(l,S) FOLLOW(l,S) ≠ 0). На основании этой грамматики вообще невозможно построить нисходящий распознаватель, поскольку она явно содержит левую рекурсию. Устранив левую рекурсию и выполнив ряд несложных преобразований, можно получить эквивалентную ей грамматику G"({a,b},{S},{S→|aSbS},S), которая будет относиться к классу LR(k) -грамматик (действительно, для нее FIRST(l,S) - {a}, FOLLOW(1,S) = {b}; FIRST(l,S) FOLLOW(l,S) ≠ 0)1.
Теперь уже возможно сравнить работу двух вариантов распознавателей — нисходящего и восходящего.
Несмотря на то что распознаватель на основе LL(1)-грамматики и в данном случае имеет более простой алгоритм функционирования, нельзя сказать, что им легче воспользоваться, поскольку его создание требует дополнительных преобразований исходной грамматики. Для более сложных LR(1)-грамматик такие преобразования могут быть в принципе невозможны, поскольку класс языков, заданных LR(1)-грамматиками, шире, чем класс языков, заданных LL(1) -грамматиками. Поэтому для конкретной ладанной грамматики чаще бывает проще построить восходящий распознаватель, чем нисходящий.
На практике LR(k)-грамматики при k > 1 не применяются. На это имеются две причины. Во-первых, управляющая таблица для LR(к)- грамматика при k > 1 будет содержать очень большое число состояний, и распознаватель будет достаточно сложным и не столь эффективным2. Во-вторых, для любого языка, определяемого LR(k)- грамматикой, существует LR(1)-грамматика, определяющая тот же язык. То есть для любой LR(k)-грамматики c k > 1 всегда существует эквивалентная ей LR(1)-грамматика. Более того, для любого детерминированного КС-языка существует LR(1)-грамматика (другое дело, что далеко не всегда такую грамматику можно легко построить)3.