- •1. Рекурсивные алгоритмы
- •1.1. Основные определения
- •1.2. Накопления суммы или произведения.
- •Упражнение
- •Варианты задач
- •1.3. Быстрая сортировка
- •1.5.1.Основные определения
- •1.5.2. Пример задания некоторого языка l1 в бнф
- •1.5.3. Пример разработки программы "Синтаксический анализатор "
- •Ошибок нет Нет символа "[" Ошибка в выраженииВыходная форма:
- •2 Этап. Разбор второго правила. Раскрытие процедуры SimpExpr.
- •1.5.4. Лабораторная работа " Синтаксический анализатор "
- •Итак, метод для рассматриваемой задачи будет описан в виде синтаксических
- •На этом этапе можно продолжить проектирование в одном из двух направле-
- •2. Рекурсивный тип данных
- •Основные определения
- •2.2. Динамическое распределение памяти
- •Упражнение
- •Лабораторная работа “Генеалогическое дерево”
- •Варианты заданий
- •Литература
- •Содержание
1.5.4. Лабораторная работа " Синтаксический анализатор "
Составить программу, проверяющую синтаксическую правильность заданной конструкции языка Паскаль.
Рассмотрим методику поэтапного выполнения лабораторной работы.
Методические указания.
Этап 1. Разработка спецификации задачи.
Задача. Провести синтаксический контроль конструкции
<описание процедуры>.
2. Входные данные.
лит ch - входной символ
ch
<ch><ch>...<ch>
файл
3. Выходные данные.
Выходная форма:
Ошибок нет
<Реакция на аномалии>
4. Метод. Выбор подмножества L2 языка Паскаль .
1) В синтаксической таблице БНФ выбрать начальный символ языка L2 ( на-
пример, <описание процедуры>) и порождающее правило:
<описание процедуры> ::= <заголовок>;<блок>.
2) Если порождающее правило громоздкое, то часть логических ветвей можно
отбросить (по указанию преподавателя).
3) Для каждого нетерминального символа из правой части правила
(<заголовок>, <блок>) записать порождающее правило.
4) Повторять п.3 для каждого нового правила до выполнения следующих ус -ловий:
- порождающее правило в правой части содержит только терминальные
символы языка Паскаль;
- если сложность программы С = m*n >30, где m - число порождающих правил, а n - общее число логических ветвей в правилах, то в целях ограничения программы использовать заглушки. Например, в рассматриваемой задаче во втором правиле оставляется ветвь «процедура без параметров» (отбрасывается ветвь описа- ния процедуры с параметрами), в третьем правиле при описании символа <блок> оставляем только «составной оператор» (отбрасывается раздел описаний) и <последовательность операторов> заменяется на <последовательность символов>.
Итак, метод для рассматриваемой задачи будет описан в виде синтаксических
правил (БНФ):
1) <описание процедуры> ::= <заголовок>;<блок>.
2) <заголовок> ::= procedure <имя>
3) <блок> ::= begin<последовательность операторов>end
4) <имя> ::= <буква><имя><буква><имя><цифра>
5) <буква> ::= ABDDEFGHIJKLMNOPQRSTUVWXYZ
6) <цифра> ::= 0123456789
7) <последовательность операторов> ::= <символ>
<последовательность операторов><символ>
8) <символ> ::= <любой символ кроме пробела>
5. Аномалии.
Ограничено использование пробелов:
- последовательность символов должна отделяться одним пробелом от оператор-
ных скобок begin, end.
- имени процедуры должен предшествовать один пробел.
Так как разбор каждого нетерминального символа представлен в виде процедуры, то анализ каждой конструкции и сообщения об ошибках локализованы в этой процедуре.
Функциональные тесты
Исходные данные Ожидаемые результаты
procedure A12;begin p end; Ошибок нет
procedure A12;beginsl end Ошибка в последовательности операторов
proсedure A12;begin kd end; Ошибка в слове "procedure"
procedure 1a3;begin ad end; Имя начинается не с буквы
procedure A*4; Ошибка в имени
procedure D5;begin rty ; Нет слова "end"
Этап 2. Проектирование и отладка интерфейса программы.
На этом этапе описываются входные и выходные данные программы и разрабатывается интерфейс пользователя в виде программной оболочки, обеспечивающей удобный диалог для тестирования программы при различных исходных данных, размещенных в разных файлах.
Получаем сегмент С1 - корневой сегмент td-графа - структурной схемы программы.
В этом сегменте имеется только одна абстракция <Анализ описания процедуры>. Для отладки программы абстракцию раскрываем как заглушку ch := ‘;’ , оставляя абстракцию в виде комментария.
Этап 3. Синтаксический анализ первого правила.
Абстракцию раскрываем в виде процедуры без параметров. Она содержит две абстракции, соответствующие двум нетерминальным символам правой части правила 1.
Для отладки программы с этой процедурой надо в программе Analiz_Proced абстракцию <Анализ описания процедуры> заменить заглушку оператором процедуры Declare_Proced.
В процедуре Declare_Proced (Сегмент С2) абстракцию <Анализ заголовка> раскрываем в виде заглушки ch := ‘;’ , а <Анализ блока> в виде пустого оператора, оставляя абстракции в виде комментариев.
Этап 4. Переход от первого правила к следующим.
Раскрываем абстракцию <Анализ заголовка> и <Анализ блока> в виде
сегментов С3.1 и С3.2 (процедур без параметров Zagolovok и Block) в соответствии с правилами 2) и 3).
Е
procedure;
Этап 5. Выбор дальнейшего пути проектирования.