bool.y (846B)
1 %{ 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include "expr.h" 5 6 extern int yylex(); 7 int yyerror(const char *); 8 btree *program; 9 char vars[26] = {0}; 10 11 btree * 12 mkbtree(char op, btree *left, btree *right) { 13 btree *bin = malloc(sizeof(btree)); 14 bin->op = op; 15 bin->left = left; 16 bin->right = right; 17 return bin; 18 } 19 20 %} 21 22 %union { 23 struct btree *tree; 24 char sym; 25 } 26 27 %token <sym> SYMBOL 28 29 %type <tree> expr 30 %type <tree> symbol 31 32 %left '+' 33 %left '.' 34 %left '!' 35 %left '(' ')' 36 37 %% 38 39 prog : expr {program = $1;} 40 41 expr : expr '.' expr {$$ = mkbtree('.', $1, $3);} 42 | expr '+' expr {$$ = mkbtree('+', $1, $3);} 43 | '!' expr {$$ = mkbtree('!', $2, NULL);} 44 | '(' expr ')' {$$ = $2;} 45 | symbol 46 ; 47 48 symbol : SYMBOL {$$ = mkbtree($1, NULL, NULL); vars[$1 - 65] = $1;} 49 ; 50 51 %% 52 53 int 54 yyerror(const char *s) { 55 fprintf(stderr, "error: %s\n", s); 56 return 1; 57 }