Comment définir une grammaire de fichier INI à l'aide de BNFC?
-
22-07-2019 - |
Question
http://www.cs.chalmers.se/Cs / Recherche / Technologie des langues / BNFC /
comment dois-je écrire mon BNF étiqueté pour que BNFC génère un analyseur syntaxique INI pour moi?
Je n'ai que jusqu'à présent 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 Je suis coincé ...
La solution
J'ai demandé à l'un des développeurs de la BNFC et citez sa réponse ici:
Les espaces, tels que les nouvelles lignes, sont pas bien pris en charge en jetons, parce que BNFC a un type de lexer câblé "espace". L'idée est que les espaces ne peuvent pas avoir une signification dans "bien se comporter" langues. Une de ces restrictions cela a rendu BNFC si simple ... mais vous devriez pouvoir résoudre cela en utilisant un pré-processeur, par ex. ligne d'entrée d'analyse par ligne.
Comme par exemple:
entrypoints File ;
comment "#" ;
token ID ( letter | digit | ["-_'"] )+ ;
Ini. File ::= [Section] ;
Sect. Section ::= "[" ID "]" [Statement] ;
Bind. Statement ::= ID "=" ID ;
separator Statement "//" ;
terminator Section "//" ;
Lire:
[name]
x = 10
y = 20
Prétraitement:
[name]//
x = 10//
y = 20//
Analyser:
Ini [Sect (ID "name") [Bind (ID "x") (ID "10"), Bind (ID "y") (ID "20")]]
Transformer:
↓ ↓
Ini [Sect (ID "name") [Bind (ID "x") (ID "0"), Bind (ID "y") (ID "0")]]
Écrire:
[name]//
x = 0//
y = 0//
Post-traitement:
[name]
x = 0
y = 0
(non coché, je ne sais pas si cela fonctionne, juste pour donner une idée !!)