1272651Sbapt%parse-param { 2272651Sbapt struct parser_param *param, 3272651Sbapt int flag 4272651Sbapt } 5272651Sbapt 6272651Sbapt%{ 7272651Sbapt#include <stdlib.h> 8272651Sbapt 9272651Sbapttypedef enum {cGLOBAL, cLOCAL} class; 10272651Sbapttypedef enum {tREAL, tINTEGER} type; 11272651Sbapttypedef char * name; 12272651Sbapt 13272651Sbaptstruct symbol { class c; type t; name id; }; 14272651Sbapttypedef struct symbol symbol; 15272651Sbapt 16272651Sbaptstruct namelist { symbol *s; struct namelist *next; }; 17272651Sbapttypedef struct namelist namelist; 18272651Sbapt 19272651Sbaptstruct parser_param { 20272651Sbapt int *rtrn; 21272651Sbapt symbol ss; 22272651Sbapt}; 23272651Sbapt 24272651Sbaptextern symbol *mksymbol(type t, class c, name id); 25272651Sbapt 26272651Sbapt#ifdef YYBISON 27272651Sbapt#define YYLEX_DECL() yylex(void) 28272651Sbapt#define YYERROR_DECL() yyerror(const char *s) 29272651Sbapt#endif 30272651Sbapt%} 31272651Sbapt 32272651Sbapt%token <cval> GLOBAL LOCAL 33272651Sbapt%token <tval> REAL INTEGER 34272651Sbapt%token <id> NAME 35272651Sbapt 36272651Sbapt%type <nlist> declaration 37272651Sbapt%type <nlist> locnamelist 38272651Sbapt%type <cval> class 39272651Sbapt%type <tval> type 40272651Sbapt%type <nlist> namelist 41272651Sbapt 42272651Sbapt%destructor { if (!param->rtrn) close($$); } <file> 43272651Sbapt 44272651Sbapt%destructor { 45272651Sbapt namelist *p = $$; 46272651Sbapt while (p != NULL) 47272651Sbapt { namelist *pp = p; 48272651Sbapt p = p->next; 49272651Sbapt free(pp->s); free(pp); 50272651Sbapt } 51272651Sbapt } declaration 52272651Sbapt 53272651Sbapt%union 54272651Sbapt{ 55272651Sbapt class cval; 56272651Sbapt type tval; 57272651Sbapt namelist * nlist; 58272651Sbapt name id; 59272651Sbapt} 60272651Sbapt 61272651Sbapt%start declaration 62272651Sbapt 63272651Sbapt%% 64272651Sbaptdeclaration: class type namelist'(' class ',' type ')' 65272651Sbapt { $$ = $3; } 66272651Sbapt | type locnamelist '(' class ')' 67272651Sbapt { $$ = $2; } 68272651Sbapt ; 69272651Sbapt 70272651Sbaptclass : GLOBAL { $$ = cGLOBAL; } 71272651Sbapt | LOCAL { $$ = cLOCAL; } 72272651Sbapt ; 73272651Sbapt 74272651Sbapttype : REAL { $$ = tREAL; } 75272651Sbapt | INTEGER { $$ = tINTEGER; } 76272651Sbapt ; 77272651Sbapt 78272651Sbaptnamelist: namelist NAME 79272651Sbapt { $$->s = mksymbol($<tval>0, $<cval>0, $2); 80272651Sbapt $$->next = $1; 81272651Sbapt } 82272651Sbapt | NAME 83272651Sbapt { $$->s = mksymbol(0, 0, $1); 84272651Sbapt $$->next = NULL; 85272651Sbapt } 86272651Sbapt ; 87272651Sbapt 88272651Sbaptlocnamelist: namelist '(' LOCAL ',' type ')' 89272651Sbapt { $$ = $1; } 90272651Sbapt ; 91272651Sbapt%% 92272651Sbapt 93272651Sbaptextern int YYLEX_DECL(); 94272651Sbaptextern void YYERROR_DECL(); 95