mi piacerebbe anche andare per la risposta linguaggio di scripting.
Utilizzando puro C++, probabilmente utilizzare un generatore di parser, che otterrà le regole di token e grammaticali, e mi darà il codice C che esattamente in grado di analizzare il dato linguaggio funzione di chiamata, e mi dà un albero di sintassi quella chiamata. flex
può essere utilizzato per tokenizzare un input e bison
può essere utilizzato per analizzare i token e trasformarli in un albero di sintassi.In alternativa a tale approccio, è possibile utilizzare Boost Spirit per analizzare anche la lingua di chiamata della funzione. Non ho mai usato nessuno di questi strumenti, ma ho lavorato su programmi che li usano, quindi so in qualche modo cosa utilizzerei nel caso in cui dovessi risolvere quel problema.
Per i casi molto semplici, si potrebbe cambiare la vostra sintassi per questo:
func_name arg1, arg2
quindi è possibile utilizzare:
std::istringstream str(line);
std::string fun_name; str >> fun_name;
map[fun_name](tokenize_args(str));
La mappa sarebbe un
std::map<std::string, boost::function<void(std::vector<std::string>)> > map;
che avrebbe essere popolato con le funzioni all'inizio del programma. tokenize_args
separerebbe semplicemente gli argomenti e restituirà loro un vettore come stringhe. Naturalmente, questo è molto primitivo, ma penso sia ragionevole se tutto ciò che si desidera sia un modo per chiamare una funzione (ovviamente, se si vuole veramente il supporto per gli script, questo approccio non è sufficiente).
fonte
2009-01-28 13:14:34
Vorrei fare il boost: spirit, visto che imparerai molto sui parser e sulla metaprogrammazione dei modelli. – lothar