uni

Thing1's amazing uni repo
Log | Files | Refs

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 }