inherit1.y revision 303975
1258283Speter%{ 2258283Speter#include <stdlib.h> 3258283Speter 4258283Spetertypedef enum {cGLOBAL, cLOCAL} class; 5258283Spetertypedef enum {tREAL, tINTEGER} type; 6258283Spetertypedef char * name; 7258283Speter 8258283Speterstruct symbol { class c; type t; name id; }; 9258283Spetertypedef struct symbol symbol; 10258283Speter 11258283Speterstruct namelist { symbol *s; struct namelist *next; }; 12258283Spetertypedef struct namelist namelist; 13258283Speter 14258283Speterextern symbol *mksymbol(type t, class c, name id); 15258283Speter 16258283Speter#ifdef YYBISON 17258283Speter#define YYLEX_DECL() yylex(void) 18258283Speter#define YYERROR_DECL() yyerror(const char *s) 19258283Speterextern int YYLEX_DECL(); 20258283Speterextern void YYERROR_DECL(); 21258283Speter#endif 22258283Speter%} 23258283Speter 24258283Speter%token <cval> GLOBAL LOCAL 25258283Speter%token <tval> REAL INTEGER 26258283Speter%token <id> NAME 27258283Speter 28258283Speter%type <nlist> declaration namelist locnamelist 29258283Speter%type <cval> class 30258283Speter%type <tval> type 31258283Speter 32258283Speter%union 33258283Speter{ 34258283Speter class cval; 35258283Speter type tval; 36258283Speter namelist * nlist; 37258283Speter name id; 38} 39 40%start declaration 41 42%% 43declaration: class type namelist 44 { $$ = $3; } 45 | type locnamelist 46 { $$ = $2; } 47 ; 48 49class : GLOBAL { $$ = cGLOBAL; } 50 | LOCAL { $$ = cLOCAL; } 51 ; 52 53type : REAL { $$ = tREAL; } 54 | INTEGER { $$ = tINTEGER; } 55 ; 56 57namelist: namelist NAME 58 { $$->s = mksymbol($<tval>0, $<cval>-1, $2); 59 $$->next = $1; 60 } 61 | NAME 62 { $$->s = mksymbol($<tval>0, $<cval>-1, $1); 63 $$->next = NULL; 64 } 65 ; 66 67locnamelist: 68 { $<cval>$ = cLOCAL; } /* set up semantic stack for <class> = LOCAL */ 69 { $<tval>$ = $<tval>-1; } /* copy <type> to where <namelist> expects it */ 70 namelist 71 { $$ = $3; } 72 ; 73%% 74 75extern int YYLEX_DECL(); 76extern void YYERROR_DECL(); 77