/* Infix evaluator Sten Morten Andersen, 2003 formula ::= '0' | '1' | '-' formula | '(' formula ( 'v' | '&' | '>' | '=' ) formula ')' */ char ch; void error() { printf("error"); exit(1); } void get_char() { do ch = getchar(); while ( ch != '0' && ch != '1' && ch != '(' && ch != ')' && ch != 'v' && ch != '&' && ch != '>' && ch != '=' ); } void infix(int* v) { int l, r; char op; get_char(); switch( ch ) { case '0': case '1': *v = ch - '0'; break; case '-': infix( &l ); *v = !l; break; case '(': infix( &l ); get_char(); op = ch; infix( &r ); get_char(); if ( ch != ')' ) error(); switch ( op ) { case 'v': *v = l || r; break; case '&': *v = l && r; break; case '>': *v = l <= r; break; case '=': *v = l == r; break; default: error(); } break; } } int main() { int value; infix( &value ); printf("%c\n", value+'0'); return 0; }