Effektiv Input parsen?
-
Hi,
ich stehe immer wieder vor der Aufgabe Benutzereingaben zu parsen, also z.B:
Ein Programm hat vordefinierte Funktionen, die vom Benutzer eingegeben werden können, um die gewünschte Aktion auszuführen.Nachdem diese Problemstellung sehr häufig vorkommt, wollte ich einmal die Spezialisten fragen, wie man das am besten/effizientesten löst? Am meisten würde mich momentan eine Lösung in C++ interessieren.
Bisher habe ich meist den Eingabestring mittels StringTokenizer in die einzelnen Token zerlegt und anschließend mit ewig langen if - else if - else if - usw. mit den möglichen Befehlen verglichen. Aber es muss doch eine Möglichkeit geben diese if-else if-Blöcke zu umgehen?!
Wie löst Ihr solche Aufgaben?
Ich hoffe, ich konnte mich halbwegs verständlich ausdrücken;).
mfg,
soad
-
-
Um die Benutzereingaben zu verarbeiten oder meine Konfigurationsdateien zu parsen habe ich einen kleinen, unvollständigen und ineffizienten FORTH Interpreter geschrieben, da FORTH IMHO die am einfachsten zu interpretierende Sprache ist. Wobei ich um ewig lange if/else auch nicht herum kam.
boost::spirit ist natürlich auch sehr genial.
-
am einfachsten ist, man macht eine tabelle mit strings und function pointern.
und dann, wenn ein string gefunden wurde, einfach die tabelle durchrattern und die funktion aufrufen.
beispiel:void f (void) { printf ("hallo\n"); } void g (void) { printf ("welt?\n"); } struct tablestruct { char *command_name; void (*function)(void); } table[] = { {"hello", f}, {"lala", g}, {0, 0}, }; void call_function (char *name) { struct tablestruct *t = table; while (t->command_name) { if (strcmp (t->command_name, name) == 0) { t->function(); return; } t++; } } void main (void) { call_function ("lala"); }ist zwar kein astreines c++, aber dürfte leicht anzupassen sein...

-
@vista
in C++ würde man wohl eher std::map oder std::tr1::hash nehmen (void main *hust*)mastercpp schrieb:
Um die Benutzereingaben zu verarbeiten oder meine Konfigurationsdateien zu parsen habe ich einen kleinen, unvollständigen und ineffizienten FORTH Interpreter geschrieben, da FORTH IMHO die am einfachsten zu interpretierende Sprache ist. Wobei ich um ewig lange if/else auch nicht herum kam.
yeah FORTH!Wenn man eine Script-Sprache haben will, kann man aber auch zu fertigen Lösungen greifen:
Boost::Python
Lua
Swig
etc.
-
-
Danke für die zahlreichen Antworten!