0

我有一个string

string expression=((true AND true)OR false); 

如何将其转换string为条件语句,以便我可以在if语句中使用它,即

if((true AND true)OR false))

就像eval在 JavaScript 中一样 - C++ 或 C 中是否有任何 API?

4

4 回答 4

5

您可以使用第三方脚本库,例如 LUA ( http://www.lua.org/ ) 来执行此操作,或者您可以编写自己的表达式解析器(这很重要)。

于 2013-08-06T13:02:02.703 回答
3

从根本上说,C/C++ 代码必须在运行之前进行编译,这限制了您像在其他一些语言中那样动态地运行代码。

您可以轻松获得的最接近的行为是将字符串解析为某种内部表示,并让您的代码响应该表示。例如使用增强精神:

http://boost-spirit.com/home/

例如,这个答案可以满足您的要求,并且具有增强的精神。但正如您所看到的,需要付出很多努力:

C ++中的布尔表达式(语法)解析器

于 2013-08-06T13:06:52.250 回答
3
#include <stdio.h>
#include <stdlib.h>

int eval(const char *boolean_expression){
    FILE *fp = fopen("temp.c", "w");
    int ret;
    fprintf(fp, 
        "#include <stdbool.h>\n"
        "#include <iso646.h>\n"
        "int main(void){\n"
        "return (int)%s;}", boolean_expression);
    fflush(fp);
    fclose(fp);
    system("gcc temp.c -o temp");
    remove("temp.c");
    ret=system("temp.exe");
    remove("temp.exe");
    return ret;
}

int main(void){
    const char *expression="((true and true) or false)";
    int condition = eval(expression);

    if(condition)
        printf("YES\n");
    else
        printf("NO!\n");
    return 0;
}
于 2013-08-06T14:23:08.537 回答
0

C 和 C++ 没有eval类型功能——那是因为语言是经过编译的,如果你想能够“编译更多代码”,就需要整个编译器成为运行时的一部分——别管它的困难引用例如现有变量。

对于这种类型的表达式,编写一些解析和评估表达式的代码并不难——它需要一个堆栈来处理括号和一些简单的运算符,但这并不难。

显然,集成现有的脚本语言也可以。

于 2013-08-06T13:04:42.917 回答