How to Write a Boolean Expression Evaluator in C? How to Write a Boolean Expression Evaluator in C? c c

How to Write a Boolean Expression Evaluator in C?


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

EDIT: deleted

Here is the added negation handling:

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

Testing:

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


You can embed lua in your program and then invoke it's interpreter to evaluate the expression.


It's easy enough to roll your own recursive descent parser for simple expressions like these.