【问题标题】:Evaluating scripted expression from C++从 C++ 评估脚本表达式
【发布时间】:2019-01-24 00:37:11
【问题描述】:

我有一个应用程序需要从源文件中读取和评估表达式。到目前为止,我一直在使用 muParser 来执行此操作。但是现在我遇到了一种情况,我需要在表达式中提供简单的循环支持。我不需要从脚本语言或任何其他高级功能调用函数的能力,实际上只是:

  • 数学表达式(+、-、/、*、&、|、~等)
  • 逻辑表达式(!、||、&& 等)
  • 条件句(if,else..)
  • 循环(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]。有人可以建议一个好的框架/脚本语言可以让我做这样的事情吗?

【问题讨论】:

    标签: c++ parsing


    【解决方案1】:

    boost 提供 Spirit,但对于您的情况而言,它既复杂又过分。您可以利用良好的 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...
     }
    }
    

    【讨论】:

    • 感谢您的建议——但我觉得我以后可能会在这条路线上遇到问题。写这篇文章让我走上了编写自己的解释器的道路,我可能会搞砸:)
    【解决方案2】:

    即使您似乎并不严格需要一种成熟的脚本语言,但您已经如此接近它,这可能是通往胜利的最简单途径。 Lua 和 Python 都非常容易嵌入和从 C(++) 程序调用,Lua 比 Python 稍微容易一些。

    【讨论】:

    • AngelScript (angelcode.com/angelscript) 也不错(尽管使用较少),它的语法非常类似于 C++。
    • 我想我会硬着头皮选择这些选择之一。谢谢大家
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 2013-10-12
    • 2018-12-29
    相关资源
    最近更新 更多