String tokenisieren und MIT Tokens abspeichern.
-
Hallo
Ich will einen Eingabestring in seine Einzelteile zerlegen.
Es geht einen kleinen Taschenrechner der einen geklammerten Ausdruck mit den 4 Grundrechenarten auswerten soll.Als Beispiel: (3 + 4) * 2+34+((7\2)-4 )
Meine Idee war jetzt erstmal alle leerzeichen zu eleminieren.
(3+4)*2+34+((7\2)-4)
Dann wollte ich den Rest nach seinen Zeichen zerlegen. "(,),+,*,-,\")
Die Zeichen will ich aber im Ergebnis Array gespeichert lassen, weil ich sie dann mittels "switch-case" abarbeiten wollte.
Mein bisheriger Ansatz mit dem gefundenen Code-Schnipsel erstellt einen String-Vektor und fügt die Tokens ohne Trennzeichen ein.
vector<string> tokenize(const string& str, char delim) { vector<string> tokens; stringstream mySstream(str); string temp; while(getline(mySstream, temp, delim)) tokens.push_back(temp); return tokens; }Hab auch schon ein bissl dran rumgebastelt und die Trennzeichen manuel wieder hinzugefügt, allerdings bekomme ich Probleme, weil ich mehrere Trennzeichen auf einmal habe.
Hat jemand einen Tip, in welche Richtung ich mich mal weiter einarbeiten sollte ?
Vielen Dank für jede Hilfe
Gruß,
Sebastian
-
Hallo,
das allgemeine Stichwort heißt Parser, und davon gibt es dann verschiedene Möglichkeiten z.B. ein einfacher Top-Down-Parser.
Der Artikel Interpreterbau - Ein Anfang zeigt, wie man so einen Matheparser umsetzen kann.Dein Ansatz wird so auch nicht direkt funktionieren, da du für Klammerrechnung und verschiedenen Operatorpräzedenzen (z.B. * vor +) einen hierarchischen (rekursiven) Ansatz benötigst.
P.S: Alternativ darfst du dir auch gerne meinen Matheparser unter http://www.c-plusplus.net/forum/p1780654#1780654 anschauen (und nach den beschriebenen Änderungen auch benutzen ;-).
-
Danke sehr !
Also die Rekursion wollte ich nachher mittels der "(" und ")" ein und ausleiten, wobei die Idee nur vage im Kopf war.
Aber dank deinem Link arbeite ich mich jetzt mal durch scannen und parsen durch.
Im Prinzip löst das ja genau die Aufgabe die ich lösen wollte ^^
Ich guck mal ob ich da alles verstehe und falls ich nicht weiterkomme melde ich mich nochmal.
Gruß,
Sebastian