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 extern int YYLEX_DECL(); 20*0c8de5b0SBaptiste Daroussin extern void YYERROR_DECL(); 21*0c8de5b0SBaptiste Daroussin #endif 22*0c8de5b0SBaptiste Daroussin %} 23*0c8de5b0SBaptiste Daroussin 24*0c8de5b0SBaptiste Daroussin %token <cval> GLOBAL LOCAL 25*0c8de5b0SBaptiste Daroussin %token <tval> REAL INTEGER 26*0c8de5b0SBaptiste Daroussin %token <id> NAME 27*0c8de5b0SBaptiste Daroussin 28*0c8de5b0SBaptiste Daroussin %type <nlist> declaration namelist locnamelist 29*0c8de5b0SBaptiste Daroussin %type <cval> class 30*0c8de5b0SBaptiste Daroussin %type <tval> type 31*0c8de5b0SBaptiste Daroussin 32*0c8de5b0SBaptiste Daroussin %union 33*0c8de5b0SBaptiste Daroussin { 34*0c8de5b0SBaptiste Daroussin class cval; 35*0c8de5b0SBaptiste Daroussin type tval; 36*0c8de5b0SBaptiste Daroussin namelist * nlist; 37*0c8de5b0SBaptiste Daroussin name id; 38*0c8de5b0SBaptiste Daroussin } 39*0c8de5b0SBaptiste Daroussin 40*0c8de5b0SBaptiste Daroussin %start declaration 41*0c8de5b0SBaptiste Daroussin 42*0c8de5b0SBaptiste Daroussin %% 43*0c8de5b0SBaptiste Daroussin declaration: class type namelist 44*0c8de5b0SBaptiste Daroussin { $$ = $3; } 45*0c8de5b0SBaptiste Daroussin | type locnamelist 46*0c8de5b0SBaptiste Daroussin { $$ = $2; } 47*0c8de5b0SBaptiste Daroussin ; 48*0c8de5b0SBaptiste Daroussin 49*0c8de5b0SBaptiste Daroussin class : GLOBAL { $$ = cGLOBAL; } 50*0c8de5b0SBaptiste Daroussin | LOCAL { $$ = cLOCAL; } 51*0c8de5b0SBaptiste Daroussin ; 52*0c8de5b0SBaptiste Daroussin 53*0c8de5b0SBaptiste Daroussin type : REAL { $$ = tREAL; } 54*0c8de5b0SBaptiste Daroussin | INTEGER { $$ = tINTEGER; } 55*0c8de5b0SBaptiste Daroussin ; 56*0c8de5b0SBaptiste Daroussin 57*0c8de5b0SBaptiste Daroussin namelist: namelist NAME 58*0c8de5b0SBaptiste Daroussin { $$->s = mksymbol($<tval>0, $<cval>-1, $2); 59*0c8de5b0SBaptiste Daroussin $$->next = $1; 60*0c8de5b0SBaptiste Daroussin } 61*0c8de5b0SBaptiste Daroussin | NAME 62*0c8de5b0SBaptiste Daroussin { $$->s = mksymbol($<tval>0, $<cval>-1, $1); 63*0c8de5b0SBaptiste Daroussin $$->next = NULL; 64*0c8de5b0SBaptiste Daroussin } 65*0c8de5b0SBaptiste Daroussin ; 66*0c8de5b0SBaptiste Daroussin 67*0c8de5b0SBaptiste Daroussin locnamelist: 68*0c8de5b0SBaptiste Daroussin { $<cval>$ = cLOCAL; } /* set up semantic stack for <class> = LOCAL */ 69*0c8de5b0SBaptiste Daroussin { $<tval>$ = $<tval>-1; } /* copy <type> to where <namelist> expects it */ 70*0c8de5b0SBaptiste Daroussin namelist 71*0c8de5b0SBaptiste Daroussin { $$ = $3; } 72*0c8de5b0SBaptiste Daroussin ; 73*0c8de5b0SBaptiste Daroussin %% 74*0c8de5b0SBaptiste Daroussin 75*0c8de5b0SBaptiste Daroussin extern int YYLEX_DECL(); 76*0c8de5b0SBaptiste Daroussin extern void YYERROR_DECL(); 77