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