Mathematischer Parser

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Naja, ich würde erstmal den Text in eine Liste zerlegen mit den einzelnen Token und denen gleich die Art zuweisen.
    Sprich, versch. Tokenarten.
    Nehmen wir mal folgenden String an, der geparst werden muss: 5 * 2 / 2

    Nehmen wir folgendes als definiert an:

    Quellcode

    1. #define opOperator 0
    2. #define opNumber 1
    3. struct sToken
    4. {
    5. string token;
    6. int type;
    7. };


    Jetzt zerlegen wir erstmal den string in seine Einzelteile, sprich Tokens, das ergibt folgendes Bild (ich gehe mal davon aus, dass Du weisst, wie man das zerlegt):

    Quellcode

    1. sToken Op1 = { "5", opNumber };
    2. sToken Op2 = { "*", opOperator };
    3. sToken Op3 = { "2", opNumber };
    4. sToken Op4 = { "/", opOperator };
    5. sToken Op5 = { "2", opNumber };


    Nun schauen wir uns einfach an, ob in dieser Liste von Tokens best. Zeichen vorkommen. Da wir einen Punkt-Operator haben, nämlich *, wird 5*2 nun als erstes ausgeführt. Danach das Ergebnis durch 2 geteilt.
    Wäre es andersrum, z. Bsp. 2 / 5*2, müssten wir das "/ 2" nach hinten verschieben und später ausführen. Ich würde die Dinge einfach auf einen std::stack sortieren und dann von dort ausführen anhand des Tokentypes.

    Generell ist diese Methode abgeleitet von der Methode die Martin Brownlow in seinem "Goldene Regeln der Spieleprogrammierung" aufzeigt. Falls Du dich für lexikalisches Parsing interessierst, empfehle ich Dir mal einen Blick auf Angelscript zu werfen oder jede andere Scriptsprache deren Sourcecode offen liegt und es gibt massig Bücher dafür.
    Hoffe das war etwas verständlich. Aber wie überall gilt auch hier: Viele Wege führen nach Rom :)
    mfg
    Sometimes it pays to stay in bed in Monday, rather than spending the rest of the week debugging Monday's code. ~Dan Salomon

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von superuser ()

  • Man könnte jede Klammer als einen extra Stack aufbauen. So wird auf dem ersten Stack 4*3 ausgeführt, zwischengespeichert in Stack 2, das + hinzugefügt und auf Stack 3 5-1 gerechnet und danach auf stack 2 geadded.
    Wäre eine Möglichkeit.

    edit:
    Beachte aber bitte, dass ich von lexikalischem Parsing keine Ahnung habe :P. Aber auf diese Art würde ich das lösen. Ich finde aber auch, am Ende ist es egal wie es gemacht wird, hauptsache es funktioniert erstmal.
    mfg
    Sometimes it pays to stay in bed in Monday, rather than spending the rest of the week debugging Monday's code. ~Dan Salomon