Ci sono strumenti per convertire la sintassi della grammatica ANTLR da e verso altre sintassi BNF? Esistono diverse forme Backus-Naur Form (BNF, EBNF, ABNF, W3C-BNF, XBNF ...) con specifica, ad es. see this list. La sintassi della grammatica ANTLR sembra essere solo described by examples. So che i file di grammatica ANTLR contengono più della specifica di una sintassi senza contesto, ma dovresti essere in grado di convertire almeno il sottoinsieme comune - qualcuno ha ancora fatto automaticamente?Esistono strumenti per la conversione tra ANTLR e altre forme di BNF?
risposta
Jakob ha scritto:
La sintassi della grammatica ANTLR sembra solo essere descritto da esempi.
ANTLR (v3) è scritto "nelle sue stesse parole" (come Terence Parr si è messo di esso) in questa grammatica:
http://www.antlr.org/grammar/ANTLR/ANTLRv3.g
Jakob ha scritto:
ma si dovrebbe essere in grado di convertire almeno la c sottoinsieme ommon: qualcuno ha ancora fatto automaticamente?
Non che io sappia. E se esiste, non ho mai visto questo strumento in discussione sulla mailing list ANTLR che leggo regolarmente.
Si noti inoltre che molte varianti di BNF consentono le regole left-recursive, qualcosa che un generatore di parser LL come ANTLR non è in grado di gestire. Le regole ricorsive di sinistra possono ovviamente essere rielaborate dallo strumento, ma ciò potrebbe essere piuttosto complicato e probabilmente si tradurrà in una grammatica molto meno "leggibile" di quella che si otterrebbe rispetto a farlo manualmente.
Come per la conversione di grammatiche ANTLR in forma simile a BNF, credo sia più facile, anche se solo con le grammatiche più banali. Non appena i vari tipi di predicati vengono inseriti in una grammatica ANTLR, la conversione potrebbe essere di nuovo complicata.
# 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`
Grazie, la grammatica ANTLR scritta in ANTLR era una cosa che stavo cercando. Per quanto comprendo ANTLR * puoi * annotare grammatiche ricorsive a sinistra, ma devi quindi rifattorizzarle a mano. Un convertitore da altre forme BNF e ANTLR ridurrebbe almeno la necessità di adottare manualmente le differenze di punteggiatura e altri aspetti minori delle varianti di sintassi BNF. – Jakob
Sembra che ANTLR non sia in grado di gestire i caratteri Unicode sopra il piano multilingue di base: ESC: '\\' (... | 'u' XDIGIT XDIGIT XDIGIT XDIGIT XDIGIT) non può corrispondere ai codepoint sopra \ uFFFF. – Jakob
@Jakob, corretto, l'intervallo supportato è '\ u0000'..' \ uFFFF'. –