2009-01-28 77 views
8

我在我的計劃了幾個函數,如下所示:製作一個C++應用程序編寫腳本

void foo(int x, int y) 

現在,我想我的程序獲得一個字符串,看起來像:

foo(3, 5) 

,並執行相應的功能。什麼是最直接的實現方式?

當我直截了當地說,我的意思是合理的可擴展和優雅,但它不應該花太長的代碼。

編輯:

在使用一個真正的腳本語言,當然會解決我的問題,我還是想知道,如果在純C實現這一++的快捷方式。

回答

5

我還去了腳本語言的答案。使用純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只會分隔參數,並將它們的向量作爲字符串返回。當然,這是非常原始的,但我認爲這是合理的,如果你想要的是某種方式來調用一個函數(當然,如果你真的想要腳本支持,這種方法是不夠的)。

8

你可以看看Lua

+0

看看Lua - 做什麼?該頁面幾乎沒有用來描述如何嵌入語言。即使手冊的第3頁(http://www.lua.org/manual/5.1/manual.html#3)更接近,但對OP沒有幫助。 – jim 2009-01-28 13:13:19

+0

「使用lua」正在成爲對類似問題的膝蓋反應。 – artificialidiot 2009-01-28 13:25:07

10

你可以很簡單地嵌入Python,這會給你一個非常強大的,可擴展的腳本程序的方式。您可以使用下面的輕鬆(或多或少)暴露你的C++代碼的Python:

我個人使用升壓Python和我很高興,但編譯速度慢,可能難以調試。

+1

SWIG非常好,非常靈活。 – vrdhn 2009-03-23 17:47:53

3

正如丹尼爾說:

腳本語言,如Lua和Python的將是C++庫結合在一起,最常用的腳本語言。

你將不得不添加一個腳本接口到你的C++應用程序。這個界面的組建顯然取決於你選擇的腳本語言。

1

如果您只希望通過文字名稱調用函數,則可以使用鏈接器特定的函數。

在符合POSIX標準的操作系統(如Linux)上,可以使用dlopen()和dlsym()。您只需解析輸入字符串並找出函數名稱和參數。然後你可以讓鏈接器使用dlsym()按名稱查找函數。

然而,在Windows上,這些功能不可用(除非有一些像Cygwin一樣的POSIX環境)。但是你可以使用Windows API。

你可以看看這裏的詳細信息,這些事情:http://en.wikipedia.org/wiki/Dynamic_loading

0

您的系統是否需要「取一個字符串」?你可以在你的應用程序中公開COM(或CORBA,或其他)接口,並且可以直接將這些命令調用到應用程序中。

1

Fabio Lombardelli的C++ Reflection [2]通過模板元編程技術爲C++提供了全面的重新選擇。雖然它與C++標準完全兼容,它需要程序員來註釋類,以便forthem用於反射

http://cppreflect.sourceforge.net/

否則你會想要一個函數指針的哈希表,我認爲

2

CERN提供CINT,一個C/C++解釋器,可以嵌入您的應用程序中以提供腳本功能。

相關問題