
- •Содержание
- •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. Организация рейтингового контроля по дисциплине «Системное программное обеспечение. Синтаксические анализаторы»
УЧЕБНО-ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ПОЛОЦКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Кафедра технической кибернетики
УЧЕБНО-МЕТОДИЧЕСКИЙ КОМПЛЕКС
«Системное программное обеспечение.
Синтаксические анализаторы»
для специальностей:
Т.10.03 «Вычислительные системы и сети»
Т.10.02 «Программное обеспечение информационных технологий»
Автор-составитель: проректор
по информатизации, к.т.н.
Глухов Дмитрий Олегович
Новополоцк, 2004
Содержание
Содержание 2
Об УМК 6
1. Рабочая программа 7
2. Модуль Вводный 10
3. Модуль Формальные грамматики и языки 13
3.1. Языки и цепочки символов. Способы задания языков 13
3.1.1. Цепочки символов. Операции над цепочками символов 13
3.1.2. Понятие языка. Формальное определение языка 14
3.1.3. Способы задания языков 15
3.1.4. Синтаксис и семантика языка 17
3.2. Определение грамматики 18
3.2.1. Особенности языков программирования 18
3.2.2. Определение грамматики. Форма Бэкуса—Наура 20
3.2.3. Принцип рекурсии в правилах грамматики 23
3.2.4. Другие способы задания грамматик 25
3.3. Классификация языков и грамматик 26
3.3.1. Классификация грамматик 26
3.3.2. Классификация языков 29
3.4. Контроль 32
4. Модуль Распознаватели, механизм вывода цепочек символов 33
4.1. Цепочки вывода. Сентенциальная форма. 33
4.1.1. Сентенциальная форма грамматики. Язык, заданный грамматикой 35
4.1.2. Левосторонний и правосторонний выводы 36
4.1.3. Однозначные и неоднозначные грамматики 37
4.1.4. Эквивалентность и преобразование грамматик 39
4.2. Распознаватели. Задача разбора 41
4.2.1. Общая схема распознавателя 41
4.2.2. Виды распознавателей 44
4.2.3. Классификация распознавателей по типам языков 45
4.3. Контроль 48
5. Модуль Регулярные грамматики и языки 50
5.1. Регулярные языки и грамматики 50
5.2. Леволинейные и праволинейные грамматики. Автоматные грамматики 51
5.3. Алгоритм преобразования регулярной грамматики к автоматному виду 52
5.4. Конечные автоматы 54
5.4.1. Определение конечного автомата 54
5.4.2. Детерминированные и недетерминированные конечные автоматы 56
5.4.3. Преобразование конечного автомата к детерминированному виду 57
5.5. Контроль 60
6. Модуль Контекстно-свободные грамматики и языки 61
6.1. Контекстно-свободные языки 61
6.1.1. Распознаватели КС-языков. Автоматы с магазинной памятью. Определение МП-автомата 61
6.2. Классы КС-языков и грамматик. Класс LL(k) грамматик. 63
6.3. Принципы построения распознавателей для LL(k)-грамматик 67
6.4. Левая факторизация 68
6.5. Удаление левой рекурсии 69
6.6. Алгоритм разбора для LL(1)-грамматик 70
6.7. Алгоритм построения множества FIRST(1,A) 72
6.8. Алгоритм построения множества FOLLOW(1,A) 73
6.9. Восходящие распознаватели КС-языков без возвратов 74
6.9.1. Определение LR(k)-грамматики 74
6.10. Принципы построения распознавателей для LR(k)-грамматик 78
6.10.1. Грамматики простого предшествования 82
6.11. Распознаватели для LR(0) и LR(1) грамматик 86
6.11.1. Распознаватель для LR(0)-грамматики 86
6.11.2. Распознаватель для LR(1) грамматики 89
6.12. Контроль 92
7. Модуль Инструментальные средства для построения трансляторов 93
7.1. Инструментальные средства для построения компиляторов 93
7.1.1. Построитель лексических анализаторов Lex 93
7.1.2. Yacc 114
7.2. Контроль 123
8. Модуль Особенности программирование трансляторов 124
8.1. Использование значений произвольных типов, алгоритм разбора 124
8.1.1. Алгоритм синтаксического разбора 126
8.1.2. Семантический стек 131
8.2. Неоднозначности и конфликты 133
8.3. Старшинство операций 138
8.4. Дополнительные возможности программ yacc и lex 141
8.4.1. Обработка ошибок 141
8.5. Совместное использование lex и yacc 144
8.5.1. Кодировка лексем и интерфейс 147
8.5.2. Сборка yacc-программ 149
8.6. Советы по подготовке спецификаций 154
8.6.1. Стиль 154
8.6.2. Использование левой рекурсии 155
8.6.3. Уловки анализа лексики 156
8.6.4. Входной синтаксис yacc'а 157
8.7. Контроль 159
9. Модуль Заключение 160
10. Обеспечение лабораторного практикума 161
11. Дополнительная информация. Примеры 162
11.1. Функции работы со строками языка С/С++ для С, MS Visual C++, Borland C++ Builder 162
11.2. Функции работы с потоками языка С / С++ 163
11.3. Функции работы с потоками в Borland C++ Builder 166
11.4. Пример простейшего интерпретатора формул 168
11.5. Простой пример 169
11.6. Более сложный пример 172
11.7. Генераторы лексических и синтаксических анализаторов 181
11.8. Генераторы лексических и синтаксических анализаторов на java 187
11.9. Пакеты для разработки компиляторов 191
Список сокращений 193
Литература 194
Приложения 196
Приложение 1. Учебно–методическая карта дисциплины “Системное программное обеспечение. Синтаксические анализаторы” 197
Приложение 2. Вопросы для зачета по дисциплине “Системное программное обеспечение. Синтаксические анализаторы” 198
Приложение 3. Методические указания к лабораторным работам по дисциплине «Системное программное обеспечение. Синтаксические анализаторы» 200
Приложение 4. Организация рейтингового контроля по дисциплине «Системное программное обеспечение. Синтаксические анализаторы» 222
Об УМК
В настоящее время наблюдается переосмысление роли образования в современном обществе. Образование не может быть оторванным от социальных процессов и, следовательно, должно формировать в человеке гражданские, личностно-ориентированные компетенции. Задача образования состоит в формировании механизмов овладения, систематизации и эффективного применения знаний, соответствующих среде интенсивно изменяющегося общества. Это единственно возможный путь, при котором обучающийся приобретает способность адаптации к темпам изменения отрасли. При этом актуальными становятся задачи обучения работе в экстремальных условиях, условиях стресса.
Так специалист в области системного программного обеспечения должен быть готов использовать знания из разных областей компьютерной науки, к работе в команде, к решению творческих и научно-исследовательских задач, ко взаимодействию с коллективами людей и отдельными людьми, не являющимися экспертами в его области (заказчики, тестировщики, архитекторы, менеджеры, маркетологи, экономисты, дизайнеры, эксперты). Кроме этого он должен быть готов к постоянному восприятию новых стандартов в области операционных систем, протоколов и системных интерфейсов, освоению новых инструментальных средств и интегрированных сред разработки. А иначе, при нынешних темпах развития технологий, специалист не выдержит конкуренции и не будет востребован обществом.
Предлагаемый Вашему вниманию учебно-методический комплекс представляет собой попытку решения всего комплекса задач по обучению и подготовке современного специалиста в области системного программного обеспечения, в части, касающейся разработки компиляторов, трансляторов и интерпретаторов формальных языков, а также конструирования языков как таковых. Поэтому при его составлении отправной точкой являлись дидактические и познавательные цели и задачи обучения на современном этапе. Система контроля, которую реализует данный учебно-методический комплекс, ориентируется на выявление знаний и умений репродуктивного, продуктивного и творческого уровней, а также личных ценностных установок обучаемого.