/* This program matches the following A -> B { '|' B } B -> C { '&' C } C -> D { '^' D } D -> [ '!' ] E E -> '(' A ')' | NUMBER where NUMBER is a int in C */ #include #include extern int lookahead; int A () { int B(); int value; value = B(); for (;;){ switch (lookahead) { case '|' : Match('|'); value = value | B(); continue; default: return (value); } } } int B () { int value; int C(); value = C(); for (;;){ switch (lookahead) { case '&' : Match('&'); value = value & C(); continue; default: return (value); } } } int C () { int value; int D(); value = D(); for (;;){ switch (lookahead) { case '^' : Match('^'); value = value ^ D(); continue; default: return (value); } } } int D () { int value; int E(); if (lookahead == '!') { Match('!'); value = E(); value = ~ value; return (value); } else return (E()); } int E () { int value; int A(); int get_number(); if ((lookahead >= '0') && (lookahead <= '9')) value= get_number(); else { Match('('); value = A(); Match( ')'); } return value; } int get_number(){ int value; ungetc(lookahead, stdin); scanf("%d", &value); lookahead = get_next_char(); return (value); }