10
votes

Existe-t-il des outils pour convertir entre AntlR et autres formes de BNF?

Y a-t-il des outils pour convertir la syntaxe de grammaire anti-grammaire en et vers d'autres syntaxes BNF? Il existe plusieurs formes Formulaire de Backus-Naur (BNF, EBNF, ABNF, W3C-BNF, XBNF ...) avec des spécifications, par exemple. Voir cette liste . La syntaxe de grammaire anti-grammaire semble seulement être décrite par des exemples . Je sais que les fichiers de grammaire à anti-anti-anti-à-tête contiennent plus que la spécification d'une syntaxe sans contexte, mais vous devriez être capable de convertir au moins le sous-ensemble commun - a-t-il déjà fait automatiquement?


0 commentaires

4 Réponses :


4
votes

Jakob a écrit:

La syntaxe de la grammaire anti-anti-anti-anti-anti-anti-grammaire semble être décrite par des exemples.

antlr (v3) est écrit "dans ses propres mots" (comme Terence Parr lui-même le met) dans cette grammaire:

http://www.antlr.org/gramar/antlr/antlrv3.g < / a>


Jakob a écrit:

Mais vous devriez être capable de convertir au moins le sous-ensemble commun - a-t-il déjà fait automatiquement?

pas que je sache. Et si cela existe, je n'ai jamais vu cet outil en cours de discussion sur la liste de diffusion ANTLR que j'ai lu sur une base régulière.

Notez également que de nombreuses variantes BNF permettent règles de gauche-récursives , quelque chose qu'un ll -Le générateur de Parser comme ANTLR ne peut pas faire face. Les règles récursives de gauche peuvent bien sûr être réintégrées par l'outil, mais cela pourrait être plutôt délicat et entraînera probablement une grammaire beaucoup moins «lisible» que celle de l'avoir manuellement.

Pour convertir des grammaires anti-ANTLR en forme de forme BNF serait plus facile, je suppose que, même si seulement avec les grammaires les plus triviales. Dès que divers types de prédicats sont placés dans une grammaire anti-à-delà, la conversion pourrait à nouveau devenir délicate.


2 commentaires

Merci, la grammaire Antlr écrite à Antlr était une chose que je cherchais. Pour autant que je comprenne, vous peut écrire des grammaires gauche-récursives, mais vous devez ensuite les refroidir à la main. Un convertisseur d'autres formes BNF et d'AntlR réduirait au moins la nécessité d'adopter manuellement les différences de ponction et d'autres aspects mineurs des variantes de la syntaxe BNF.


On dirait que Antlr ne peut pas faire face aux caractères unicode au-dessus plan multilingue de base: ESC: '\\' (... | 'u' u 'u' xdigit xdigit xdigit xdigit) ne peut pas correspondre à des points de code ci-dessus \ uffff.



9
votes
# 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`

1 commentaires

Oui, vous pouvez mapper entre différentes syntaxes au moins pour de simples grammaires. Je cherchais un outil qui fait cette conversion (BNF, ISO EBNF, ABNF, ANTLR ...). Bien sûr, il est possible de créer votre propre outil ;-)



5
votes

J'ai écrit un traducteur à cette fin. Universal-Transpiler est capable de convertir AntlR grammaires dans PEG.JS , proche , ABNF , XBNF et plusieurs autres notations de grammaire. Il n'est pas encore en mesure de traduire des antlr en w3c-bnf, mais je vais essayer d'ajouter cette fonctionnalité dans une version future.

Ce traducteur n'est compatible qu'avec un petit sous-ensemble de la langue antérieure, mais j'espère que cela sera toujours utile.


0 commentaires

2
votes

Il existe un site qui héberge une grande variété de grammaires et d'outils à convertir entre leurs formats:

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


0 commentaires