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