我在我的計劃了幾個函數,如下所示:製作一個C++應用程序編寫腳本
void foo(int x, int y)
現在,我想我的程序獲得一個字符串,看起來像:
foo(3, 5)
,並執行相應的功能。什麼是最直接的實現方式?
當我直截了當地說,我的意思是合理的可擴展和優雅,但它不應該花太長的代碼。
編輯:
在使用一個真正的腳本語言,當然會解決我的問題,我還是想知道,如果在純C實現這一++的快捷方式。
我在我的計劃了幾個函數,如下所示:製作一個C++應用程序編寫腳本
void foo(int x, int y)
現在,我想我的程序獲得一個字符串,看起來像:
foo(3, 5)
,並執行相應的功能。什麼是最直接的實現方式?
當我直截了當地說,我的意思是合理的可擴展和優雅,但它不應該花太長的代碼。
編輯:
在使用一個真正的腳本語言,當然會解決我的問題,我還是想知道,如果在純C實現這一++的快捷方式。
我還去了腳本語言的答案。使用純C++,我可能會使用一個解析器生成器,它將得到令牌和語法規則,並且會給我C代碼來精確地解析給定的函數調用語言,併爲我提供一個語法樹那個電話。 flex
可用於標記輸入,bison
可用於解析令牌並將其轉換爲語法樹。除此之外,Boost Spirit也可用於解析函數調用語言。我從來沒有使用任何這些工具,但已經在使用它們的程序上工作,因此我有點知道如果我必須解決這個問題,我會用什麼。
對於非常簡單的情況下,你可以在你的語法改成這樣:
func_name arg1, arg2
然後你可以使用:
std::istringstream str(line);
std::string fun_name; str >> fun_name;
map[fun_name](tokenize_args(str));
的地圖將是一個
std::map<std::string, boost::function<void(std::vector<std::string>)> > map;
哪會可以在程序開始時使用這些功能。 tokenize_args
只會分隔參數,並將它們的向量作爲字符串返回。當然,這是非常原始的,但我認爲這是合理的,如果你想要的是某種方式來調用一個函數(當然,如果你真的想要腳本支持,這種方法是不夠的)。
你可以看看Lua。
你可以很簡單地嵌入Python,這會給你一個非常強大的,可擴展的腳本程序的方式。您可以使用下面的輕鬆(或多或少)暴露你的C++代碼的Python:
我個人使用升壓Python和我很高興,但編譯速度慢,可能難以調試。
SWIG非常好,非常靈活。 – vrdhn 2009-03-23 17:47:53
正如丹尼爾說:
腳本語言,如Lua和Python的將是C++庫結合在一起,最常用的腳本語言。
你將不得不添加一個腳本接口到你的C++應用程序。這個界面的組建顯然取決於你選擇的腳本語言。
如果您只希望通過文字名稱調用函數,則可以使用鏈接器特定的函數。
在符合POSIX標準的操作系統(如Linux)上,可以使用dlopen()和dlsym()。您只需解析輸入字符串並找出函數名稱和參數。然後你可以讓鏈接器使用dlsym()按名稱查找函數。
然而,在Windows上,這些功能不可用(除非有一些像Cygwin一樣的POSIX環境)。但是你可以使用Windows API。
你可以看看這裏的詳細信息,這些事情:http://en.wikipedia.org/wiki/Dynamic_loading
您的系統是否需要「取一個字符串」?你可以在你的應用程序中公開COM(或CORBA,或其他)接口,並且可以直接將這些命令調用到應用程序中。
Fabio Lombardelli的C++ Reflection [2]通過模板元編程技術爲C++提供了全面的重新選擇。雖然它與C++標準完全兼容,它需要程序員來註釋類,以便forthem用於反射
http://cppreflect.sourceforge.net/
否則你會想要一個函數指針的哈希表,我認爲
CERN提供CINT,一個C/C++解釋器,可以嵌入您的應用程序中以提供腳本功能。
看看Lua - 做什麼?該頁面幾乎沒有用來描述如何嵌入語言。即使手冊的第3頁(http://www.lua.org/manual/5.1/manual.html#3)更接近,但對OP沒有幫助。 – jim 2009-01-28 13:13:19
「使用lua」正在成爲對類似問題的膝蓋反應。 – artificialidiot 2009-01-28 13:25:07