Como posso definir uma gramática arquivo INI usando o BNFC?
-
22-07-2019 - |
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 ...
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 !!)