Существуют ли инструменты для преобразования между ANTLR и другими формами БНФ? - PullRequest
10 голосов
/ 02 февраля 2011

Существуют ли какие-либо инструменты для преобразования синтаксиса грамматики ANTLR в другие синтаксисы BNF и из них?Существует несколько форм Бэкуса-Наура (BNF, EBNF, ABNF, W3C-BNF, XBNF ...) со спецификацией, например, см. Этот список .Грамматический синтаксис ANTLR только кажется описанным примерами .Я знаю, что файлы грамматики ANTLR содержат больше, чем спецификация безконтекстного синтаксиса, но вы должны быть в состоянии преобразовать хотя бы общее подмножество - кто-нибудь еще сделал это автоматически?

Ответы [ 4 ]

6 голосов
/ 24 апреля 2012
# Grammar Syntax

|                               | BNF                           | ISO EBNF                      | ABNF                          | ANTLR                         |
|:-----------------------------:|:-----------------------------:|:-----------------------------:|:-----------------------------:|:-----------------------------:|
| rule definition               | `<name> ::= ...`              | `name = ... ;`                | `name = ...`                  | `name : ... ;`                |
| terminal items                | `...`                         | `'...'` or `"..."`            | integer or `"..."`            | `'...'`                       |
| non-terminal items            | `<...>`                       | `...`                         | `...` or `<...>`              | `...`                         |
| concatenation                 | (space)                       | `,`                           | (space)                       | (space)                       |
| choice                        | `|`                           | `|`                           | `/`                           | `|`                           |
| optional                      | requires choice syntax[^1]    | `[...]`                       | `*1...` or `[...]`            | `...?`                        |
| 0 or more repititions         | requires choice syntax[^2]    | `{...}`                       | `*...`                        | `...*`                        |
| 1 or more repititions         | requires choice syntax[^3]    | `{...}-`                      | `1*...`                       | `...+`                        |
| n repititions                 |                               | `n*...`                       | `n*n...`                      |                               |
| n to m repititions            |                               |                               | `n*m...`                      |                               |
| grouping                      |                               | `(...)`                       | `(...)`                       | `(...)`                       |
| comment                       |                               | `(*...*)`                     | `;...`                        | `// ...` or `/* ... */`       |


[^1]: `optionalb ::= a b c d | a c d`

[^2]: `list ::= | listitem list`

[^3]: `list ::= listitem | listitem list`
3 голосов
/ 02 февраля 2011

Якоб писал:

Синтаксис грамматики ANTLR описывается только примерами.

ANTLR (v3) написан "всвои слова "(как выразился сам Теренс Парр) в этой грамматике:

http://www.antlr.org/grammar/ANTLR/ANTLRv3.g

Якоб писал:

но вы должны быть в состоянии преобразовать хотя бы общее подмножество - кто-нибудь еще сделал это автоматически?

Не то, что я знаю.И если он существует, я никогда не видел, чтобы этот инструмент обсуждался в списке рассылки ANTLR, который я регулярно читаю.

Также обратите внимание, что многие BNF-варианты допускают left-recursive правил, то, с чем не может справиться генератор LL-парсера, такой как ANTLR.Левые рекурсивные правила, конечно, могут быть переформулированы инструментом, но это может быть довольно сложно, и, вероятно, приведет к гораздо менее «читаемой» грамматике, чем можно было бы сделать, если бы это не делалось вручную.

Что касается преобразования грамматик ANTLR в BNF-подобную форму, то, я думаю, было бы легче, хотя только с большинством тривиальных грамматик.Как только различные типы предикатов добавляются в грамматику ANTLR, преобразование может снова стать хитрым.

2 голосов
/ 03 января 2019

Я написал переводчик для этой цели. Универсальный транспортер способен преобразовывать грамматики ANTLR в PEG.js , nearley , ABNF , XBNF , и несколько других грамматических обозначений. Он пока не может перевести ANTLR в W3C-BNF, но я постараюсь добавить эту функцию в будущей версии.

Этот переводчик совместим только с небольшим подмножеством языка ANTLR, но я надеюсь, что он все еще будет полезен.

1 голос
/ 04 января 2019

Есть сайт, на котором размещено огромное количество грамматик и инструментов для преобразования между их форматами:

http://slebok.github.io/zoo/index.html

...