Wie kann ich eine INI-Datei Grammatik mit der BNFC definieren?
-
22-07-2019 - |
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 ...
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 !!)