Brauche Idee für eleganten Code(Parser)
-
Heho, ich schreibe derzeit an einem Parser für arithmetische Gleichungen(also z.B. 5*4-(3.2+5) oder so)
Dies löse ich(bzw. wird am Ende gelöst) über einen Parserbaum. Dazu muss ich den String bzw. den zu verarbeitenden Ausdruck zunächst aufspalten. Dies geschieht gemäß der Operatorenvorrangigkeit.
Nun ist die Frage wie ich das Auftrennen am besten vornehme.
Das Problem was ich gerade habe ist folgendes:Ich würde den String mittels Schleifen nacheinander nach den verschidenen Operatoren durchsuchen, also für jeden Operator eine eigene Schleife durchführen.
Das ist natürlich ziemlich unelegant.Meine alternative Idee war einmal den String zu durchsuchen und die Orte der Operatoren in einem Array zu speichern und diesen danach auszuwerten.
Das würde mir vermutlich diverse Schleifen ersparen und könnte zielgenauer bearbeitet werden.
Aber das kommt mir irgendwie ineffektiv vor, daher meine Frage ob jemandem hier eine bessere Vorgehensweise einfällt.Anmerkung am Rande: Mag sein das das vorgehen mit dem Parserbaum nicht so toll ist(Idee stammt von Wiki), aber bin jetzt soweit fortgeschritten das ich es damit zu ende programmieren möchte. Also Bemerkungen die das kritisieren nicht den einzigen Inhalt eurer Posts sein lassen
Das hilft mir leider auch nicht^^DAAANKE SEHR
-
Ich schlage einen rekursiven Abstiegsparser vor.
-
Das hatte ich auch vor, nur muss ich ja trotzdem in dem Ausdruck nach den operatoren suchen. Gibt natürlich die find() methode, aber die macht ja auch nichts anderes als ne Schleife(Nehme ich an). Müsste dann für jeden Operator eine eigene Schleife erstellen, was ich sehr doof fände.
Dnake für deine Antwort
-
kingcools schrieb:
Heho, ich schreibe derzeit an einem Parser für arithmetische Gleichungen(also z.B. 5*4-(3.2+5) oder so)..., daher meine Frage ob jemandem hier eine bessere Vorgehensweise einfällt.
Guckst Du hier zum Expression-Parser.
-
flex und bison ...
-
knivil schrieb:
flex und bison ...
Oder Spirit2, ist auch nicht weniger/mehr Overkill

-
Hallo kingcools,
das Aufteilen übernimmt i.d.R. ein sogenannter "Tokenizer", d.h. es werden von links nach rechts einzelnen Tokens extrahiert und verschieden zugeordnet (z.B. Zahlen, Schlüsselwörter, (Variablen-)Namen, Operatoren etc.), d.h. jede Tokenklasse besteht nur aus bestimmten Zeichen (z.B. Zahlen nur aus Ziffern und '.', Namen nur aus Buchstaben gefolgt von Buchstaben oder Zahlen, Operatoren nur aus Nicht-Buchstaben/Zahlen etc.).
Du kannst dir auch mal meine Implementierung anschauen, s.
http://www.c-plusplus.net/forum/viewtopic-var-p-is-1808875.html#1808875
bzw.
http://www.c-plusplus.net/forum/viewtopic-var-p-is-1780654.html#1780654
-
Vielen Dank für eure Antworten

Und die Parserbeispiele sind interessant.
Hab mir aber gedacht, dass ich den krams jetzt endlich fertig haben will und da die performance beim zerlegen eines ausdrucks(nicht während der laufzeit) nicht so wichtig ist, nehm ich mal meine variante(die klobige), wobei die gepostete eigentlich so ähnlich ist, nur das ich mehr operatoren verarbeitee(alle des c standards)