
- •Содержание
- •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. Организация рейтингового контроля по дисциплине «Системное программное обеспечение. Синтаксические анализаторы»
Приложение 2. Вопросы для зачета по дисциплине “Системное программное обеспечение. Синтаксические анализаторы”
Первые вопросы билетов
Функции работы со строками с ANSI C++. Практическая задача.
Функции манипуляции строками ANSI C. Практическая задача.
Функции работы с потоками ввода вывода. Классы потоков. Принципы программирования поточного разбора. Практическая задача.
Принципы программирование поточного ввода вывода. Практическая задача.
Работа со строками средствами Borland C++ Builder. Объектно-ориентированная концепция строчного анализа. Практическая задача.
Работа со строками средствами MS Visual C++. Объектно-ориентированная концепция строчного анализа. Практическая задача.
Потоки в Borland C++ Builder. Практическая задача.
Стандартные потоки ввода вывода. Принципы реализации поточного ввода и вывода данных. Практическая задача.
Файловый ввод вывод с использованием потоков. Практическая задача.
Динамическая работа с памятью, используемая при работе со строками, порождение строчных объектов в Borland C++ Builder и MS Visual C++. Практическая задача.
Пример задачи к первому вопросу
Пример загрузки в данных из файла 4.txt в строку AnsiString типа и замена всех фрагментов "text" на фрагменты "текстового" в загруженном тексте и заполнение массива чисел, обнаруженными в тексте числами.
Вторые вопросы билетов
Структура Lex программы. Практическая задача.
Структура Yacc программы. Практическая задача.
Принципы лексического разбора, заложенные в Yacc. Практическая задача.
Принципы синтаксического разбора, реализуемые Lex.
Описание грамматики языка при совместном использовании Yacc и Lex.
Операторы в регулярных выражениях Lex. Практическая задача.
Условные и безусловные правила Lex. Практическая задача.
Литералы, терминальные и нетерминальные символы и иные объекты программы Yacc. Практическая задача.
Использование в работе парсера значений произвольных типов. Практическая задача.
Основные действия лексического анализатора. Практическая задача.
Принципы реализации действий переноса и свертки в лексическом анализаторе Yacc. Практическая задача.
Работа семантического стека лексического анализатора Yacc. Практическая задача.
Конфликты перенос-свертка и свертка-свертка. Практическая задача.
Создание приложений с парсером на основе Yacc. Практическая задача.
Пример задачи ко второму вопросу
Показать фрагменты программы, использующей различные типы переменных семантического стека при лексическом анализе.
Приложение 3. Методические указания к лабораторным работам по дисциплине «Системное программное обеспечение. Синтаксические анализаторы»
Введение
Данное методическое пособие предназначено для студентов специальности "Вычислительные системы и сети" по курсу "Системное программное обеспечение" (2 семестр) для выполнения лабораторных работ.
Для правильного выполнения работ необходимы знания теоретического материала по данному курсу, языков программирования (C++, Turbo Pascal) и навыки работы в средах Borland C++ Builder и Microsoft Visual Studio. Также для успешного выполнения задания необходимо изучение краткой теории к соответствующей лабораторной работе.
В отчет по выполненной лабораторной работе входят: листинг программы, задание с указанием варианта, краткое описание алгоритма решения задачи. Для защиты работы необходимо ответить на ряд вопросов по программе, алгоритму решения и применяемой технологии.
Лабораторная работа №1
Функции работы с потоками
Цель работы: освоить работу потоковыми функциями Borland C++ Builder для анализа и разбора текста.
Краткая теория:
Функции работы с потоками стандарта ANSI
Потоковые классы представляют объектно-ориентированный вариант функций ANSI-C, сгруппированных в файле-заголовке stdio.h. Источник или приемник данных определяется объектом потокового класса: для basic_ifstream связанный с объектом файл является источником, для объекта basic_ofstream он выступает в качестве приемника.
Потоковые классы делятся на три группы:
basic_istream, basic_ostream – общие потоковые классы;
basic_ifstream, basic_ofstream – потоковые классы для считывания и записи файлов;
basic_istringstream, basic_ostringstream – потоковые классы для объектов-строк.
Каждый потоковый класс поддерживает буферный объект для передаваемых данных. Базовым шаблонам классов basic_ios (для потоковых классов) и basic_streambuf (для буферных классов) передаются два параметра шаблона:
(charT) определяет символьный тип;
(traits) – объект типа ios_traits, в котором заданы тип и функции, специфичные для используемого символьного типа;
для типов char и wchar_t образованы соответствующие объекты типа ios_traits и потоковые классы.
Класс обеспечивает общие операции для ввода и вывода. Производные от него классы (istream, ostream, iostream) специализируют ввод-вывод с помощью операций форматирования высокого уровня.
Таблица 1 – Флаги формата
-
Флаг
Описание
Skipws
Пропускает при вводе пробелы и разделители.
left
Выравнивание вывода влево.
Right
Выравнивание вывода влево.
Internal
Дополнение после знака или указателя основания.
dec
Десятичное преобразование.
oct
Восьмеричное преобразование.
hex
Шестнадцатеричное преобразование.
showbase
Показывает в выводе индикатор основания.
showpoint
Показывает при выводе с плавающей точкой десятичную точку.
uppercase
Преобразует шестнадцатеричный вывод в верхний регистр.
showpos
Выводит с положительными числами символ '+'.
scientific
Добавляет к числам с плавающей точкой суффикс с показателем степени (E).
fixed
Для вывода чисел с плавающей точкой использует десятичную фиксированную точку.
unitbuf
После включения выводит все потоки.
stdio
После включения выводит stdout и stderr.
Таблица 2 – Функции-элементы
-
Функция
Описание
Constructor
Связывает данный streambuf с потоком или строит объект ios без соответствующего streambuf.
bad
Не 0 в случае ошибки.
bitalloc
Получает новый флаг битового набора. Возвращаемое значение может использовать для установки, очистки и проверки флаги. Это флаги форматирования, определяемые пользователем.
eof
В конце файла возвращает ненулевое значение.
fail
Не 0 при неуспешном выполнении операции.
fill
Возвращает текущий символ-заполнитель или сбрасывает его, возвращает предыдущий символ.
flags
Сбрасывает текущие флаги форматирования.
good
Не 0, если биты состояния не установлены (то есть нет ошибок).
presicion
Возвращает текущую точность числа с плавающей точкой.
rdbuf
Возвращает указатель на streambuf, назначенный для данного потока.
rdstate
Устанавливает флаги в соответствии с заданным значением.
setf
Возвращает ранее установленные флаги.
sync_with_stdio
Смешивает файлы stdio и потоки iostreams. В новой программе этого использовать не следует.
tie
Возвращает связанный поток или NULL, если такого потока не существует, или связывает с выходным потоком другой поток.
unseft
Очищает биты, соответствующие f, и возвращает значение, представляющее собой предыдущие установки.
with
Возвращает или устанавливает текущую ширину.
xalloc
Возвращает индекс в массиве ранее не используемых слов, которые можно применять как флаги форматирования.
init
Выполняет фактическую инициализацию.
selstate
Устанавливает все биты состояния.
Таблица 3 – Объекты потоковых классов
-
Класс
Объект
Поток данных
Устройство
istream
cin
stdin
Устройство ввода, по умолчанию –
Клавиатура.
ostream
cout
stdout
Устройство вывода, по умолчанию –
Дисплей.
ostream
cerr
stderr
Стандартное устройство вывода ошибок, по умолчанию – дисплей.
ostream
clog
stderr
Стандартное устройство вывода ошибок, по умолчанию – дисплей.
Вся необходимая дополнительная информация приводится в пунктах 11.1, 11.2, 11.3 настоящего УМК.
Задания:
В Borland C++ Builder разработать программу анализа текста и вывода его на экран.