Pregunta

http://www.cs.chalmers.se/Cs / Investigación / Tecnología del lenguaje / BNFC /

¿cómo debo escribir mi BNF etiquetado para que BNFC genere un analizador INI para mí?

¡Solo he llegado hasta ahora o__O!

entrypoints File ;

comment "#" ;

token ID ( letter | digit | ["-_'"] )+ ;

Ini. File ::= [Section] ;
Sect. Section ::= "[" ID "]" [Statement] ;
Bind. Statement ::= ID "=" ID ;

separator Statement "\n" ;
terminator Section "" ;

[name]
#x = 10
y = 20

Parse Successful!

[Abstract Syntax]

Ini [Sect (ID "name") [Bind (ID "y") (ID "20")]]

[Linearized tree]

[name]y = 20

[name]
x = 10
#y = 20

Parse Successful!

[Abstract Syntax]

Ini [Sect (ID "name") [Bind (ID "x") (ID "10")]]

[Linearized tree]

[name]x = 10

o__O estoy atascado ...

¿Fue útil?

Solución

Le pregunté a uno de los desarrolladores de BNFC y cito su respuesta aquí:

  

Los caracteres de espacio como las líneas nuevas son   no está bien soportado en tokens, porque   BNFC tiene un tipo lexer cableado   " espacio " ;. La idea es que los espacios no pueden   llevar significado en "buen comportamiento"   idiomas Una de esas restricciones   eso ha hecho que BNFC sea tan simple ... pero   deberías poder resolver esto usando   un preprocesador, p. analizar la línea de entrada   por línea.


Como por ejemplo:

entrypoints File ;

comment "#" ;

token ID ( letter | digit | ["-_'"] )+ ;

Ini. File ::= [Section] ;
Sect. Section ::= "[" ID "]" [Statement] ;
Bind. Statement ::= ID "=" ID ;

separator Statement "//" ;
terminator Section "//" ;

Leer:

[name]
x = 10
y = 20

Preproceso:

[name]//
x = 10//
y = 20//

Parse:

Ini [Sect (ID "name") [Bind (ID "x") (ID "10"), Bind (ID "y") (ID "20")]]

Transformar:

                                          ↓                       ↓
Ini [Sect (ID "name") [Bind (ID "x") (ID "0"), Bind (ID "y") (ID "0")]]

Escribir:

[name]//
x = 0//
y = 0//

Postproceso:

[name]
x = 0
y = 0

(no marcado, ¡no sé si funciona, solo para dar una idea!)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top