1*0c8de5b0SBaptiste Daroussin %{ 2*0c8de5b0SBaptiste Daroussin #include <stdlib.h> 3*0c8de5b0SBaptiste Daroussin 4*0c8de5b0SBaptiste Daroussin typedef enum {cGLOBAL, cLOCAL} class; 5*0c8de5b0SBaptiste Daroussin typedef enum {tREAL, tINTEGER} type; 6*0c8de5b0SBaptiste Daroussin typedef char * name; 7*0c8de5b0SBaptiste Daroussin 8*0c8de5b0SBaptiste Daroussin struct symbol { class c; type t; name id; }; 9*0c8de5b0SBaptiste Daroussin typedef struct symbol symbol; 10*0c8de5b0SBaptiste Daroussin 11*0c8de5b0SBaptiste Daroussin struct namelist { symbol *s; struct namelist *next; }; 12*0c8de5b0SBaptiste Daroussin typedef struct namelist namelist; 13*0c8de5b0SBaptiste Daroussin 14*0c8de5b0SBaptiste Daroussin extern symbol *mksymbol(type t, class c, name id); 15*0c8de5b0SBaptiste Daroussin 16*0c8de5b0SBaptiste Daroussin #ifdef YYBISON 17*0c8de5b0SBaptiste Daroussin #define YYLEX_DECL() yylex(void) 18*0c8de5b0SBaptiste Daroussin #define YYERROR_DECL() yyerror(const char *s) 19*0c8de5b0SBaptiste Daroussin #endif 20*0c8de5b0SBaptiste Daroussin %} 21*0c8de5b0SBaptiste Daroussin 22*0c8de5b0SBaptiste Daroussin %token <cval> GLOBAL LOCAL 23*0c8de5b0SBaptiste Daroussin %token <tval> REAL INTEGER 24*0c8de5b0SBaptiste Daroussin %token <id> NAME 25*0c8de5b0SBaptiste Daroussin 26*0c8de5b0SBaptiste Daroussin %type <nlist> declaration namelist(<cval>, <tval>) locnamelist(<tval>) 27*0c8de5b0SBaptiste Daroussin %type <cval> class 28*0c8de5b0SBaptiste Daroussin %type <tval> type 29*0c8de5b0SBaptiste Daroussin 30*0c8de5b0SBaptiste Daroussin %destructor { 31*0c8de5b0SBaptiste Daroussin namelist *p = $$; 32*0c8de5b0SBaptiste Daroussin while (p != NULL) 33*0c8de5b0SBaptiste Daroussin { namelist *pp = p; 34*0c8de5b0SBaptiste Daroussin p = p->next; 35*0c8de5b0SBaptiste Daroussin free(pp->s); free(pp); 36*0c8de5b0SBaptiste Daroussin } 37*0c8de5b0SBaptiste Daroussin } <nlist> 38*0c8de5b0SBaptiste Daroussin 39*0c8de5b0SBaptiste Daroussin %union 40*0c8de5b0SBaptiste Daroussin { 41*0c8de5b0SBaptiste Daroussin class cval; 42*0c8de5b0SBaptiste Daroussin type tval; 43*0c8de5b0SBaptiste Daroussin namelist * nlist; 44*0c8de5b0SBaptiste Daroussin name id; 45*0c8de5b0SBaptiste Daroussin } 46*0c8de5b0SBaptiste Daroussin 47*0c8de5b0SBaptiste Daroussin %start declaration 48*0c8de5b0SBaptiste Daroussin 49*0c8de5b0SBaptiste Daroussin %% 50*0c8de5b0SBaptiste Daroussin declaration: class type namelist($1, $2) 51*0c8de5b0SBaptiste Daroussin { $$ = $3; } 52*0c8de5b0SBaptiste Daroussin | type locnamelist($1) 53*0c8de5b0SBaptiste Daroussin { $$ = $2; } 54*0c8de5b0SBaptiste Daroussin ; 55*0c8de5b0SBaptiste Daroussin 56*0c8de5b0SBaptiste Daroussin class : GLOBAL { $$ = cGLOBAL; } 57*0c8de5b0SBaptiste Daroussin | LOCAL { $$ = cLOCAL; } 58*0c8de5b0SBaptiste Daroussin ; 59*0c8de5b0SBaptiste Daroussin 60*0c8de5b0SBaptiste Daroussin type : REAL { $$ = tREAL; } 61*0c8de5b0SBaptiste Daroussin | INTEGER { $$ = tINTEGER; } 62*0c8de5b0SBaptiste Daroussin ; 63*0c8de5b0SBaptiste Daroussin 64*0c8de5b0SBaptiste Daroussin namelist($c, $t 65