- •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. Динамическое распределение памяти
- •Упражнение
- •Лабораторная работа “Генеалогическое дерево”
- •Варианты заданий
- •Литература
- •Содержание
2 Этап. Разбор второго правила. Раскрытие процедуры SimpExpr.
В этом правиле определение состоит из нерекурсивной и рекурсивной части. Разбор рекурсивной части представим как рекурсивную процедуру Scan, которая сканирует (просматривает) файл f символ за символом, проверяя правильность построения выражения. Раскроем процедуру Scan: С3
procedure
Scan;
begin
read(f,ch);
{Проверка
«+<буква>»}
if ch = '+' then
begin
read(f,ch);
if ch in [A,B] then
Scan
end
else
{Проверка
«-<цифра>»}
if ch = '-' then
begin
read
(f,ch);
if ch in
[1..3] then
Scan
end
end
.
procedure SimpExpr;
begin
read(f,ch);
{Проверка первого символа}
if ch in [A,B,1..3] then
Scan;
end
Раскроем процедуру обработки ошибок.
procedure
Error
(i:byte); С2.2
begin
case i of
1:
writeln('Нет
символа
[');
2: writeln(' Ошибка
в выражении')
end {case}
end
Упражнение.
Каждый из вариантов заданий содержит описание синтаксиса некоторого языка в Бэкус-Науровой Форме (БНФ). Разработать синтаксический анализатор языка, заданного этими синтаксическими правилами.
При решении задачи использовать методику, описанную выше в примере грамматического разбора языка L1.
Анализируемые тексты вводятся посимвольно из текстового файла.
Правила и ограничения при использовании разделителей: пробелы, конечный символ и т.д. должны быть отражены в спецификации задачи.
В качестве функциональных тестов привести примеры правильных грамматических конструкций, а также примеры с ошибками, которые могут быть найдены анализатором.
Варианты заданий
1. <оператор присваивания>::=<буква>:=<строка>
<строка>::=’<последовательность символов>’
<последовательность символов>::=<символ>
<последовательность символов><символ>
2. <арифметический терм>::=<буква><цифра>
<арифметический терм><буква>
<арифметический терм>/<цифра>
<логическое выражение>::=<буква>NOT<буква>
<логическое выражение>OR<буква>
4 . <описание константы>::=CONST<имя>=<значение>
<имя>::=<буква><имя><цифра>
<значение><::= -<цифра><значение><цифра>
5. <конструктор множества>::=[<список выражений>]
<список выражений>::=<выражение><список выражений>,<выражение>
<выражение>::=<буква><выражение>-<цифра>
<интервальный тип>::=<константа>..<константа>
<константа>::=<имя><число>
<имя>::=<буква>
<число>::=< цифра><число><цифра>
<логический терм>::=FALSE<буква> <логический терм> AND <буква>
<указатель функции>::=<имя>(<выражение>)
<имя>::=<буква> <имя><буква><имя><цифра>
<выражение>::=<цифра><выражение>+<буква>
9. <отношение>::=<выражение>=<выражение>
<выражение>::=<имя><константа>
<имя>::=<буква>
<константа>::=<цифра><константа><цифра>
10. <вещественное число>::=<число>.<число>-<число>.<число>
<число>::=<цифра><число><цифра>
11. <логическое выражение>::=<буква>
<логическое выражение>OR<буква>
<логическое выражение>OR NOT<буква>
12. <оператор присваивания>::=<переменная>:=<выражение>
<переменная>::=<имя>
<выражение>::=’<последовательность символ>’
<имя>::=<буква><имя><буква>
<последовательность символов>::=<символ>
<последовательность символов><символ>
13. <арифметический терм>::=<множитель><множитель>
<множитель>::=<имя><константа>
<имя>::=<буква><имя><цифра>
<константа>::=<цифра><константа><цифра>
<блок>::=BEGIN<оператор>END
<оператор>::=<оператор процедуры>
<оператор процедуры>::=<имя>(<список параметров>)
<список параметров>::=<имя><список параметров>,<имя>
<имя>::=<буква>
15. <запись>::=RECORD<список полей>END
<список полей>::=< поле><список полей>;<поле>
<поле>::=<имя>:<тип>
<тип>::=<имя>
<имя>::=<буква><имя><буква>
<переменная с индексом>::=<буква>[<список индексов>]
<список индексов>::=<индекс>,<индекс>
<индекс>::=<имя>
<имя>::=<буква><имя><буква>
17. <вещественное число>::=<целое число><натуральное число>
<целое число>::=<натуральное число>-<натуральное число>
<натуральное число>::=<цифра><натуральное число><цифра>
<логическое выражение>::=TRUE <логическое выражение>OR <буква>
<логическое выражение>AND<буква>
19. <заголовок>::=PROCEDURE<имя>(<список параметров>)
<список параметров>::=<параметр><список параметров>;<параметр>
<параметр>::=<имя> : <тип>
<тип>::=<имя>
<имя>::=<буква>
20. <отношение>::=<выражение>=<выражение>
<выражение>::=<имя><число>
<имя>::=<буква>
<число>::=<цифра>-<цифра><число><цифра>
21. <арифметическое выражение>::=<буква><цифра>-<цифра>
<арифметическое выражение>+<буква>
<арифметическое выражение>/<цифра>
22. <интервальный тип>::=<константа>..<константа>
<константа>::=<цифра>-<цифра><константа><цифра>
23. <описание типа>::=TYPE<имя>=<тип>
<тип>::=<имя>
<имя>::=<буква><имя><буква><имя><цифра>
24. <вещественное число>::=<целое число><целое число>
<целое число>::=<цифра>-<цифра><целое число><цифра>
25. <указатель функции>::=<имя>(<выражение>);
<имя>::=<буква><имя><цифра>
<выражение>::=<цифра><выражение>-<буква>
26. <литерное выражение>::=<переменная><литерное выражение>+<переменная>
<переменная>::=<имя>
<имя>::=<буква><имя><буква>имя><цифра>
27. <логический терм>::=<буква>TRUE<логический терм>AND<буква>