2009-06-25 11 views
6

http://www.cs.chalmers.se/Cs/Research/Language-technology/BNFC/¿Cómo puedo definir una gramática de archivo INI utilizando BNFC?

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

¡He llegado tan lejos 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 ...

+0

¿Qué quieres hacer ahora? Parece que esto realmente cumple con las necesidades de análisis de archivos ini –

+0

en realidad porque con las secciones de gramática anteriores solo puede tener un enlace único. Me gustaría poder analizar todo tipo de archivos ini. –

Respuesta

5

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

Los caracteres de espacio, tales como saltos de línea se no están bien apoyados en fichas, porque BNFC tiene un tipo de léxico con cableado "espacio" . La idea es que los espacios no pueden tienen un significado en los lenguajes "de buen comportamiento" . Una de esas restricciones que ha hecho que BNFC sea tan simple ... pero debería ser capaz de 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// 

de análisis:

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

Transform:

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

Comentario:

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

postproceso:

[name] 
x = 0 
y = 0 

(no verificado, no sé si funciona, sólo para dar una idea !!)

Cuestiones relacionadas