2011-02-01 10 views
8

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

2

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.

+0

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

+0

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

+0

@Jakob, corretto, l'intervallo supportato è '\ u0000'..' \ uFFFF'. –

5
# 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` 
+0

Per favore correggimi se sbaglio. Sono nuovo di questo.^_^b – Travis

+0

Sì, è possibile mappare tra sintassi diverse almeno per grammatiche semplici. Stavo cercando uno strumento che faccia questa conversione (BNF, ISO EBNF, ABNF, ANTLR ...). Certo è possibile creare il tuo strumento ;-) – Jakob