Frage

http://www.cs.chalmers.se/Cs / Forschung / Sprache-Technologie / BNFC /

Wie soll ich schreibe mein beschriftet BNF BNFC bekommt einen INI-Parser für mich zu generieren?

Ich habe nur so weit o__O bekommen!

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 Ich bin fest ...

War es hilfreich?

Lösung

Ich fragte einen der BNFC Devs und zitieren seine Antwort hier:

  

Space Zeichen wie Zeilenumbrüche sind   nicht gut in Token unterstützt, da   BNFC hat eine fest verdrahtete LEXER Typ   "Platz". Die Idee ist, dass Räume können nicht   tragen Sinn in „artig“   Sprachen. Eine dieser Einschränkungen   dass hat BNFC so einfach ... aber   Sie sollten diese in der Lage zu lösen, indem Sie   einen Vorprozessor, z.B. Parsen der Eingangsleitung   Zeile.


Wie zum Beispiel:

entrypoints File ;

comment "#" ;

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

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

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

Lesen Sie:

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

Schreiben:

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

Nachbearbeiten:

[name]
x = 0
y = 0

(nicht überprüft, weiß nicht, ob es funktioniert, nur eine Idee zu geben !!)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top