Taschenrechner in EBNF beschreiben



  • Meine Aufgabe ist es einen kl. Taschenrechner mit den Grundrechenarten (+ - * / ) in EBNF "Extended Backus Naur Form" zu beschreiben. Die 'Punkt-vor-Strich'-Regel soll nicht berücksichtigt werden.

    Folgende Zahlen dürfen eingegeben werden:
    1234
    1.234
    1e-234
    1e234

    Wenn Ihr diese Art der Programmbeschreibung kennt, wäre es mal gut zu wissen, ob das untenstehende der Aufgabenstellung entspricht. DAnke.

    Beschreibung:

    Als erstes wird die Tastatur des Taschenrechners definiert, dass bedeutet die nicht-terminalen Symbole <Ziffer> und <Operator>. Im nächsten Schritt wird eine natürliche Zahl (Zahl ohne Dezimalpunkt und ohne Vorzeichen) bestimmt, für den Fall, dass diese eingegeben wird. Nun folgt eine Regel für eine beliebige gültige Zahl. Zum Schluss folgt noch die Syntax einer ganzen Rechnung.

    EBNF - Ablauf:

    <Ziffer> ::= 0|1|2|3|4|5|6|7|8|9|10
    <Operator> ::= +|-|*|/

    <natürliche Zahl> ::= <Ziffer> {<Ziffer>}

    <Zahl> ::= <natürliche Zahl> [.[<natürliche Zahl>]] | .<natürliche Zahl>

    <Rechnung> ::= <Zahl> {<Operator> <Zahl>}



  • 10 ist eine Ziffer?

    und ich würde Rechnung so schreiben

    Rechnung ::= <Zahl> { <Operator> <Rechnung> }



  • Klar, die 10 kommt da nicht hin(!)

    Die letzte Zeile muss geändert werden, weil das Programm hier mindestens einmal durchgelaufen sein musste, um zwei eingegebene unterschiedliche Zahlen miteinander operieren zu lassen. Dieses Wäre dann beim zweiten Durchlauf der Wert in <Rechnung>, richtig ?

    Den Ausdruck für die e bzw. EE Taste [*10^(irgendwas)] habe ich weggelassen, wußte nicht wie...?



  • das mit dem e kannst du so lösen

    <e> ::= e | E
    <Zahl> ::= { <natürliche Zahl> } [ . [ {<natürliche Zahl>} ] ] [ <e> [ {<natürliche Zahl>} ] ]



  • So, hiermit sollte es der "EBNF" noch etwas näher kommen, bitte nochmal checken und ggf. verbessern ! Gruß.

    <Ziffer> ::= (’0 ’| ’1 ’| ’2 ’| ’3 ’| ’4 ’ | ’5 ’| ’6 ’| ’7 ’| ’8 ’| ’9 ’);
    <Operator> ::= (’+’|’-’|’*’|’/’);
    <Exponent> ::= (’e ’| ’E ’);

    <natürlicheZahl> ::= <Ziffer> {<Ziffer>};
    <ganzeZahl> ::= [(’+’|’-’)] <natürlicheZahl>;
    <reelleZahl> ::= <ganzeZahl> [.[<natürlicheZahl>]] [<Exponent> <ganzeZahl>];

    <Rechnung> ::= <reelleZahl> {<Operator> <reelleZahl>};



  • Was hältst du von dieser Form?
    <Rechnung> ::= <reelleZahl> [<Operator> <Rechnung>];

    [ Dieser Beitrag wurde am 07.07.2003 um 22:56 Uhr von musicman editiert. ]



  • Ja? Ich weiss nicht, aber mir gefällt die erste Version besser...Am Besten am Beispiel:

    1.
    Dieses Zeile -->
    <Rechnung> ::= <reelleZahl> {<Operator> <reelleZahl>};

    wird dann z.B. zu -->
    <Rechnung> ::= 123{*456}{-789};

    oder

    2.
    <Rechnung> ::= <reelleZahl> [<Operator> <Rechnung>];

    wird dann genauso wie oben im Vergleich zu -->
    <Rechnung> ::= 123 [*<Rechnung>];
    <Rechnung> ::= 456 [-<Rechnung>];
    <Rechnung> ::= 789 ...

    [ Dieser Beitrag wurde am 08.07.2003 um 13:53 Uhr von jiffy editiert. ]



  • die 2. Version ist eben für Rekursions Freaks, die 1. eher für Leute, die Iterationen bevorzugen 😉



  • Rekursion ist aber gerade bei so einfachen Grammatiken/Parsern? meiner Meinung nach recht praktisch, und auch nicht gerade so wahnsinnig unübersichtlich 😉



  • Wir betrachten (f¨ur diese Aufgabe) eine einfache Sprache als eine Menge von Zeichenfolgen.
    Mit EBNF k¨onnen nicht nur Programmiersprachen sondern auch solche einfachen Sprachen
    beschrieben werden.
    1. Geben Sie ein EBNF Beschreibung f¨ur folgende Sprachen an.
    a) Die Sprache aller nat¨urlichen Zahlen in denen die Ziffer 9 genau einmal enthalten
    ist.
    b) Die Sprache aller nat¨urlichen Zahlen die durch 5 teilbar sind.
    c) Die Sprache aller nat¨urlichen Zahlen die durch 4 teilbar sind.
    2. Es seien die boolschen Variablen A, B, C und die in der Vorlesung besprochenen
    Operatoren ^, _, ¬ sowie die Klammerung () gegeben.
    Geben Sie die Syntax aller g¨ultigen boolschen Ausdr¨ucke mit den angegebenen Variablen
    und Operatoren in EBNF an.

    Kann uns jemand einen Ansatz hierfür liefern?



  • Warum hast du denn keinen eigenen Thread aufgemacht?

    Aber hier ein paar Hinweise:
    1.
    a. { Not-Nine } '9' { Not-Nine }
    b. { digits } ['0'|'5'] // Endziffer muß 0 oder 5 sein
    c. ... // Endziffern müssen 00, 04, 08, ..., 92, 96 sein (+ Ausnahmen für einstellige Zahlen 0, 4, 😎

    2. Du mußt einfach die Elemente aufteilen in Terminalsymbole (A, B, C) und Operatoren. Du kannst das dann äquivalen zu dem in diesem Thread beschriebenen Taschenrechner-EBNF aufschreiben.
    Wenn die Operatoren noch verschiedene Prioritäten haben sollen, dann mußt du jeweils je Operatorpriorität eine eigene EBNF-Anweisung erzeugen und den nächst strenger-bindenden Operator einbinden. (Ich kenne leider die Bedeutung der Operatoren nicht -)


Anmelden zum Antworten