2012-01-29 70 views
0

我有一个应用程序需要阅读并评估源文件中的表达式。我一直在使用muParser来做到这一点。但是现在我遇到了一个需要简单循环支持的情况。我并不需要调用函数从脚本语言的能力,或任何其他先进的功能,真的只是:从C++中评估脚本化表达式

  • 数学表达式(+, - ,/,*,&,|,〜,等)
  • 逻辑表达式(!,||,& &等)
  • 条件句(如果,否则..)
  • 循环(对于)

随着muParser我解析表达式AFTE R读取它们,根据需要分配变量,然后求解:

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]。有人可能会建议一个好的框架/脚本语言会让我做这样的事吗?

回答

1

尽管您似乎并不严格需要一种完整的脚本语言,但您已经越来越接近它,这可能是获得胜利的最简单途径。 Lua和Python都可以很容易地从C(++)程序中嵌入和调用,Lua比Python更容易。

+0

也好(尽管不太广泛使用)是AngelScript(http://www.angelcode.com/angelscript/),它有一个非常类似C++的语法。 – 2012-01-29 23:58:34

+0

我想我会咬紧牙关,并选择其中的一种。感谢所有 – Prismatic 2012-01-30 01:49:12

2

boost提供精神,但它是复杂的和你的情况矫枉过正。你可以利用良好的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... 
} 
} 
+0

感谢您的建议 - 但我觉得我可能会遇到问题后面的这条路线。写这篇文章会让我写自己的解释器,我可能会搞砸:) – Prismatic 2012-01-30 01:50:38