Что это за вариант БНФ?

Я пытался создать парсер на основе Bison, используя некоторые файлы BNF, которые я нашел на Github. Моя проблема, однако, заключается в том, что я не могу определить, какую вариацию BNF используют файлы.

Вот ссылка на папка с образцами варианта BNF.

В bnf.rkt , автор ссылается на страницу BNF в Википедии , но его файл выглядит совсем не так:

## The following comes from: http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form
<syntax> : <rule> | <rule> <syntax>
<rule> : <opt-whitespace> "<" <RULE-NAME> ">" <opt-whitespace> "::="
<opt-whitespace> <expression> <line-end>
<opt-whitespace> : " " <opt-whitespace> | "" ## "" is empty string, i.e. no whitespace
<expression> : <list> | <list> "|" <expression>
<line-end> : <opt-whitespace> <EOL> | <line-end> <line-end>
<list> : <term> | <term> <opt-whitespace> <list>
<term> : <literal> | "<" <RULE-NAME> ">"
<literal> : '"' <TEXT> '"' | "'" <TEXT> "'" ## actually, the original BNF did not use quotes

Вот пример (из репозитория) о том, как этот синтаксис используется для представления базового JSON:

;; Simple baby example of JSON structure
json: number | string
| array
| object
number: NUMBER
string: STRING
array: "[" [json ("," json)*] "]"
object: "{" [kvpair ("," kvpair)*] "}"
kvpair: ID ":" json

Кто-нибудь знает, что он использует? Я хотел бы преобразовать это в формат, читаемый Бизоном, если это возможно.

Заранее спасибо.


person belph    schedule 16.11.2014    source источник


Ответы (1)


Это своего рода расширенный BNF, аналогичный используемому в различных генераторах парсеров, примерно основанный на синтаксисе bison с добавлением скобок и операторов регулярных выражений. Документация находится здесь, а краткое содержание будет таким:

  • Слева от произведения следует :, как в bison.
  • В конце произведения нет ; (в bison ; является необязательным).
  • * и + — это обычные операторы звездочки и плюса Клини, которые можно найти в большинстве библиотек регулярных выражений. | — обычный оператор чередования. ( и ) — группирующие круглые скобки, также похожие на большинство реализаций регулярных выражений.
  • Однако необязательные последовательности окружены [ и ], подобно EBNF.

Помимо последнего пункта, это делает его практически таким же, как базовый формат, используемый, например, ANTLR.

person rici    schedule 16.11.2014