también me gustaría ir por la respuesta lenguaje de script.
Usando C++ puro, probablemente usaría un generador de analizador sintáctico, que obtendrá las reglas de token y gramática, y me dará un código C que puede analizar exactamente el lenguaje de llamadas de función dado, y me proporciona un árbol de sintaxis esa llamada. flex
se puede utilizar para tokenizar una entrada, y bison
se puede utilizar para analizar los tokens y transformarlos en un árbol de sintaxis.Alternativamente a ese enfoque, Boost Spirit se puede utilizar para analizar el lenguaje de llamadas de función también. Nunca he usado ninguna de estas herramientas, pero he trabajado en programas que las usan, por lo que sé algo de lo que usaría en caso de que tuviera que resolver ese problema.
En casos muy simples, usted podría cambiar su sintaxis para esto:
func_name arg1, arg2
continuación, puede utilizar:
std::istringstream str(line);
std::string fun_name; str >> fun_name;
map[fun_name](tokenize_args(str));
El mapa habría una
std::map<std::string, boost::function<void(std::vector<std::string>)> > map;
lo cual llenarse con las funciones al comienzo de su programa. tokenize_args
simplemente separaría los argumentos y devolvería un vector de ellos como cadenas. Por supuesto, esto es muy primitivo, pero creo que es razonable si lo único que quieres es una forma de llamar a una función (por supuesto, si realmente quieres soporte de script, este enfoque no será suficiente).
Me gustaría ir a boost :: spirit, ya que aprenderá mucho sobre los analizadores sintácticos y sobre la metaprogramación de plantillas. – lothar