EBNF syntax in cpp datein



  • Hallo,

    bis jetzt war mir die EBNF absolut unbekannt, beim durcharbeiten von "Die C++ Programmiersprache", bin ich dann schließlich auf dieses Thema gestoßen (auch wenn dort unfreundlicher Weise in keinem Wort erwähnt wird um was es sich handelt...). Im Buch wird ein die Grammatik eines Taschenrechners folgendermaßen beschrieben:

    program:
       END
       expr_list END
    
    expr_list:
       expressions PRINT
       expressions PRINT expr_list
    
    expression:
       expression + term
       expression - term
       term
    
    term:
       term / primary
       term * primary
       primary
    
    primary:
       NUMBER
       NAME
       NAME = expression
       - primary
       ( expression )
    
    enum Token_value {
    NAME, NUMBER, END, PLUS='+',MINUS='-', MUL='*', DIV='/', PRINT=';', ASSIGN='=', LP='(', RP=')'
    };
    ...
    

    In der Syntax-Definition für den Taschenrechner wurden keinerlei Rekursion / optionale Wiederholung verwendet um Wiederholungen zu zulassen (soweit das für mich erkennbar ist). Auch wird in der Syntax ein Ausdruck verwendet, welcher nicht definiert wurde (NAME). Und hinter den einzelnen Definitionen scheint das ';' zu fehlen. 😕 😕
    Die Defenition konnte ich bisher noch nicht ausprobieren, allerdings beschwert sich vc++ 08 express in keinster Weise über Syntaxfehler.
    Das verwirrende ist, dass die Syntax dieser Gramatikdefinition mit keinen anderen Beschreibungen der EBNF zusammenpasst.
    Beispiel Wikipedia (eng.) http://en.wikipedia.org/wiki/Ebnf#Another_example:

    (* a simple program syntax in EBNF − Wikipedia *)
    program = 'PROGRAM' , white space , identifier , white space ,
               'BEGIN' , white space ,
               { assignment , ";" , white space } ,
               'END.' ;
    identifier = alphabetic character , { alphabetic character | digit } ;
    number = [ "-" ] , digit , { digit } ;
    
    ....
    

    Und ein Beispiel aus dem Forum:
    http://www.c-plusplus.net/forum/268247

    Code:

    Antwort = (AntwortPositiv) | (AntwortNegativ) ;
    AntwortPositiv = (AntwortPositivDeutsch) | (AntwortPositivEnglisch) ;
    AntwortPositivDeutsch = "ja" | "jo" ;
    AntwortPositivEnglisch = "yes" | "yeah" ; 
    
    ....
    

    Die Frage die sich mir hier stellt ist: Welche Syntaxregeln gelten für die Verwendung von EBNF in C++?
    Sind in c++ einige EBNF Symbole doppelt belegt sein?
    -> '=' ↔ ':'
    -> ',' ↔ ' ' (wobei ERNF laut standard ja leerzeichen als trennung akzeptieren sollte?)
    -> Zeilenvorschub ↔ '|'

    Vielen Dank für die Antworten!

    P.S.: Hoffe der Post ist nicht zu lang.. Und falls doch, ich darf (Einstandspost 😃 )
    Und, jah, ich hab die Suchmaschine benutzt 🕶 (ganze 2 Tage bis jetzt !)



  • sengrox schrieb:

    Die Frage die sich mir hier stellt ist: Welche Syntaxregeln gelten für die Verwendung von EBNF in C++?

    Keine, EBNF ist schlicht und einfach nicht Teil von C++, sondern eine eigene Notation für Grammatiken. C++ geht bei dir erst bei diesem enum Token_value los.

    allerdings beschwert sich vc++ 08 express in keinster Weise über Syntaxfehler.

    Das bezweifle ich.



  • Ja, stimmt, ich habe grad zu dem ganzen eine main() hinzugefügt und versucht es zu kompilieren.. Habe angenohmen das es passt, weil sich sonst die Microsoft IDEs ja so schön mit roten Wellen bemerkbar machen, wenn ihnen was nicht passt, was hier leider nicht der Fall war 🙄

    Bleibt doch noch die Frage zur Syntax von EBNF. Laut dem was ich bis jetzt gefunden habe, wäre die Definition aus dem Buch falsch.



  • Es gibt viele EBNF-Varianten.



  • Bashar schrieb:

    Es gibt viele EBNF-Varianten.

    http://de.wikipedia.org/wiki/Erweiterte_Backus-Naur-Form

    Soweit ich das verstehe, gibt es genau eine EBNF, da sie ja standardisiert ist...
    In der Wiki wird auf http://www.cl.cam.ac.uk/~mgk25/iso-14977.pdf verwiesen. Und ich geh jetzt mal davon aus, dass diese Variante jene ist, welche prinzipiel verwendet wird.

    Wenn EBNF dann nicht ins Projekt rein gehört, wie definiere ich dann die Syntax?
    Oder dient EBNF nur dazu, dass man sich die abhängigkeiten aufschreibt (zB. auf einem Schmierzettel) und sie mittels dem eigentlichen Programm, sprich Parser / Scanner 'realisiert'?

    Würde mich über nützlichere Antworten freuen...



  • sengrox schrieb:

    Bashar schrieb:

    Es gibt viele EBNF-Varianten.

    http://de.wikipedia.org/wiki/Erweiterte_Backus-Naur-Form

    Du hattest vorhin die englische Wikipedia-Seite verlinkt:

    In computer science, Extended Backus–Naur Form (EBNF) is a family of metasyntax notations used for expressing context-free grammars: that is, a formal way to describe computer programming languages and other formal languages. They are extensions of the basic Backus–Naur Form (BNF) metasyntax notation.

    The earliest EBNF was originally developed by Niklaus Wirth. However, many variants of EBNF are in use. The International Organization for Standardization has adopted an EBNF standard (ISO/IEC 14977). This article uses EBNF as specified by the ISO for examples applying to all EBNF:s. Other EBNF variants use somewhat different syntactic conventions.

    Soweit ich das verstehe, gibt es genau eine EBNF, da sie ja standardisiert ist...

    Wenn es genau eine gäbe, hätte man sie ja nicht standardisieren müssen 😉

    Wenn EBNF dann nicht ins Projekt rein gehört, wie definiere ich dann die Syntax?
    Oder dient EBNF nur dazu, dass man sich die abhängigkeiten aufschreibt (zB. auf einem Schmierzettel) und sie mittels dem eigentlichen Programm, sprich Parser / Scanner 'realisiert'?

    Genauso ist es.



  • sengrox schrieb:

    In der Syntax-Definition für den Taschenrechner wurden keinerlei Rekursion / optionale Wiederholung verwendet um Wiederholungen zu zulassen (soweit das für mich erkennbar ist).

    Dann schau mal die Definitionen von expr_list, expression, term und primary nochmal genauer an.



  • EBNF in C++ Code? boost::spirit.


Anmelden zum Antworten