%{ #include #include int vars[26]; extern int yylex(); #define YYERROR_VERBOSE void yyerror(const char *msg) { printf("ERROR(PARSER): %s\n", msg); } %} %union { int lvalue; char *svalue; int varindex; } %token T %token F %token NAME %token STRING %token OR AND XOR IMPLIES NOT IF THEN ELSE QUIT %type assign %type iterm %type oterm %type aterm %type var %% statementlist : statement statementlist | statement ; statement : assign '\n' { printf("ANS: %s\n", $1 ? "T" : "F"); } | STRING '\n' { printf("*%s*\n", $1 ); } | QUIT '\n' { exit(0); } ; assign : NAME '=' assign { vars[$1] = $3; $$ = $3; } | iterm { $$ = $1; } ; iterm : iterm IMPLIES oterm { $$ = (1-$1) | $3; } | oterm { $$ = $1; } ; oterm: oterm OR aterm { $$ = $1 | $3; } | oterm XOR aterm { $$ = $1 ^ $3; } | aterm { $$ = $1; } ; aterm : aterm AND var { $$ = $1 & $3; } | var { $$ = $1; } ; var : T { $$ = $1; } | F { $$ = $1; } | NAME { $$ = vars[$1]; } | '(' assign ')' { $$ = $2; } | '(' IF assign THEN assign ELSE assign ')' { $$ = ($3 ? $5 : $7); } | '(' IF assign THEN assign ')' { $$ = ($3 ? $5 : 0); } | NOT var { $$ = (1-$2); } ; %% main() { int i; for (i=0; i<26; i++) vars[i] = 0; yyparse(); }