1 /*        $NetBSD: err_inherit1.y,v 1.1.1.3 2016/01/09 21:59:45 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 
66 namelist($c, $t
67