Pergunta

http://www.cs.chalmers.se/Cs / Investigação / Language-tecnologia / BNFC /

como devo escrever meu rotulado BNF para obter BNFC para gerar um analisador INI para mim?

Eu só ter chegado tão longe 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 eu estou preso ...

Foi útil?

Solução

Eu pedi um dos devs BNFC e citar sua resposta aqui:

Caracteres de espaço, como novas linhas são não é bem suportado em fichas, porque BNFC tem um tipo lexer hard-wired "espaço". A ideia é que os espaços não pode carregam um significado em "bem-comportado" línguas. Uma dessas restrições que fez BNFC tão simples ... mas você deve ser capaz resolver isso usando um pré-processador, por exemplo A linha de entrada de análise por linha.


Como por exemplo:

entrypoints File ;

comment "#" ;

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

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

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

Leia:

[name]
x = 10
y = 20

Preprocess:

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

Parse:

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")]]

Write:

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

postprocess:

[name]
x = 0
y = 0

(não marcado, não sei se funciona, só para dar uma idéia !!)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top