ich auch für die Skriptsprache Antwort gehen würde.
Mit reinem C++ würde ich wahrscheinlich einen Parser-Generator verwenden, der die Token- und Grammatikregeln erhält und mir C-Code liefert, der die gegebene Funktionsaufrufsprache genau parsen kann und mir einen Syntaxbaum von dieser Anruf. flex
kann verwendet werden, um eine Eingabe zu token, und bison
kann verwendet werden, um die Token zu analysieren und sie in einen Syntaxbaum zu transformieren.Alternativ zu diesem Ansatz kann Boost Spirit verwendet werden, um auch die Funktionsaufrufsprache zu analysieren. Ich habe noch nie eines dieser Tools benutzt, sondern habe an Programmen gearbeitet, die sie benutzen, daher weiß ich etwas, was ich verwenden würde, falls ich dieses Problem lösen müsste.
Für sehr einfachen Fällen, könnten Sie Ihre Syntax dies ändern:
func_name arg1, arg2
Dann können Sie verwenden:
std::istringstream str(line);
std::string fun_name; str >> fun_name;
map[fun_name](tokenize_args(str));
Die Karte ein
std::map<std::string, boost::function<void(std::vector<std::string>)> > map;
wäre Was würde mit den Funktionen am Anfang Ihres Programms gefüllt werden.
tokenize_args
würde nur die Argumente trennen und einen Vektor von ihnen als Zeichenfolgen zurückgeben. Natürlich ist das sehr primitiv, aber ich denke, es ist vernünftig, wenn Sie nur eine Möglichkeit haben wollen, eine Funktion aufzurufen (wenn Sie wirklich Script-Unterstützung wünschen, reicht dieser Ansatz natürlich nicht aus).
Ich würde für boost :: spirit gehen, da Sie eine Menge über Parser und über Template-Metaprogrammierung lernen werden. – lothar