Лабораторная №2 — задание 2.1E #
Нужно написать EBNF грамматику для некоторых лексем в одном из двух языков программирования, выбранных аналитиком в лабораторной №1.
Информация об этих языках записана в каталоге docs/competitors/ вашего проекта.
Порядок выполнения #
- Найдите описание правил EBNF и изучите его
- Найдите и изучите пример EBNF грамматики для лексем какого-либо языка программирования
- Найдите и изучите документацию по лексической структуре языка, для которого вы будете описывать грамматику лексем
- Опишите в EBNF следующие типы лексем:
- идентификатор (identifier)
- литералы целых чисел (integer number)
- литералы чисел с плавающей точкой (real number)
- литералы строк (string literal)
Требования к EBNF грамматике лексики языка #
- Сохраните грамматику в markdown файл
docs/theory/EBNF-for-lexemes.md- В начале файла укажите, для какого языка и какие лексемы вы описываете
- Грамматика должна быть описана по правилам EBNF (Extended Backus-Naur Form)
- не путайте EBNF с более ранней нотацией BNF (Backus-Naur Form)
- Грамматика должна содержать следующие типы лексем:
- идентификатор (identifier)
- литералы целых чисел (integer number)
- литералы чисел с плавающей точкой (real number)
- литералы строк (string literal)
- Вы можете взять описание лексем в EBNF из документации языка, из примеров в сети либо составить самостоятельно
Справочные материалы #
Символы в нотации EBNF #
Стандарт ISO для EBNF определяет такие символы:
| Символ EBNF | Запись | Описание |
|---|---|---|
| definition | = | Правило, то есть определение нетерминального символа через ряд других символов |
| concatenation | , | Конкатенация символов |
| termination | ; | Конец правила |
| alternation | | | Альтернативные варианты правила |
| optional | [ … ] | Опциональная часть правила (0 или 1 раз) |
| repetition | { … } | Повторяющаяся часть правила (0, 1 или много раз) |
| grouping | ( … ) | Атомарная группа символов |
| terminal string | " … " | Терминальный символ (строка или символ Unicode) |
| comment | (* … *) | Комментарий, не входит в определение |
| exception | - | Исключение ряда символов из числа допустимых |
Пример: EBNF для SQL #
В примере показаны числа (в десятичной записи) и идентификаторы (кроме экранированных двойными кавычками).
(* Идентификатор в SQL *)
identifier = identifier_start, { identifier_extend } ;
identifier_start = letter | "_" ;
identifier_extend = letter | digit | "_" ;
(* Литерал числа в SQL: целое число либо десятичная дробь *)
signed_numeric_literal = [ sign ], unsigned_numeric_literal ;
sign = "+" | "-" ;
unsigned_numeric_literal = unsigned_integer, [ ".", unsigned_integer ] ;
unsigned_integer = digit, { digit } ;
letter = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K"
| "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V"
| "W" | "X" | "Y" | "Z" | "a" | "b" | "c" | "d" | "e" | "f" | "g"
| "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r"
| "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z" ;
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;