C++ 从C++;

C++ 从C++;,c++,parsing,C++,Parsing,我有一个应用程序需要从源文件读入和计算表达式。到目前为止,我一直在使用muParser来实现这一点。但现在我遇到了一个需要表达式中的简单循环支持的情况。我不需要从脚本语言或任何其他高级功能调用函数,只需要: 数学表达式(+、-、/、*、&、|、~,等) 逻辑表达式(!,| |,&&&,等) 条件句(if,else…) 循环(用于) 使用muParser,我在读入表达式后解析表达式,根据需要分配变量,然后求解: expr="[0] + [1]*256 - 40" 在上面的例子中,我将[0]和

我有一个应用程序需要从源文件读入和计算表达式。到目前为止,我一直在使用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; }  }"

expr=“for(i=0;i<10;i++=2){if(i尽管您似乎并不严格需要一种成熟的脚本语言,但您已经离它很近了,这可能是最容易取得胜利的途径。Lua和Python都很容易嵌入,并且可以从C++调用Lua比Python稍微容易一些。

尽管您似乎并不严格需要一种成熟的脚本语言,但您离它越来越近了,这可能是通往胜利的最简单途径。Lua和Python都很容易嵌入并从C++调用程序,Lua比Python稍微简单一些。

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...
 }
}

boost提供了Spirit,但它对于您的情况来说既复杂又过分。您可以利用好的muParser(最新版本的handle-trimal'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...
 }
}

AngelScript()也很好(虽然使用较少),它的语法非常类似C++。我想我会咬紧牙关,选择其中一种。谢谢,AngelScript()也很好(虽然使用较少),具有非常类似C++的语法。我想我会咬紧牙关,选择其中一种。谢谢大家的建议——但我觉得我以后可能会遇到这个问题。写这篇文章会让我走上编写自己的解释器的道路,我可能会搞砸:)谢谢你的建议——但我觉得我以后可能会遇到这个问题。写这篇文章会让我走上写自己的翻译的道路,我可能会搞砸:)