Расширения грамматики
Существует множество нотаций для задания синтаксиса формального языка. Некоторые нотации дают больше возможностей, но как правило любую расширенную грамматику можно свести к более простой.
Нотации
Самая простая запись здесь называется канонической. Правило определяется нетерминальным символом в левой части и последовательностью символов в правой. В качестве разделителя используют стрелку.
S -> a B C d
B -> b
Большинство алгоритмов для генерации парсеров принимают грамматику именно в таком виде. Часто грамматику в другой форме можно преобразовать, свести к канонической, чтобы при этом новая грамматика задавала эквивалентный язык.
Backus-Naur form
Форма Бэкуса-Наура (Backus-Naur form, BNF) — это нотация для описания синтаксиса формального языка.
По сравнению с канонической, она имеет ряд удобных расширений:
- возможность задать альтернативы (оператор "или"), для этого используется
символ
|
- для терминальных символов с постоянной лексемой можно указать значение этой лексемы в кавычках
В качестве разделителя левой и правой части правила используется ::=
.
expr ::= expr '+' expr | number
Extended Backus-Naur form
Расширенная форма Бэкуса-Наура (EBNF) добавляет ещё ряд новых возможностей для описания синтаксиса.
Запись | Значение |
---|---|
= | разделитель левой и правой части |
, | конкатенация |
; | окончание правила |
| | альтернатива |
(...) | группировка |
[...] | опциональная часть |
{...} | повторение 0 или более раз |
'...' или "..." | терминальная строка |
(* ... *) | комментарий |
Пример:
parameters = '(' , parameter , { ',' , parameter } , [ ',' ], ')' ;
parameter = expression | Identifier , '=' , expression ;
Приведение к каноничному виду
TODO.
Альтернативы
Квантификаторы
- — 0 или одно повторение
- — 0 или более повторений
- — 1 или более повторений
Часто можно избавиться от пустых строк: