parse.y (1340B)
1 %{ 2 enum triggerType { 3 AND, 4 OR, 5 XOR, 6 NOT, 7 NESTED, 8 FN, 9 } 10 11 typedef struct prev { 12 int start, end; 13 char *prev; 14 } prev; 15 16 typedef struct trigger { 17 int op; 18 union { 19 struct trigger triggers[2]; 20 char *name; 21 }; 22 } trigger; 23 24 typedef struct line { 25 char *name; 26 prev *prev; 27 trigger *trig; 28 char *code; 29 } line; 30 31 line * 32 new_line(char *n, prev *p, trigger *t, code *c) { 33 line *l = malloc(sizeof(line)); 34 l->name = n; 35 l->prev = p; 36 l->trig = t; 37 l->code = c; 38 return l; 39 } 40 41 trigger * 42 new_trigger(int op, trigger trigs[2], char *name) { 43 trigger *t = malloc(sizeof(line)); 44 t->op = op; 45 if (!name) 46 memcpy(t->triggers, trigs, sizeof(trigger) * 2); 47 else 48 t->name = name; 49 return t; 50 } 51 52 prev * 53 new_prev(int min, int max, char *name) { 54 prev *p = malloc(sizeof(prev)); 55 p->min = min; 56 p->max = max; 57 p->name = name; 58 return p; 59 } 60 61 %} 62 63 %union { 64 trigger *trig; 65 char *name; 66 char *code; 67 long num; 68 } 69 70 %token <name> NAME 71 %token <num> NUM 72 %token <code> CODE 73 %type <trig> trigger 74 75 76 %% 77 line : NAME ':' prev ':' trigger ':' action {} 78 ; 79 80 prev : NAME {} 81 | NUM NAME {} 82 | NAME NUM {} 83 | NUM NAME NUM {} 84 ; 85 86 trigger : NAME {} 87 | '!' trigger {} 88 | '(' trigger ')' {} 89 | trigger '&' trigger {} 90 | trigger '|' trigger {} 91 | trigger '^' trigger {} 92 ; 93 94 action : '{' CODE '}' {} 95 ; 96 %% 97 98 int 99 main() { 100 yyparse(); 101 }