
- •Содержание
- •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. Организация рейтингового контроля по дисциплине «Системное программное обеспечение. Синтаксические анализаторы»
5.4.2.Детерминированные и недетерминированные конечные автоматы
Конечный автомат M(Q,V,,q0,F) называют детерминированным конечным автоматом (ДКА), если в каждом из его состояний для любого входного символа функция перехода содержит не более одного состояния: aV, VqQ: либо (a,q) = {r}, rQ либо (a,q) = .
В противном случае конечный автомат называют недетерминированным.
ДКА может быть задан в виде пятерки: M(QV,β,q0,F),
где Q — конечное множество состояний автомата; V — конечное множество допустимых входных символов; 8 — функция переходов, отображающая V*Q в множество Q: (a,q) = г, aV, q,rQ; q0 — начальное состояние автомата Q, q0Q; F — непустое множество конечных состояний автомата, FQ, F≠.
Если функция переходов ДКА определена для каждого состояния автомата, то автомат называется полностью определенным ДКА: aV, qQ: либо (a,q) = r, rQ.
Моделировать работу ДКА существенно проще, чем работу произвольного КА.
Доказано, что для любого КА можно построить эквивалентный ему ДКА. Поэтому используемый произвольный КА стремятся преобразовать в ДКА. При построении компиляторов чаще всего используют полностью определенный ДКА.
5.4.3.Преобразование конечного автомата к детерминированному виду
Алгоритм преобразования произвольного КА M(Q,V,,q0,F) в эквивалентный ему ДКА M'(Q',V,',q'0,F') заключается в следующем:
1. Множество состояний Q' автомата М' строится из комбинаций всех состояний множества Q. автомата М. Если q1,q2,...,qn, n > 0 — состояния автомата М, 0 < i < n q1Q, то всего будет 2n-1 состояний автомата М'. Обозначим их так: [q1,q2,...,qm]. 0<mn.
2. Функция переходов ' автомата М' строится так: '(a,[q1,q2,...,qm]) = [r1,r2,...,rk], где 0<im0<jk так, что (a,qi) = rj;
3. Обозначим q'0 = [q0];
4. Пусть f1,f2,...,fl, l > 0 — конечные состояния автомата М, O < i < l flF, тогда множество конечных состояний F' автомата М' строится из всех состояний, имеющих вид [...,fl...], flF.
Доказано, что описанный выше алгоритм строит ДКА, эквивалентный заданному произвольному КА.
После построения из нового ДКА необходимо удалить все недостижимые состояния.
Состояние qQ,B КА М(О,У,,q0,Р) называется недостижимым, если ни при какой входной цепочке V+ невозможен переход автомата из начального состояния q0 в состояние q. Иначе состояние называется достижимым.
Для работы алгоритма удаления недостижимых состояний используются два множества: множество достижимых состояний R и множество текущих активных состояний на каждом шаге алгоритма Р,. Результатом работы алгоритма является полное множество достижимых состояний R. Рассмотрим работу алгоритма по шагам:
1. R:={q0}; i:=0; P0:={q0};
2. Рi+1:=0;
3. aV, qP,: Pi+1:=Pi+1(a,q);
4. Если Рi+1-R = , то выполнение алгоритма закончено, иначе R:=RPi+1, i:=i+1 и перейти к шагу 3.
После выполнения данного алгоритма из КА можно исключить все состояния не входящие в построенное множество R.
Рассмотрим работу алгоритма преобразования произвольного КА в ДКА на примере автомата M({H,A,B,S},{a,b},,H,{S}); : (Н,b) = В, (В,а) = A, (A,b) = {B,S}. Видно, что это недетерминированный КА (из состояния А возможны два различных перехода по символу b). Граф переходов для этого автомата был изображен выше на рис. 5.1.
Построим множество состояний эквивалентного ДКА:
Q'={[H], [А], [В], [S], [НА], [НВ], [HS], [АВ], [AS], [BS], [НАВ], [HAS], [HBS], [ABS],[HABS]}
Построим функцию переходов эквивалентного ДКА:
'([Н],b) = [В]
'([A],b) = [BS]
'([В],а) = [А]
'([HA],b) = [BS]
'([НВ],а) = [А]
'([НВ],b) = [В]
'([HS],b) = [В]
'([АВ],а) = [А]
'([AB],b) = [BS]
'([AS],b) = [BS]
'([BS],a) = [А]
'([НАВ],а) = [А]
'([НАВ],b) = [BS]
'([HAS],b) = [BS]
'([HBS],b) = [В]
'([HBS],a) = [А]
'([ABS],b) = [BS]
'([ABS],a) = [A]
'([HABS],a) = [A]
'([HABS],b) = [BS]
Начальное состояние эквивалентного ДКА:
q'0 = [Н]
Множество конечных состояний эквивалентного ДКА:
F' = {[S],[HS],[AS],[BS],[HAS],[HBS],[ABS],[HABS]}
После построения ДКА исключим недостижимые состояния. Множество достижимых состояний ДКА будет следующим R = {[H],[B],[A],[BS]}. В итоге, исключив все недостижимые состояния, получим ДКА:
M'({[H],[B],[A],[BS]},{a,b},[H],{[BS]}).
([H],b)=[B], ([B],a)=[A], ([A],b)=[BS], ([BS],a)=[A]
Ничего не изменяя, переобозначим состояния ДКА. Получим:
M'({H,B,A,S},{a,b},H,{S}),
(H,b)=B, (B,a)=A, (A,b)=S, (S,a)=A
Граф переходов полученного ДКА изображен на рис. 5.3.
Рис. 5.3. Граф переходов детерминированного конечного автомата
Этот автомат можно преобразовать к полностью определенному виду. Получим граф состояний, изображенный на рис. 5.4 (состояние Е — это состояние «ошибка»).
Рис. 5.4. Граф переходов полностью определенного детерминированного конечного автомата
При построении распознавателей к вопросу о необходимости преобразования КА в ДКА надо подходить, основываясь на принципе разумной достаточности. Моделировать работу ДКА существенно проще, чем произвольного КА, но при выполнении преобразования число состояний автомата может существенно возрасти и, в худшем случае, составит 2n-1, где n — количество состояний исходного КА. В этом случае затраты на моделирование ДКА окажутся больше, чем на моделирование исходного КА. Поэтому не всегда выполнение преобразования автомата к детерминированному виду является обязательным.