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) 19264790Sbaptextern int YYLEX_DECL(); 20264790Sbaptextern void YYERROR_DECL(); 21264790Sbapt#endif 22264790Sbapt%} 23264790Sbapt 24264790Sbapt%token <cval> GLOBAL LOCAL 25264790Sbapt%token <tval> REAL INTEGER 26264790Sbapt%token <id> NAME 27264790Sbapt 28264790Sbapt%type <nlist> declaration namelist locnamelist 29264790Sbapt%type <cval> class 30264790Sbapt%type <tval> type 31264790Sbapt 32264790Sbapt%union 33264790Sbapt{ 34264790Sbapt class cval; 35264790Sbapt type tval; 36264790Sbapt namelist * nlist; 37264790Sbapt name id; 38264790Sbapt} 39264790Sbapt 40264790Sbapt%start declaration 41264790Sbapt 42264790Sbapt%% 43264790Sbaptdeclaration: class type namelist 44264790Sbapt { $$ = $3; } 45264790Sbapt | type locnamelist 46264790Sbapt { $$ = $2; } 47264790Sbapt ; 48264790Sbapt 49264790Sbaptclass : GLOBAL { $$ = cGLOBAL; } 50264790Sbapt | LOCAL { $$ = cLOCAL; } 51264790Sbapt ; 52264790Sbapt 53264790Sbapttype : REAL { $$ = tREAL; } 54264790Sbapt | INTEGER { $$ = tINTEGER; } 55264790Sbapt ; 56264790Sbapt 57264790Sbaptnamelist: namelist NAME 58264790Sbapt { $$->s = mksymbol($<tval>0, $<cval>-1, $2); 59264790Sbapt $$->next = $1; 60264790Sbapt } 61264790Sbapt | NAME 62264790Sbapt { $$->s = mksymbol($<tval>0, $<cval>-1, $1); 63264790Sbapt $$->next = NULL; 64264790Sbapt } 65264790Sbapt ; 66264790Sbapt 67264790Sbaptlocnamelist: 68264790Sbapt { $<cval>$ = cLOCAL; } /* set up semantic stack for <class> = LOCAL */ 69264790Sbapt { $<tval>$ = $<tval>-1; } /* copy <type> to where <namelist> expects it */ 70264790Sbapt namelist 71264790Sbapt { $$ = $3; } 72264790Sbapt ; 73264790Sbapt%% 74264790Sbapt 75264790Sbaptextern int YYLEX_DECL(); 76264790Sbaptextern void YYERROR_DECL(); 77