/* proposition interpreter */
#define GNC()   ch=*++txt
#define NO()    printf("error\n"), exit(1)

static char *txt;
static char ch;

static int stack[20];
static int sp;

static void 
Reduce(int n) {
  switch (n) {
  case 1: sp--; stack[sp-1] |= stack[sp]; break;
  case 3: sp--; stack[sp-1] &= stack[sp]; break;
  case 5: stack[sp-1] = !stack[sp-1]; break;
  case 7: stack[sp] = 1; sp++; break;
  case 8: stack[sp] = 0; sp++; break;
  }
}

static void P(void);       /* C forward declarations */
static void D(void);
static void C(void);
static void N(void);
static voidB(void);

static void 
D(void) {
  C();
  Reduce(2);
  while (ch=='|') {
    GNC();                    /* discard | */
    C();
    Reduce(1);
  }
}

static void 
C(void) {
  N();
  Reduce(4);
  while (ch=='&') {
    GNC();                    /* discard & */
    N();
    Reduce(3);
  }
}

static void 
N(void) {
  if (ch == '~') {
    GNC();                    /* discard ~ */
   B();
    Reduce(5);
  } else {
   B();
    Reduce(6);
  }
}

static void 
Bool(void) {
  switch (ch) {
  case 't':
    GNC();                    /* discard t */
    Reduce(7);
    break;
  case 'f':
    GNC();                    /* discard f */
    Reduce(8);
    break;
  case '(':
    GNC();                    /* discard ( */
    D();
    if (ch != ')') NO();
    GNC();                    /* discard ) */
    Reduce(9);
    break;
  default:
    NO();
    break;
  }
}

static void 
P(void) {
  D();
  if (ch != 0) NO();
  Reduce(0);
}

int 
main(int argc, char **argv) {
  txt = argv[1];
  ch  = *txt;                 /* first char */
  sp = 0;                     /* next avail */
  P();
  printf("%c\n", stack[0] ? 't' : 'f');
  return 0;
}


Created: March 29, 2001
Last modified: May 29, 2007