1/*	$NetBSD: err_inherit4.y,v 1.2 2017/02/11 19:33:12 christos Exp $	*/
2
3%locations
4%{
5#include <stdlib.h>
6
7typedef enum {cGLOBAL, cLOCAL} class;
8typedef enum {tREAL, tINTEGER} type;
9typedef char * name;
10
11struct symbol { class c; type t; name id; };
12typedef struct symbol symbol;
13
14struct namelist { symbol *s; struct namelist *next; };
15typedef struct namelist namelist;
16
17extern 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%%
54declaration: class type namelist($1, $2)
55	{ $$ = $3; @$ = @3; }
56	| type locnamelist($1)
57	{ $$ = $2; @$ = @-1; }
58	;
59
60class	: GLOBAL { $$ = cGLOBAL; }
61	| LOCAL  { $$ = cLOCAL; }
62	;
63
64type	: REAL    { $$ = tREAL; }
65	| INTEGER { $$ = tINTEGER; }
66	;
67
68namelist($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
78locnamelist($t): namelist
79	{ $$ = $1; @$ = @2; }
80	;
81%%
82
83extern int YYLEX_DECL();
84extern void YYERROR_DECL();
85