una programar para hacer desarrolladas como app aplicaciones aplicacion c++ string scripting

programar - como hacer una aplicacion en c++



Hacer una aplicaciĆ³n C++ con script (8)

¿Tu sistema tiene que "tomar una cadena"? Puede exponer interfaces COM (o CORBA, o lo que sea) en su aplicación y hacer que lo que esté generando estos comandos llame a su aplicación directamente.

Tengo varias funciones en mi programa que se ven así:

void foo(int x, int y)

Ahora quiero que mi programa tome una cadena que se parece a:

foo(3, 5)

Y ejecuta la función correspondiente. ¿Cuál es la forma más directa de implementar esto?

Cuando digo directo, me refiero razonablemente extensible y elegante, pero no debería tomar demasiado tiempo para codificar.

Editar:

Si bien el uso de un lenguaje de scripting real, por supuesto, resolvería mi problema, me gustaría saber si hay una forma rápida de implementar esto en C ++ puro.


Como Daniel dijo:

Los lenguajes de script como Lua y Python serían los lenguajes de script más utilizados para unir bibliotecas de C ++.

Tendrá que agregar una interfaz de script a su aplicación de C ++. La creación de esta interfaz obviamente depende del lenguaje de script que elija.


Podrías echarle un vistazo a Lua .


Puede incrustar Python de manera bastante simple, y eso le daría una forma realmente poderosa y extensible para crear un script de su programa. Puede usar lo siguiente para exponer fácilmente (más o menos) su código C ++ a Python:

Yo personalmente uso Boost Python y estoy contento con él, pero es lento de compilar y puede ser difícil de depurar.


Si solo desea llamar a una función por nombre literal, puede usar funciones específicas del enlazador.

En los sistemas operativos que cumplen con POSIX (como Linux), puede usar dlopen () y dlsym (). Simplemente analiza la cadena de entrada y calcula el nombre y los argumentos de la función. Luego puede pedirle al vinculador que encuentre la función por nombre usando dlsym ().

En Windows, sin embargo, estas funciones no están disponibles (a menos que haya algún ambiente POSIX alrededor, como Cygwin). Pero puedes usar la API de Windows.

Puede echar un vistazo aquí para obtener detalles sobre estas cosas: http://en.wikipedia.org/wiki/Dynamic_loading


C ++ Reflection [2] de Fabio Lombardelli ofrece una reflexión completa para C ++ a través de técnicas de metaprogramación de plantillas. Si bien es totalmente compatible con los estándares de C ++, requiere que el programador anote las clases para que sea reflexivo.

http://cppreflect.sourceforge.net/

de lo contrario, querrías una tabla hash de puntero a función, creo


CERN proporciona CINT , un intérprete C / C ++ que puede integrarse dentro de su aplicación para proporcionar capacidades de scripting.


También me gustaría ir a la respuesta del lenguaje de scripting.

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 llamada de función dado, y me proporciona un árbol de sintaxis de esa llamada. flex se puede usar para tokenizar una entrada, y bison se puede usar para analizar los tokens y transformarlos en un árbol de sintaxis. Alternativamente a ese enfoque, Boost Spirit también se puede utilizar para analizar el lenguaje de llamadas de funció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.

Para casos muy simples, puede cambiar su sintaxis a esto:

func_name arg1, arg2

Entonces puedes usar:

std::istringstream str(line); std::string fun_name; str >> fun_name; map[fun_name](tokenize_args(str));

El mapa sería un

std::map<std::string, boost::function<void(std::vector<std::string>)> > map;

Que se llenaría con las funciones al inicio 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).