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