operatoren umwandlung...von char in +, - etc.



  • xxxblubxxx schrieb:

    int erg;
        char c;
        std::cin >> c; 
            
        switch (c) {
            case '-':
                erg = 5 - 4;
                break;
            case '+':
                erg = 5 + 4;
                break;
            default:
                erg = 0;
        }
    

    Hallo,

    ich vermute xerios möchte eher auf einen Parser hinaus 🙂



  • ich bin einfach mal von dieser aussage ausgegangen

    wenn ich jetzt minus(-) in ein char speichere: cin<<operator;

    🙂



  • ja, an switch habe ich schon gedacht....aber was ist wenn die formel komplexer ist und man die operatoren gar nicht kennt...wie soll ich z.b. (3+4*32.34/32*(54-3)+21)/21.323+32*34 parsen, wenn ich gar nicht weiss was ein user eingibt...



  • ja... hört sich nach parser an...
    ich bin auch scho seit wochen am versuchen... wenn hier jemand ne tolle idee hatt binn auch ich sehr dankbar....
    und ach ja... iss das falsche forum... bekommst bestimt noch *GGGGG* danke an die fredels hier dies drauf haben !!!



  • Kennt ihr google?

    ➡ Compilerbau: Beispiel

    Greetz, Swordfish



  • Dieser Thread wurde von Moderator/in SideWinder aus dem Forum DOS und Win32-Konsole in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Wenn du einen Parser schreiben willst, schau dir mal lex und yacc (http://epaperpress.com/lexandyacc/index.html) an.



  • Bei der Simulation eines Taschenrechners ist die Methode des "rekursiven Abstiegs", wie auf der Seite über den Compilerbau, die beste Lösung.
    Dabei kann man ein sogenanntes "Syntaxdiagramm" erstellen, das man direkt in C++ umsetzen kann.

    In diesem Syntaxdiagramm wird beispielsweise die Priorität der Ausdrücke berücksichtigt, womit man auch Regeln wie "Punkt vor Strich" einhalten kann.
    Um einen mathematischen Ausdruck in ein solches Syntaxdiagramm umsetzen zu können, muss man sich einfach überlegen, woraus dieser besteht:

    Der Term 12 * 4 + 5 ist zunächst ein Ausdruck, bestehend aus Summanden. Diese bestehen wiederrum aus Faktoren, nämlich "12 * 4" und "5 * 1". Diese Faktoren können selbst wieder Ausdrücke sein, die sich auch wieder aus Summanden und Faktoren zusammensetzen.
    Die unterste Ebene ist dabei natürlich immer jeweils eine Zahl: Die Zahl 12 setzt sich zusammen aus 1 und 2.
    Alles in Allem braucht man also zur Umsetzung dieser relativ einfachen mathematischen Ausdrücke 4 Funktionen, zum Beispiel 'ausdruck()', 'summand()',
    'faktor()', 'zahl()'.

    Im Hauptprogramm ruft man dann einfach die Funktion 'ausdruck(Parameter)' auf, die dann das Ergebnis berechnet. Parameter besteht in diesem Fall natürlich aus einer Zeichenkette, die auch zeichenweise von der Funktion interpretiert wird ( lässt sich mit cin.get() regeln ).
    Trifft die Funktion 'ausdruck()' dabei auf ein Zeichen, dass sie nicht interpretieren kann, holt sie sich das nächste Zeichen des Tastaturpuffers und übergibt es an die Funktion 'summand()'. Dies wird solange wiederholt, bis die unterste Ebene erreicht ist, und die Zeichenkette in eine Zahl umgewandelt ist.
    Das nächste Zeichen wird 'eingelesen', und an die aufrufende Funktion zur weiteren Analyse übergeben.

    Bevor diese Ebene erreicht ist, kann dem Syntaxdiagramm natürlich noch weitere Funktionen hinzufügen, wie beispielsweise 'potenz()', je nachdem, wie kompliziert der mathematische Ausdruck sein soll bzw. sein darf 🙂

    Dies alles kann man in diesem Buch schön nachlesen:

    http://www.amazon.de/gp/product/3446402535/302-2062014-1357657?v=glance&n=299956



  • Wenn du einen Parser schreiben willst empfehle ich dir das hier

    Ist leider schon etwas in die jahre gekommen aber immer noch mit Abstand das BESTE compilerbau tutorial das ich kenne. Das tutorial verwendet übrigens beispiele aus pascal, aber das sollte kein problem sein das in c zu übersetzen.

    und für den Parser würd ich dir Kapitel 4 empfehlen

    Und lass dich nicht von dem assembler code in kapitel 1-3 verwirren,
    der ist
    1. für deine zwecke nicht notwendig und
    2.hab ichs ja auch geschafft nen parser daraus zu machen und ich kann KEINEN assembler 😉

    zur not könnte ich auch den code posten wenn du willst...



  • Hier waeren zwei Beispiele zu finden, fuer das was du willst:
    http://www.hcs-tuning.de/cppg/viewtopic.php?t=389



  • GIGIA// schrieb:

    Wenn du einen Parser schreiben willst, schau dir mal lex und yacc (http://epaperpress.com/lexandyacc/index.html) an.

    *Börg*. 😉
    Better use boost::Spirit.


Anmelden zum Antworten