使C++应用程序可编写脚本

drb*_*rby 8 c++ string scripting

我的程序中有几个函数看起来像这样:

void foo(int x, int y)
Run Code Online (Sandbox Code Playgroud)

现在我希望我的程序采用如下字符串:

foo(3, 5)
Run Code Online (Sandbox Code Playgroud)

并执行相应的功能.实现这一目标最简单的方法是什么?

当我直截了当地说,我的意思是合理的可扩展性和优雅,但编码不应该花太长时间.

编辑:

虽然使用真正的脚本语言当然可以解决我的问题,但我仍然想知道是否有一种快速的方法可以在纯C++中实现它.

Sim*_*ele 10

您可以非常简单地嵌入Python,这将为您提供一种非常强大,可扩展的脚本来编写程序.您可以使用以下内容轻松(或多或少)将您的C++代码公开给Python:

我个人使用Boost Python,我很满意,但编译速度慢,难以调试.


Dan*_*oof 8

你可以看看Lua.


Joh*_*itb 5

我也会选择脚本语言答案.

使用纯C++,我可能会使用一个解析器生成器,它将获得令牌和语法规则,并将给我一个完全可以解析给定函数调用语言的C代码,并为我提供该调用的语法树.flex可用于标记输入,bison并可用于解析标记并将其转换为语法树.除此方法之外,Boost Spirit也可用于解析函数调用语言.我从来没有使用过任何这些工具,但已经使用过它们的程序,因此我有点知道如果我必须解决这个问题我会用什么.

对于非常简单的情况,您可以将语法更改为:

func_name arg1, arg2
Run Code Online (Sandbox Code Playgroud)

然后你可以使用:

std::istringstream str(line);
std::string fun_name; str >> fun_name;
map[fun_name](tokenize_args(str));
Run Code Online (Sandbox Code Playgroud)

地图将是一个

std::map<std::string, boost::function<void(std::vector<std::string>)> > map;
Run Code Online (Sandbox Code Playgroud)

哪个将填充程序开头的功能.tokenize_args只是将参数分开,并将它们的向量作为字符串返回.当然,这是非常原始的,但我认为如果你想要的只是一种调用函数的方法是合理的(当然,如果你想要真正的脚本支持,这种方法是不够的).