Einen Parser implementieren



  • Hallo, da ich mir jetz vorstellen kann wie ein Parser funktioniert habe ich mich hingesetzt um das mal zu implementieren.

    Alllssoooo,

    das ist der String den ich berechnen will.

    2 + 4 * 5 + 3

    Wo fange ich jetzt an ???

    Ich könnte erst einmal nach dem + im String suchen. Hmmm bringt das was? Oder soll ich nach den Zahlen suchen gleich mit den Vorzeichen oder doch ohne.



  • Wenn du erst nach + und - suchst, wird das Ergebnis falsch; * und / haben eine höhere Priorität. 🙂





  • 2. Wiederhole:
      Lies das nächste Zeichen.
      fall das Zeichen 
           ein Operand ist, kommt er in den Zahlenstapel
           ein Operator ist, überprüfe seine Priorität.
                 falls der Operator keine (höhere) Priorität gegenüber dem obersten 
                 Operator im Operatorstapel besitzt, werte diesen aus (also den der 
                 vorher eingelesen wurde - du nimmst die letzten beiden Zahlen vom
                  Zahlenstapel und verrechnest sie).Dann legst du das ergebnis 
                  wieder auf den Zahlenstapel ab (nicht vergessen die verrechneten
                  Zhalen zu löschen)
                   Speicher jetzt den neuen operator im Operatorenstapel
            eine offene Klammer ist - ablegen
            eine schließende klammer ist - die Auswertung aller Operatoren durchführen
             zurück bis zur entsprechen offenen Klammer. Entferne die offene Klammer
     bis der Ausdruck abgearbeitet ist
    
    3, Falls der Operatorenstapel nicht leer ist - Operatoren auswerten
    

    Mal sehen, ich halte mich mal an das hier. Ich hoffe ich bekomme das hin 🙂



  • Hallo,

    wenn es Dir nicht nur um den Spass am entwickeln
    geht:

    Google mal nach lex und yacc (alternativ GNU bison),
    das sind Parser-Generatoren (kommt C-Code bei raus).

    Ansonsten kommts drauf an wie mächtig das Ding sein soll,
    für das Beispiel reicht sicher ne einfach switch/case lösung in
    ner Schleife, ansonsten würd ich mich mal mit Zustandsmaschinen
    befassen - damit bekommt man sowas etwas generischer hin.

    Gruß,

    Stefan


Anmelden zum Antworten