C防爆Ex pression计算器 [英] c expression Evaluator

查看:152
本文介绍了C防爆Ex pression计算器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

好吧可以说我有一个字符串,像这样一个文本文件:

Okay lets say I have a string such as this in a text file:

((( var1 AND var2 AND var3) OR var4) AND ((var5 OR var6) AND var7))

解析到这一点的C程序和增值经销商进行处理并正确设置它最终会看起来像这样经过:

after parsing this into the c program and the vars are handled and set correctly it will end up looking something like this:

((( 1 AND 0 AND 0) OR 1) AND ((0 OR 1) AND 1))

是否有任何有用的库外面,用于评估前pressions被重新psented因为像这样的字符串$ P $?我想我可以只调用一个Perl程序的字符串作为参数,将能够轻松地返回结果,但不知道是否有在C库,这样做,或是否有解决任何已知的算法如前pressions?

Are there any useful libraries out there for evaluating expressions that are represented as one string like this? I was thinking I could just call a perl program with the string as an argument that would be able to return the result easily but wasn't sure if there was a library in C that did this, or if there are any known algorithms for solving such expressions?

编辑:什么我其实在寻找的东西,会吐出一个答案前pression,也许是地分析一个坏词。即1或0

What i'm actually looking for is something that would spit out an answer to this expression, maybe parse was a bad word. i.e. 1 or 0

在一个螺母壳其包含一串需要进行评估,以0或1(随机前pressions(已经知道是在正确的格式)的一个文件以上的计算结果为1,因为它导致(1和1)。

In a nut shell its a file containing a bunch of random expressions (already known to be in the right format) that need to be evaluated to either 0 or 1. (above evaluates to 1 because it results in (1 AND 1).

推荐答案

我试着写最紧凑的C code代表这个布尔前pression评价问题。这是我最后的code:

I tried to write the most compact C code for this bool expression evaluation problem. Here is my final code:

编辑:删除

下面是添加否定处理:

编辑:测试$ C $下加入

test code added

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

测试:

#include <stdio.h> 

void 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 );
}

这篇关于C防爆Ex pression计算器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆