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