Лабораторная работа № 10.
Разработка синтаксического анализатора

Разработать с помощью нисходящего подхода программу для анализа выражения, записанного с помощью БНФ. Терминальные символы могут быть записаны большими или маленькими буквами. Лексемы могут разделяться любым количеством пробелов (в том числе в некоторых случаях нулевым количеством пробелов). Описание

Программа, которая распознаёт предложения какого-либо языка, строится на основе анализа БНФ. Поскольку они содержат рекурсивные правила для определения конструкций этого языка, программная реализация также требует использования рекурсивных подпрограмм.

Правила БНФ, общие для всех вариантов: <имя> ::= <буква> | <имя><буква> | <имя><цифра> <число> ::= <целое число> | <вещественное число> <целое число> ::= +<цифры> | -<цифры> | <цифры> <вещественное число> ::= +<цифры>.<цифры> | -<цифры>.<цифры> | <цифры>.<цифры> <цифры> ::= <цифра> | <цифра><цифры> <буква> ::= _ | A | B | … | Z | a | b | … | z <цифра> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

 

  1. Составной оператор <составной оператор> ::= BEGIN <операторы> END; <операторы> ::= <оператор присваивания> | <оператор присваивания> <операторы> <оператор присваивания> ::= <имя> := <число>;
  2. Арифметическое выражение <арифметическое выражение> ::= <имя> | <число> | <имя> <знак> <арифметическое выражение> | <число> <знак> <арифметическое выражение> <знак> ::= * | / | + | -
  3. Логическое выражение <логическое выражение> ::= FALSE | TRUE | <имя> | NOT <имя> | <имя> OR <логическое выражение> | <имя> AND <логическое выражение>
  4. Раздел констант <раздел констант> ::= CONST <описание констант> <описание констант> ::= <описание константы> | <описание константы> <описание констант> <описание константы> ::= <имя> = <число>;
  5. Описание типа <описание типа> ::= TYPE <имя> = <тип-диапазон>; | TYPE <имя> = ^<имя>; <тип-диапазон> ::= <целое число>..<целое число>
  6. Вызов функции <вызов функции> ::= <имя> := <имя>(<параметр>); <параметр> ::= <имя> | <число> | <выражение> <выражение> ::= <имя> DIV <число> | <имя> MOD <число>
  7. Вызов процедуры <вызов процедуры> ::= <имя>(<список параметров>); <список параметров> ::= <число> | <число>, <список параметров>
  8. Выражение отношения <выражение отношения> ::= <операнд> <операция> <операнд> <операнд> ::= <имя> | <число> <операция> ::= = | <> | < | > | <= | >=
  9. Индексное выражение <индексное выражение> ::= <имя>[<индексы>] <индексы> ::= <число> | <число>, <индексы>
  10. Перечислимый тип <перечислимый тип> ::= (<элементы>) <элементы> ::= <элемент> | <элемент>, <элементы> <элемент> ::= <имя> = <число>
  11. Составной оператор <составной оператор> ::= BEGIN <операторы> END; <операторы> ::= <оператор присваивания> | <оператор присваивания> <операторы> <оператор присваивания> ::= <имя> := <число>;
  12. Арифметическое выражение <арифметическое выражение> ::= <имя> | <число> | <имя> <знак> <арифметическое выражение> | <число> <знак> <арифметическое выражение> <знак> ::= * | / | + | -
  13. Логическое выражение <логическое выражение> ::= FALSE | TRUE | <имя> | NOT <имя> | <имя> OR <логическое выражение> | <имя> AND <логическое выражение>
  14. Раздел констант <раздел констант> ::= CONST <описание констант> <описание констант> ::= <описание константы> | <описание константы> <описание констант> <описание константы> ::= <имя> = <число>;
  15. Описание типа <описание типа> ::= TYPE <имя> = <тип-диапазон>; | TYPE <имя> = ^<имя>; <тип-диапазон> ::= <целое число>..<целое число>
  16. Вызов функции <вызов функции> ::= <имя> := <имя>(<параметр>); <параметр> ::= <имя> | <число> | <выражение> <выражение> ::= <имя> DIV <число> | <имя> MOD <число>
  17. Вызов процедуры <вызов процедуры> ::= <имя>(<список параметров>); <список параметров> ::= <число> | <число>, <список параметров>
  18. Выражение отношения <выражение отношения> ::= <операнд> <операция> <операнд> <операнд> ::= <имя> | <число> <операция> ::= = | <> | < | > | <= | >=
  19. Индексное выражение <индексное выражение> ::= <имя>[<индексы>] <индексы> ::= <число> | <число>, <индексы>
  20. Перечислимый тип <перечислимый тип> ::= (<элементы>) <элементы> ::= <элемент> | <элемент>, <элементы> <элемент> ::= <имя> = <число>
  21. Составной оператор <составной оператор> ::= BEGIN <операторы> END; <операторы> ::= <оператор присваивания> | <оператор присваивания> <операторы> <оператор присваивания> ::= <имя> := <число>;
  22. Арифметическое выражение <арифметическое выражение> ::= <имя> | <число> | <имя> <знак> <арифметическое выражение> | <число> <знак> <арифметическое выражение> <знак> ::= * | / | + | -
  23. Логическое выражение <логическое выражение> ::= FALSE | TRUE | <имя> | NOT <имя> | <имя> OR <логическое выражение> | <имя> AND <логическое выражение>
  24. Раздел констант <раздел констант> ::= CONST <описание констант> <описание констант> ::= <описание константы> | <описание константы> <описание констант> <описание константы> ::= <имя> = <число>;
  25. Описание типа <описание типа> ::= TYPE <имя> = <тип-диапазон>; | TYPE <имя> = ^<имя>; <тип-диапазон> ::= <целое число>..<целое число>
  26. Вызов функции <вызов функции> ::= <имя> := <имя>(<параметр>); <параметр> ::= <имя> | <число> | <выражение> <выражение> ::= <имя> DIV <число> | <имя> MOD <число>
  27. Вызов процедуры <вызов процедуры> ::= <имя>(<список параметров>); <список параметров> ::= <число> | <число>, <список параметров>
  28. Выражение отношения <выражение отношения> ::= <операнд> <операция> <операнд> <операнд> ::= <имя> | <число> <операция> ::= = | <> | < | > | <= | >=
  29. Индексное выражение <индексное выражение> ::= <имя>[<индексы>] <индексы> ::= <число> | <число>, <индексы>
  30. Перечислимый тип <перечислимый тип> ::= (<элементы>) <элементы> ::= <элемент> | <элемент>, <элементы> <элемент> ::= <имя> = <число>