1*11fce282SBaptiste Daroussin %parse-param { 2*11fce282SBaptiste Daroussin struct parser_param *param, 3*11fce282SBaptiste Daroussin int flag 4*11fce282SBaptiste Daroussin } 5*11fce282SBaptiste Daroussin 6*11fce282SBaptiste Daroussin %{ 7*11fce282SBaptiste Daroussin #include <stdlib.h> 8*11fce282SBaptiste Daroussin 9*11fce282SBaptiste Daroussin typedef enum {cGLOBAL, cLOCAL} class; 10*11fce282SBaptiste Daroussin typedef enum {tREAL, tINTEGER} type; 11*11fce282SBaptiste Daroussin typedef char * name; 12*11fce282SBaptiste Daroussin 13*11fce282SBaptiste Daroussin struct symbol { class c; type t; name id; }; 14*11fce282SBaptiste Daroussin typedef struct symbol symbol; 15*11fce282SBaptiste Daroussin 16*11fce282SBaptiste Daroussin struct namelist { symbol *s; struct namelist *next; }; 17*11fce282SBaptiste Daroussin typedef struct namelist namelist; 18*11fce282SBaptiste Daroussin 19*11fce282SBaptiste Daroussin struct parser_param { 20*11fce282SBaptiste Daroussin int *rtrn; 21*11fce282SBaptiste Daroussin symbol ss; 22*11fce282SBaptiste Daroussin }; 23*11fce282SBaptiste Daroussin 24*11fce282SBaptiste Daroussin extern symbol *mksymbol(type t, class c, name id); 25*11fce282SBaptiste Daroussin 26*11fce282SBaptiste Daroussin #ifdef YYBISON 27*11fce282SBaptiste Daroussin #define YYLEX_DECL() yylex(void) 28*11fce282SBaptiste Daroussin #define YYERROR_DECL() yyerror(const char *s) 29*11fce282SBaptiste Daroussin #endif 30*11fce282SBaptiste Daroussin %} 31*11fce282SBaptiste Daroussin 32*11fce282SBaptiste Daroussin %token <cval> GLOBAL LOCAL 33*11fce282SBaptiste Daroussin %token <tval> REAL INTEGER 34*11fce282SBaptiste Daroussin %token <id> NAME 35*11fce282SBaptiste Daroussin 36*11fce282SBaptiste Daroussin %type <nlist> declaration 37*11fce282SBaptiste Daroussin %type <nlist> locnamelist 38*11fce282SBaptiste Daroussin %type <cval> class 39*11fce282SBaptiste Daroussin %type <tval> type 40*11fce282SBaptiste Daroussin %type <nlist> namelist 41*11fce282SBaptiste Daroussin 42*11fce282SBaptiste Daroussin %destructor { if (!param->rtrn) close($$); } <file> 43*11fce282SBaptiste Daroussin 44*11fce282SBaptiste Daroussin %destructor { 45*11fce282SBaptiste Daroussin namelist *p = $$; 46*11fce282SBaptiste Daroussin while (p != NULL) 47*11fce282SBaptiste Daroussin { namelist *pp = p; 48*11fce282SBaptiste Daroussin p = p->next; 49*11fce282SBaptiste Daroussin free(pp->s); free(pp); 50*11fce282SBaptiste Daroussin } 51*11fce282SBaptiste Daroussin } declaration 52*11fce282SBaptiste Daroussin 53*11fce282SBaptiste Daroussin %union 54*11fce282SBaptiste Daroussin { 55*11fce282SBaptiste Daroussin class cval; 56*11fce282SBaptiste Daroussin type tval; 57*11fce282SBaptiste Daroussin namelist * nlist; 58*11fce282SBaptiste Daroussin name id; 59*11fce282SBaptiste Daroussin } 60*11fce282SBaptiste Daroussin 61*11fce282SBaptiste Daroussin %start declaration 62*11fce282SBaptiste Daroussin 63*11fce282SBaptiste Daroussin %% 64*11fce282SBaptiste Daroussin declaration: class type namelist'(' class ',' type ')' 65*11fce282SBaptiste Daroussin { $$ = $3; } 66*11fce282SBaptiste Daroussin | type locnamelist '(' class ')' 67*11fce282SBaptiste Daroussin { $$ = $2; } 68*11fce282SBaptiste Daroussin ; 69*11fce282SBaptiste Daroussin 70*11fce282SBaptiste Daroussin class : GLOBAL { $$ = cGLOBAL; } 71*11fce282SBaptiste Daroussin | LOCAL { $$ = cLOCAL; } 72*11fce282SBaptiste Daroussin ; 73*11fce282SBaptiste Daroussin 74*11fce282SBaptiste Daroussin type : REAL { $$ = tREAL; } 75*11fce282SBaptiste Daroussin | INTEGER { $$ = tINTEGER; } 76*11fce282SBaptiste Daroussin ; 77*11fce282SBaptiste Daroussin 78*11fce282SBaptiste Daroussin namelist: namelist NAME 79*11fce282SBaptiste Daroussin { $$->s = mksymbol($<tval>0, $<cval>0, $2); 80*11fce282SBaptiste Daroussin $$->next = $1; 81*11fce282SBaptiste Daroussin } 82*11fce282SBaptiste Daroussin | NAME 83*11fce282SBaptiste Daroussin { $$->s = mksymbol(0, 0, $1); 84*11fce282SBaptiste Daroussin $$->next = NULL; 85*11fce282SBaptiste Daroussin } 86*11fce282SBaptiste Daroussin ; 87*11fce282SBaptiste Daroussin 88*11fce282SBaptiste Daroussin locnamelist: namelist '(' LOCAL ',' type ')' 89*11fce282SBaptiste Daroussin { $$ = $1; } 90*11fce282SBaptiste Daroussin ; 91*11fce282SBaptiste Daroussin %% 92*11fce282SBaptiste Daroussin 93*11fce282SBaptiste Daroussin extern int YYLEX_DECL(); 94*11fce282SBaptiste Daroussin extern void YYERROR_DECL(); 95