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é ...

Était-ce utile?

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 !!)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top