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++中实现它.
我也会选择脚本语言答案.
使用纯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
只是将参数分开,并将它们的向量作为字符串返回.当然,这是非常原始的,但我认为如果你想要的只是一种调用函数的方法是合理的(当然,如果你想要真正的脚本支持,这种方法是不够的).