好吧,我想在文本文件中有一个这样的字符串:
((( var1 AND var2 AND var3) OR var4) AND ((var5 OR var6) AND var7))
在将其解析为c程序并处理并正确设置变量之后,它将最终看起来像这样:
((( 1 AND 0 AND 0) OR 1) AND ((0 OR 1) AND 1))
是否有任何有用的库用于评估表示为这样的一个字符串的表达式?我以为我可以用字符串作为参数调用一个perl程序,它可以很容易地返回结果,但不确定C中是否有一个库可以做到这一点,或者是否有任何已知的算法可以解决这样的表达?
编辑:我实际上正在寻找的东西会吐出这个表达的答案,也许解析是一个坏词.即1或0
在一个坚果壳中,它包含一堆随机表达式(已知是正确的格式),需要被评估为0或1.(上面计算结果为1,因为它导致(1和1).
您可以在程序中嵌入lua,然后调用它的解释器来计算表达式.
我试着为这个bool表达式评估问题编写最紧凑的C代码.这是我的最终代码:
编辑:删除
这是增加的否定处理:
编辑:添加测试代码
char *eval( char *expr, int *res ){ enum { LEFT, OP1, MID, OP2, RIGHT } state = LEFT; enum { AND, OR } op; int mid=0, tmp=0, NEG=0; for( ; ; expr++, state++, NEG=0 ){ for( ;; expr++ ) if( *expr == '!' ) NEG = !NEG; else if( *expr != ' ' ) break; if( *expr == '0' ){ tmp = NEG; } else if( *expr == '1' ){ tmp = !NEG; } else if( *expr == 'A' ){ op = AND; expr+=2; } else if( *expr == '&' ){ op = AND; expr+=1; } else if( *expr == 'O' ){ op = OR; expr+=1; } else if( *expr == '|' ){ op = OR; expr+=1; } else if( *expr == '(' ){ expr = eval( expr+1, &tmp ); if(NEG) tmp=!tmp; } else if( *expr == '\0' || *expr == ')' ){ if(state == OP2) *res |= mid; return expr; } if( state == LEFT ){ *res = tmp; } else if( state == MID && op == OR ){ mid = tmp; } else if( state == MID && op == AND ){ *res &= tmp; state = LEFT; } else if( state == OP2 && op == OR ){ *res |= mid; state = OP1; } else if( state == RIGHT ){ mid &= tmp; state = MID; } } }
测试:
#includevoid test( char *expr, int exprval ){ int result; eval( expr, &result ); printf("expr: '%s' result: %i %s\n",expr,result,result==exprval?"OK":"FAILED"); } #define TEST(x) test( #x, x ) #define AND && #define OR || int main(void){ TEST( ((( 1 AND 0 AND 0) OR 1) AND ((0 OR 1) AND 1)) ); TEST( !(0 OR (1 AND 0)) OR !1 AND 0 ); }