1264790Sbapt%{ 2264790Sbapt#include <stdlib.h> 3264790Sbapt 4264790Sbapttypedef enum {cGLOBAL, cLOCAL} class; 5264790Sbapttypedef enum {tREAL, tINTEGER} type; 6264790Sbapttypedef char * name; 7264790Sbapt 8264790Sbaptstruct symbol { class c; type t; name id; }; 9264790Sbapttypedef struct symbol symbol; 10264790Sbapt 11264790Sbaptstruct namelist { symbol *s; struct namelist *next; }; 12264790Sbapttypedef struct namelist namelist; 13264790Sbapt 14264790Sbaptextern symbol *mksymbol(type t, class c, name id); 15264790Sbapt 16264790Sbapt#ifdef YYBISON 17264790Sbapt#define YYLEX_DECL() yylex(void) 18264790Sbapt#define YYERROR_DECL() yyerror(const char *s) 19264790Sbapt#endif 20264790Sbapt%} 21264790Sbapt 22264790Sbapt%token <cval> GLOBAL LOCAL 23264790Sbapt%token <tval> REAL INTEGER 24264790Sbapt%token <id> NAME 25264790Sbapt 26264790Sbapt%type <nlist> declaration namelist(<cval>, <tval>) locnamelist(<tval>) 27264790Sbapt%type <cval> class 28264790Sbapt%type <tval> type 29264790Sbapt 30264790Sbapt%destructor { 31264790Sbapt namelist *p = $$; 32264790Sbapt while (p != NULL) 33264790Sbapt { namelist *pp = p; 34264790Sbapt p = p->next; 35264790Sbapt free(pp->s); free(pp); 36264790Sbapt } 37264790Sbapt } <nlist> 38264790Sbapt 39264790Sbapt%union 40264790Sbapt{ 41264790Sbapt class cval; 42264790Sbapt type tval; 43264790Sbapt namelist * nlist; 44264790Sbapt name id; 45264790Sbapt} 46264790Sbapt 47264790Sbapt%start declaration 48264790Sbapt 49264790Sbapt%% 50264790Sbaptdeclaration: class type namelist($1, $2) 51264790Sbapt { $$ = $3; } 52264790Sbapt | type locnamelist($1) 53264790Sbapt { $$ = $2; } 54264790Sbapt ; 55264790Sbapt 56264790Sbaptclass : GLOBAL { $$ = cGLOBAL; } 57264790Sbapt | LOCAL { $$ = cLOCAL; } 58264790Sbapt ; 59264790Sbapt 60264790Sbapttype : REAL { $$ = tREAL; } 61264790Sbapt | INTEGER { $$ = tINTEGER; } 62264790Sbapt ; 63264790Sbapt 64264790Sbaptnamelist($c, $t): namelist NAME 65264790Sbapt { $$->s = mksymbol($<tval>t, $<cval>c, $2); 66264790Sbapt $$->next = $1; 67264790Sbapt } 68264790Sbapt | NAME 69264790Sbapt { $$->s = mksymbol($t, $c, $1); 70264790Sbapt $$->next = NULL; 71264790Sbapt } 72264790Sbapt ; 73264790Sbapt 74264790Sbaptlocnamelist($t): namelist(cLOCAL, $t) 75264790Sbapt { $$ = $1; } 76264790Sbapt ; 77264790Sbapt%% 78264790Sbapt 79264790Sbaptextern int YYLEX_DECL(); 80264790Sbaptextern void YYERROR_DECL(); 81