Разработать с помощью нисходящего подхода программу для анализа выражения, записанного с помощью БНФ. Терминальные символы могут быть записаны большими или маленькими буквами. Лексемы могут разделяться любым количеством пробелов (в том числе в некоторых случаях нулевым количеством пробелов).
Программа, которая распознаёт предложения какого-либо языка, строится на основе анализа БНФ. Поскольку они содержат рекурсивные правила для определения конструкций этого языка, программная реализация также требует использования рекурсивных подпрограмм.
Правила БНФ, общие для всех вариантов:
<имя> ::= <буква> | <имя><буква> | <имя><цифра>
<число> ::= <целое число> | <вещественное число>
<целое число> ::= +<цифры> | -<цифры> | <цифры>
<вещественное число> ::= +<цифры>.<цифры> | -<цифры>.<цифры> | <цифры>.<цифры>
<цифры> ::= <цифра> | <цифра><цифры>
<буква> ::= _ | A | B | … | Z | a | b | … | z
<цифра> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<составной оператор> ::= BEGIN <операторы> END;
<операторы> ::= <оператор присваивания> | <оператор присваивания> <операторы>
<оператор присваивания> ::= <имя> := <число>;
<арифметическое выражение> ::= <имя> | <число> |
<имя> <знак> <арифметическое выражение> |
<число> <знак> <арифметическое выражение>
<знак> ::= * | / | + | -
<логическое выражение> ::= FALSE | TRUE | <имя> | NOT <имя> |
<имя> OR <логическое выражение> |
<имя> AND <логическое выражение>
<раздел констант> ::= CONST <описание констант>
<описание констант> ::= <описание константы> | <описание константы> <описание констант>
<описание константы> ::= <имя> = <число>;
<описание типа> ::= TYPE <имя> = <тип-диапазон>; | TYPE <имя> = ^<имя>;
<тип-диапазон> ::= <целое число>..<целое число>
<вызов функции> ::= <имя> := <имя>(<параметр>);
<параметр> ::= <имя> | <число> | <выражение>
<выражение> ::= <имя> DIV <число> | <имя> MOD <число>
<вызов процедуры> ::= <имя>(<список параметров>);
<список параметров> ::= <число> | <число>, <список параметров>
<выражение отношения> ::= <операнд> <операция> <операнд>
<операнд> ::= <имя> | <число>
<операция> ::= = | <> | < | > | <= | >=
<индексное выражение> ::= <имя>[<индексы>]
<индексы> ::= <число> | <число>, <индексы>
<перечислимый тип> ::= (<элементы>)
<элементы> ::= <элемент> | <элемент>, <элементы>
<элемент> ::= <имя> = <число>
<составной оператор> ::= BEGIN <операторы> END;
<операторы> ::= <оператор присваивания> | <оператор присваивания> <операторы>
<оператор присваивания> ::= <имя> := <число>;
<арифметическое выражение> ::= <имя> | <число> |
<имя> <знак> <арифметическое выражение> |
<число> <знак> <арифметическое выражение>
<знак> ::= * | / | + | -
<логическое выражение> ::= FALSE | TRUE | <имя> | NOT <имя> |
<имя> OR <логическое выражение> |
<имя> AND <логическое выражение>
<раздел констант> ::= CONST <описание констант>
<описание констант> ::= <описание константы> | <описание константы> <описание констант>
<описание константы> ::= <имя> = <число>;
<описание типа> ::= TYPE <имя> = <тип-диапазон>; | TYPE <имя> = ^<имя>;
<тип-диапазон> ::= <целое число>..<целое число>
<вызов функции> ::= <имя> := <имя>(<параметр>);
<параметр> ::= <имя> | <число> | <выражение>
<выражение> ::= <имя> DIV <число> | <имя> MOD <число>
<вызов процедуры> ::= <имя>(<список параметров>);
<список параметров> ::= <число> | <число>, <список параметров>
<выражение отношения> ::= <операнд> <операция> <операнд>
<операнд> ::= <имя> | <число>
<операция> ::= = | <> | < | > | <= | >=
<индексное выражение> ::= <имя>[<индексы>]
<индексы> ::= <число> | <число>, <индексы>
<перечислимый тип> ::= (<элементы>)
<элементы> ::= <элемент> | <элемент>, <элементы>
<элемент> ::= <имя> = <число>
<составной оператор> ::= BEGIN <операторы> END;
<операторы> ::= <оператор присваивания> | <оператор присваивания> <операторы>
<оператор присваивания> ::= <имя> := <число>;
<арифметическое выражение> ::= <имя> | <число> |
<имя> <знак> <арифметическое выражение> |
<число> <знак> <арифметическое выражение>
<знак> ::= * | / | + | -
<логическое выражение> ::= FALSE | TRUE | <имя> | NOT <имя> |
<имя> OR <логическое выражение> |
<имя> AND <логическое выражение>
<раздел констант> ::= CONST <описание констант>
<описание констант> ::= <описание константы> | <описание константы> <описание констант>
<описание константы> ::= <имя> = <число>;
<описание типа> ::= TYPE <имя> = <тип-диапазон>; | TYPE <имя> = ^<имя>;
<тип-диапазон> ::= <целое число>..<целое число>
<вызов функции> ::= <имя> := <имя>(<параметр>);
<параметр> ::= <имя> | <число> | <выражение>
<выражение> ::= <имя> DIV <число> | <имя> MOD <число>
<вызов процедуры> ::= <имя>(<список параметров>);
<список параметров> ::= <число> | <число>, <список параметров>
<выражение отношения> ::= <операнд> <операция> <операнд>
<операнд> ::= <имя> | <число>
<операция> ::= = | <> | < | > | <= | >=
<индексное выражение> ::= <имя>[<индексы>]
<индексы> ::= <число> | <число>, <индексы>
<перечислимый тип> ::= (<элементы>)
<элементы> ::= <элемент> | <элемент>, <элементы>
<элемент> ::= <имя> = <число>