从C ++评估脚本表达式

时间:2012-01-29 22:40:43

标签: c++ parsing

我有一个应用需要读入并评估源文件中的表达式。到目前为止,我一直在使用muParser来做这件事。但是现在我遇到了一个需要在表达式中使用简单循环支持的情况。我不需要能够从脚本语言或任何其他高级功能调用函数,只需:

  • 数学表达式(+, - ,/,*,&,|,〜等)
  • 逻辑表达式(!,||,&&等)
  • 条件(if,else ..)
  • loops(for)

使用muParser,我在阅读后解析表达式,根据需要分配变量然后求解:

expr="[0] + [1]*256 - 40"

在上面的例子中,我将[0]和[1]替换为相应的变量,然后可以解决。现在,我需要这样的东西:

expr="for(i=0; i < 10; i+=2) {  if(i<=6) { [0] + [i]*256 -40; }  }"

我现在所做的就是解析一个字节流。在脚本中,我将字节称为[byte],将位称为[byte] [bit]。有人可以建议一个好的框架/脚本launguage让我做这样的事情吗?

2 个答案:

答案 0 :(得分:2)

提升提供精神,但它对你的情况来说复杂而且过度。你可以利用好的muParser(最后一个版本处理三元'if'运算符),用正则表达式解析器抓取循环语法:非常容易编写。让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...
 }
}

答案 1 :(得分:1)

即使你似乎并不需要一个完整的脚本语言,但你已经非常接近它,这可能是获胜的最简单途径。 Lua和Python都非常容易嵌入和调用C(++)程序,Lua比Python稍微容易。