1264790Sbapt%{
2264790Sbapt#include <stdlib.h>
3264790Sbapt
4264790Sbapttypedef enum {cGLOBAL, cLOCAL} class;
5264790Sbapttypedef enum {tREAL, tINTEGER} type;
6264790Sbapttypedef char * name;
7264790Sbapt
8264790Sbaptstruct symbol { class c; type t; name id; };
9264790Sbapttypedef struct symbol symbol;
10264790Sbapt
11264790Sbaptstruct namelist { symbol *s; struct namelist *next; };
12264790Sbapttypedef struct namelist namelist;
13264790Sbapt
14264790Sbaptextern symbol *mksymbol(type t, class c, name id);
15264790Sbapt
16264790Sbapt#ifdef YYBISON
17264790Sbapt#define YYLEX_DECL() yylex(void)
18264790Sbapt#define YYERROR_DECL() yyerror(const char *s)
19264790Sbapt#endif
20264790Sbapt%}
21264790Sbapt
22264790Sbapt%token <cval> GLOBAL LOCAL
23264790Sbapt%token <tval> REAL INTEGER
24264790Sbapt%token <id>   NAME
25264790Sbapt
26264790Sbapt%type <nlist> declaration namelist(<cval>, <tval>) locnamelist(<tval>)
27264790Sbapt%type <cval>  class
28264790Sbapt%type <tval>  type
29264790Sbapt
30264790Sbapt%destructor	{
31264790Sbapt		  namelist *p = $$;
32264790Sbapt		  while (p != NULL)
33264790Sbapt		  { namelist *pp = p;
34264790Sbapt		    p = p->next;
35264790Sbapt		    free(pp->s); free(pp);
36264790Sbapt		  }
37264790Sbapt		} <nlist>
38264790Sbapt
39264790Sbapt%union
40264790Sbapt{
41264790Sbapt    class	cval;
42264790Sbapt    type	tval;
43264790Sbapt    namelist *	nlist;
44264790Sbapt    name	id;
45264790Sbapt}
46264790Sbapt
47264790Sbapt%start declaration
48264790Sbapt
49264790Sbapt%%
50264790Sbaptdeclaration: class type namelist($1, $2)
51264790Sbapt	{ $$ = $3; }
52264790Sbapt	| type locnamelist($1)
53264790Sbapt	{ $$ = $2; }
54264790Sbapt	;
55264790Sbapt
56264790Sbaptclass	: GLOBAL { $$ = cGLOBAL; }
57264790Sbapt	| LOCAL  { $$ = cLOCAL; }
58264790Sbapt	;
59264790Sbapt
60264790Sbapttype	: REAL    { $$ = tREAL; }
61264790Sbapt	| INTEGER { $$ = tINTEGER; }
62264790Sbapt	;
63264790Sbapt
64264790Sbaptnamelist($c, $t): namelist NAME
65264790Sbapt	    { $$->s = mksymbol($<tval>t, $<cval>c, $2);
66264790Sbapt	      $$->next = $1;
67264790Sbapt	    }
68264790Sbapt	| NAME
69264790Sbapt	    { $$->s = mksymbol($t, $c, $1);
70264790Sbapt	      $$->next = NULL;
71264790Sbapt	    }
72264790Sbapt	;
73264790Sbapt
74264790Sbaptlocnamelist($t): namelist(cLOCAL, $t)
75264790Sbapt	{ $$ = $1; }
76264790Sbapt	;
77264790Sbapt%%
78264790Sbapt
79264790Sbaptextern int YYLEX_DECL();
80264790Sbaptextern void YYERROR_DECL();
81