Задание 2.1E

Лабораторная №2 — задание 2.1E #

Нужно написать EBNF грамматику для некоторых лексем в одном из двух языков программирования, выбранных аналитиком в лабораторной №1.

Информация об этих языках записана в каталоге docs/competitors/ вашего проекта.

Порядок выполнения #

  1. Найдите описание правил EBNF и изучите его
  2. Найдите и изучите пример EBNF грамматики для лексем какого-либо языка программирования
  3. Найдите и изучите документацию по лексической структуре языка, для которого вы будете описывать грамматику лексем
  4. Опишите в EBNF следующие типы лексем:
    • идентификатор (identifier)
    • литералы целых чисел (integer number)
    • литералы чисел с плавающей точкой (real number)
    • литералы строк (string literal)

Требования к EBNF грамматике лексики языка #

  1. Сохраните грамматику в markdown файл docs/theory/EBNF-for-lexemes.md
    • В начале файла укажите, для какого языка и какие лексемы вы описываете
  2. Грамматика должна быть описана по правилам EBNF (Extended Backus-Naur Form)
    • не путайте EBNF с более ранней нотацией BNF (Backus-Naur Form)
  3. Грамматика должна содержать следующие типы лексем:
    • идентификатор (identifier)
    • литералы целых чисел (integer number)
    • литералы чисел с плавающей точкой (real number)
    • литералы строк (string literal)
  4. Вы можете взять описание лексем в 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" ;