2009-01-28 108 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++解释器,可以嵌入您的应用程序中以提供脚本功能。