2009-01-28 10 views
8

ho diverse funzioni nel mio programma che assomigliano a questo:Fare un C++ app script

void foo(int x, int y) 

Ora voglio il mio programma di prendere una stringa che assomiglia:

foo(3, 5) 

ed eseguire il funzione corrispondente. Qual è il modo più diretto per implementarlo?

Quando dico semplice, intendo ragionevolmente estendibile ed elegante, ma non dovrebbe richiedere troppo tempo per la codifica.

Edit:

Durante l'utilizzo di un vero e proprio linguaggio di scripting sarebbe ovviamente risolvere il mio problema, mi piace ancora di sapere se c'è un modo rapido per implementare questo in puro C++.

risposta

5

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).

+0

Vorrei fare il boost: spirit, visto che imparerai molto sui parser e sulla metaprogrammazione dei modelli. – lothar

8

Si potrebbe dare un'occhiata a Lua.

+0

guarda Lua - fare COSA ??? Quella pagina è quasi inutile per descrivere come incorporare la lingua. Anche la pagina 3 del manuale (http://www.lua.org/manual/5.1/manual.html#3) si avvicina ma non aiuta l'OP. – jim

+0

"Usa lua" sta diventando una reazione istintiva a domande simili. – artificialidiot

10

È possibile incorporare Python in modo abbastanza semplice, e questo ti darebbe un modo molto potente ed estensibile per creare script del tuo programma. È possibile utilizzare il seguente facilmente (più o meno) esporre il codice C++ per Python:

io personalmente uso Boost Python e sono felice con lui, ma è lento da compilare e può essere difficile eseguire il debug.

+1

SWIG è molto buono e molto flessibile. – vrdhn

3

come Daniele disse:

lingue script come Lua e Python sarebbero i linguaggi di script più utilizzati per legare insieme C++ librerie.

Dovrai aggiungere un'interfaccia di script alla tua applicazione C++. L'accumulo di questa interfaccia dipende ovviamente dal linguaggio di script che hai scelto.

1

Se si desidera chiamare una funzione solo in base al nome letterale, è possibile utilizzare le funzioni specifiche del linker.

Su sistemi operativi conformi a POSIX (come Linux), è possibile utilizzare dlopen() e dlsym(). È sufficiente analizzare la stringa di input e capire il nome e gli argomenti della funzione. Quindi puoi chiedere al linker di trovare la funzione per nome usando dlsym().

Su Windows, tuttavia, queste funzioni non sono disponibili (a meno che non ci sia un ambiente POSIX in giro, come Cygwin). Ma puoi usare l'API di Windows.

Si può dare un'occhiata qui per maggiori dettagli su queste cose: http://en.wikipedia.org/wiki/Dynamic_loading

0

Il sistema deve "prendere una stringa"? È possibile esporre le interfacce COM (o CORBA, o qualsiasi altra cosa) sull'applicazione e fare in modo che qualsiasi cosa stia generando tali comandi chiama direttamente nell'applicazione.

1

C++ Reflection [2] di Fabio Lombardelli fornisce un completo re-flection per C++ tramite tecniche di metaprogrammazione dei modelli. Mentre è pienamente compatibile con gli standard C++, richiede al programmatore di annotare le classi al fine forthem ad essere riflessivi

http://cppreflect.sourceforge.net/

altrimenti che ci si vuole un tavolo funzione di puntatore di hash penso

2

CERN fornisce CINT, un interprete C/C++ che può essere incorporato all'interno dell'applicazione per fornire funzionalità di scripting.

Problemi correlati