1 1.1.1.3 christos /* $NetBSD: err_inherit3.y,v 1.1.1.3 2016/01/09 21:59:45 christos Exp $ */ 2 1.1.1.3 christos 3 1.1 christos %{ 4 1.1 christos #include <stdlib.h> 5 1.1 christos 6 1.1 christos typedef enum {cGLOBAL, cLOCAL} class; 7 1.1 christos typedef enum {tREAL, tINTEGER} type; 8 1.1 christos typedef char * name; 9 1.1 christos 10 1.1 christos struct symbol { class c; type t; name id; }; 11 1.1 christos typedef struct symbol symbol; 12 1.1 christos 13 1.1 christos struct namelist { symbol *s; struct namelist *next; }; 14 1.1 christos typedef struct namelist namelist; 15 1.1 christos 16 1.1 christos extern symbol *mksymbol(type t, class c, name id); 17 1.1 christos 18 1.1 christos #ifdef YYBISON 19 1.1 christos #define YYLEX_DECL() yylex(void) 20 1.1 christos #define YYERROR_DECL() yyerror(const char *s) 21 1.1 christos #endif 22 1.1 christos %} 23 1.1 christos 24 1.1 christos %token <cval> GLOBAL LOCAL 25 1.1 christos %token <tval> REAL INTEGER 26 1.1 christos %token <id> NAME 27 1.1 christos 28 1.1 christos %type <nlist> declaration(<id>) namelist(<cval>, <tval>) locnamelist(<tval>) 29 1.1 christos %type <cval> class 30 1.1 christos %type <tval> type 31 1.1 christos 32 1.1 christos %destructor { 33 1.1 christos namelist *p = $$; 34 1.1 christos while (p != NULL) 35 1.1 christos { namelist *pp = p; 36 1.1 christos p = p->next; 37 1.1 christos free(pp->s); free(pp); 38 1.1 christos } 39 1.1 christos } <nlist> 40 1.1 christos 41 1.1 christos %union 42 1.1 christos { 43 1.1 christos class cval; 44 1.1 christos type tval; 45 1.1 christos namelist * nlist; 46 1.1 christos name id; 47 1.1 christos } 48 1.1 christos 49 1.1 christos %start declaration 50 1.1 christos 51 1.1 christos %% 52 1.1 christos declaration($d): class type namelist($1, $2) 53 1.1 christos { $$ = $3; } 54 1.1 christos | type locnamelist($1) 55 1.1 christos { $$ = $2; } 56 1.1 christos ; 57 1.1 christos 58 1.1 christos class : GLOBAL { $$ = cGLOBAL; } 59 1.1 christos | LOCAL { $$ = cLOCAL; } 60 1.1 christos ; 61 1.1 christos 62 1.1 christos type : REAL { $$ = tREAL; } 63 1.1 christos | INTEGER { $$ = tINTEGER; } 64 1.1 christos ; 65 1.1 christos 66 1.1 christos namelist: namelist($c) NAME 67 1.1 christos { $$->s = mksymbol($<tval>t, $<cval>c, $2); 68 1.1 christos $$->next = $1; 69 1.1 christos } 70 1.1 christos | NAME 71 1.1 christos { $$->s = mksymbol($t, $c, $1); 72 1.1 christos $$->next = NULL; 73 1.1 christos } 74 1.1 christos ; 75 1.1 christos 76 1.1 christos locnamelist($t): namelist(cLOCAL, $t) 77 1.1 christos { $$ = $1; } 78 1.1 christos ; 79 1.1 christos %% 80 1.1 christos 81 1.1 christos extern int YYLEX_DECL(); 82 1.1 christos extern void YYERROR_DECL(); 83