2011-02-01 10 views
8

¿Hay alguna herramienta para convertir la sintaxis de gramática ANTLR ay desde otras sintaxis BNF? Existen varias formas Backus-Naur Form (BNF, EBNF, ABNF, W3C-BNF, XBNF ...) con especificación, p. see this list. La sintaxis de gramática ANTLR solo parece ser described by examples. Sé que los archivos de gramática ANTLR contienen más que la especificación de una sintaxis sin contexto, pero debería poder convertir al menos el subconjunto común, ¿alguien lo ha hecho aún de forma automática?¿Hay herramientas para convertir entre ANTLR y otras formas de BNF?

Respuesta

2

Jakob escribió:

La sintaxis de la gramática antlr sólo parece ser descrito por medio de ejemplos.

antlr (v3) se escribe "en sus propias palabras" (como él mismo Terence Parr puso) en esta gramática:

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


Jakob escribió:

pero debe ser capaz de convertir al menos la c subconjunto ommon: ¿alguien lo ha hecho de forma automática?

No que yo sepa. Y si existe, nunca he visto esta herramienta discutida en la lista de correo de ANTLR que leo regularmente.

También tenga en cuenta que muchas variantes de BNF permiten las reglas left-recursive, algo que un generador de analizador de LL como ANTLR no puede manejar. Por supuesto, la herramienta puede volver a factorizar las reglas recursivas de la izquierda, pero eso podría ser un poco complicado, y probablemente dará como resultado una gramática mucho menos "legible" de la que obtendría que hacerlo manualmente.

En cuanto a la conversión de gramáticas ANTLR en forma BNF sería más fácil, supongo, aunque solo con las gramáticas más triviales. Tan pronto como varios tipos de predicados se incluyan en una gramática ANTLR, la conversión podría volverse complicada.

+0

Gracias, la gramática ANTLR escrita en ANTLR era una cosa que estaba buscando. Por lo que yo entiendo, ANTLR * puedes * escribir gramáticas recursivas a la izquierda, pero luego debes refactorizarlas a mano. Un convertidor de otras formas BNF y ANTLR reduciría al menos la necesidad de adoptar manualmente las diferencias en la punción y otros aspectos menores de las variantes de sintaxis BNF. – Jakob

+0

Parece que ANTLR no puede hacer frente a los caracteres Unicode por encima del plano multilingüe básico: ESC: '\\' (... | 'u' XDIGIT XDIGIT XDIGIT XDIGIT) no puede coincidir con los puntos de código por encima de \ uFFFF. – Jakob

+0

@Jakob, correcto, el rango admitido es '\ 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

Por favor corrígeme si estoy equivocado. Soy nuevo en esto.^_^b – Travis

+0

Sí, puede asignar una sintaxis diferente, al menos para gramáticas simples. Estaba buscando una herramienta que realice esta conversión (BNF, ISO EBNF, ABNF, ANTLR ...). Claro que es posible crear su propia herramienta ;-) – Jakob

Cuestiones relacionadas