正在从C++评估脚本表达式
Evaluating scripted expression from C++
我有一个应用程序,需要从源文件读取表达式并对其求值。到目前为止,我一直在使用muParser来完成这项工作。但现在我遇到了一个需要表达式中的简单循环支持的情况。我不需要从脚本语言或任何其他高级功能调用函数的能力,只需要:
- 数学表达式(+、-、/、*、&、|、~等)
- 逻辑表达式(!、||、&&等)
- 条件句(if,else..)
- 循环(用于)
使用muParser,我在读入表达式后解析它们,根据需要分配变量,然后求解:
expr="[0] + [1]*256 - 40"
在上面的例子中,我用它们对应的变量替换[0]和[1],然后就可以求解了。现在,我需要这样的东西:
expr="for(i=0; i < 10; i+=2) { if(i<=6) { [0] + [i]*256 -40; } }"
实际上,我所做的只是解析字节流。在脚本中,我将字节称为[byte],将位称为[bite][bit]。有人能提出一个好的框架/脚本启动程序可以让我做这样的事情吗?
boost提供Spirit,但它很复杂,对您的案例来说过于夸张。您可以利用好的muParser(最后一个版本处理三元"if"运算符),使用regex解析器只获取循环语法:非常容易编写。让muParser处理每个表达式,并开始解释变量绑定。您的解析器可能类似于:
class parse {
parse(const char *expr) {
if (match("for", "(", expr_init, ";" expr_test, ";", expr_after, ")", "{", body, "}"))
for (eval(expr_init); eval(expr_test); eval(expr_after)) { bind_variables and run...}
else
go_old_style...
}
}
尽管您似乎并不严格需要一种成熟的脚本语言,但您已经非常接近它,这可能是通往胜利的最简单途径。Lua和Python都很容易嵌入和从C(++)程序调用,Lua比Python稍微容易一些。
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 如何通过cpp程序运行shell脚本
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 使用正则表达式regex_search在字符串中查找字符串
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 概念中的cv限定符需要表达式参数列表
- 为什么constexpr的性能比正常表达式差
- 对于结构,表达式必须是可修改的ivalue
- 在程序中编写脚本来编写和编译代码
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 将fold表达式与std::一起用于两个元组
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 标记 '","' 之前的预期主表达式
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 如何在c++中使用system()来运行包含空格的python脚本
- 如何计算具有指定类型的表达式的相对精度和绝对精度
- 在cygwin中运行c++脚本时发生错误
- 正在从C++评估脚本表达式