正在从C++评估脚本表达式

Evaluating scripted expression from C++

本文关键字:脚本 表达式 评估 C++      更新时间:2023-10-16

我有一个应用程序,需要从源文件读取表达式并对其求值。到目前为止,我一直在使用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稍微容易一些。