- •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. Динамическое распределение памяти
- •Упражнение
- •Лабораторная работа “Генеалогическое дерево”
- •Варианты заданий
- •Литература
- •Содержание
На этом этапе можно продолжить проектирование в одном из двух направле-
ний:
раскрывая абстракцию <Анализ блока> в виде сегмента С3.2 (процедура без параметров Block) соответствии с правилом 3;
продолжая ветвь Zagolovok, раскрывая абстракцию <Анализ имени процедуры> в виде сегмента С4.1 (процедура без параметров Name).
Второе направление более естественно с точки зрения построения тестов: после контроля символа procedure провести вначале контроль структуры <имя>, а потом - контроль структуры <блок>.
Таким образом, каждый последующий этап состоит в разработке сегмента-процедуры для анализа очередного нетерминального символа в соответствии с порождающим правилом и отладке этой процедуры с использованием заглушки.
Такой нисходящий подход к проектированию и тестированию программы позволяет остановить процесс разработки проекта «Синтаксический анализатор» на любом этапе, если объем программы превысил допустимую границу.
Полученная программа будет иметь следующую структуру:
С1
С2
С3.1 С3.2
С4.1 С4.2
С5.1
На рисунке видно, что структура программы грамматического разбора синтаксических правил языка Паскаль отражает структуру этих правил. Как говорят, программа " Синтаксический анализатор " синтаксически зависима от языка: для каждого конкретного языка требуется писать заново программу "Синтаксический анализатор ". Такая зависимость объясняется тем, что входные данные не отражают структуры языка: язык представлен простой последовательностью символов. В таких случаях алгоритм имеет максимальную сложность. Если синтаксисические правила языка отразить в структуре данных, то можно разработать программу "Синтаксический анализатор" управляемую синтаксисом и не зависящую от конкретного языка. В следующей главе рассмотрена возможность отражения структуры правил в структуре данных.
Ниже описаны программа и процедуры в виде отдельных фрагментов как результат последовательных этапов проектирования.
{Синтаксический
анализ конструкции <описание процедуры>}
С1
program
Analiz_Proced
(f);
uses crt;
var ch,c,num:char;
filename:string[40];
f:text;
begin
{Главная
программа}
repeat {Оболочка
для тестирования}
{Подготовка
файла}
chdir('c:\mam\recurs');
{Установка директории}
writeln(' Введите
номер файла');
readln(num);
filename:='example'+num+'.txt';
assign (f,filename);
reset (f);
clrscr; {Очистка
экрана}
Declare_Proced;
if ch = ';' then
writeln(' Ошибок
нет');
writeln ('Продолжить
тестирование? (y/n)');
readln
(c);
until
Block(c='n')
or (c='N')
end.
С2
{<описание
процедуры> ::=
<заголовок
процедуры><блок>}
procedure
Declare_Proced;
begin
Zagolovok;
{Анализ
блока}
Block
end;
С3.1
{<заголовок
процедуры> ::= procedure <имя>}
procedure Zagolovok;
var
str10 : string[10];
begin read
(f,str10); if
str10 = 'procedure ' then
Name
else
begin
writeln('
Ошибка
в
слове
"procedure" ');
ch:=str10[10]
end
end;
{<блок> ::=
begin<последовательность операторов>end}
C3.2
procedure
Block;
var str6:string[6];
str3:string[3];
begin
read (f,str6);
{Анализ
последовательности операторов}
Posledovat;
if ch = ' ' then
begin {анализ
конца последовательности}
read
(f,str3);
if str3
<> 'end' then writeln(' Нет
слова
"end" ') else
read (f,ch)
end
else
begin
writeln('
Ошибка в последовательности операторов
');
ch:=str6[6]
end
end;
{<имя> ::=
<буква><имя><буква><имя><цифра>}
C4.1
procedure Name;
{------------------------------------------------------------------------
-------}
{контроль
рекурсивной части}
{<имя> ::=
<имя><буква><имя><цифра>}
procedure Scan;
{Рекурсивная процедура}
С5.1
begin
read(f,ch); {чтение
очередного символа}
if
ch in ['A' .. 'Z', '0' .. '9']
then
Scan
{продолжить чтение}
end {Scan};
{-------------------
-----------------------------------------------------------}
begin { алгоритм
Name }
read(f,ch);{ чтение
первого символа}
if
ch in ['A' .. 'Z'] then
begin
{первый символ - буква}
Scan;
{ просмотр текста , пока буква или цифра
}
if
ch <> ';' then writeln ('Ошибка
в
имени')
end
else
writeln ('Имя
начинается не с буквы')
end {Name};
{<последовательность
операторов>::=<любые-символы- C4.2
{Заглушка}
кроме-пробела>}
procedure Posledovat;
{Рекурсивная}
begin
read (f,ch);
if (ch <> ') and not
eof(f) then
{просмотр
последовательности операторов}
Posledovat;
end;
Варианты лабораторной работы " Синтаксический анализатор "
15. Оператор ДО
Оператор ДЛЯ
Описание констант
Описание типа
Описание переменных
Описание процедуры
Описание функции
Оператор выбора
Отношение
Программа
Список формальных
параметров
Указатель функции
Оператор
присваивания
Интервальный тип
Число со знаком
Переменная
Выражение целое
Выражение
вещественное
Выражение
логическое
Тип «массив»
Тип «файл»
Тип «запись»
Тип «множество»
Блок
Оператор процедуры
Составной оператор
Оператор ЕСЛИ
Оператор ПОКА