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)
19264790Sbaptextern int YYLEX_DECL();
20264790Sbaptextern void YYERROR_DECL();
21264790Sbapt#endif
22264790Sbapt%}
23264790Sbapt
24264790Sbapt%token <cval> GLOBAL LOCAL
25264790Sbapt%token <tval> REAL INTEGER
26264790Sbapt%token <id>   NAME
27264790Sbapt
28264790Sbapt%type <nlist> declaration namelist locnamelist
29264790Sbapt%type <cval>  class
30264790Sbapt%type <tval>  type
31264790Sbapt
32264790Sbapt%union
33264790Sbapt{
34264790Sbapt    class	cval;
35264790Sbapt    type	tval;
36264790Sbapt    namelist *	nlist;
37264790Sbapt    name	id;
38264790Sbapt}
39264790Sbapt
40264790Sbapt%start declaration
41264790Sbapt
42264790Sbapt%%
43264790Sbaptdeclaration: class type namelist
44264790Sbapt	{ $$ = $3; }
45264790Sbapt	| type locnamelist
46264790Sbapt	{ $$ = $2; }
47264790Sbapt	;
48264790Sbapt
49264790Sbaptclass	: GLOBAL { $$ = cGLOBAL; }
50264790Sbapt	| LOCAL  { $$ = cLOCAL; }
51264790Sbapt	;
52264790Sbapt
53264790Sbapttype	: REAL    { $$ = tREAL; }
54264790Sbapt	| INTEGER { $$ = tINTEGER; }
55264790Sbapt	;
56264790Sbapt
57264790Sbaptnamelist: namelist NAME
58264790Sbapt	    { $$->s = mksymbol($<tval>0, $<cval>-1, $2);
59264790Sbapt	      $$->next = $1;
60264790Sbapt	    }
61264790Sbapt	| NAME
62264790Sbapt	    { $$->s = mksymbol($<tval>0, $<cval>-1, $1);
63264790Sbapt	      $$->next = NULL;
64264790Sbapt	    }
65264790Sbapt	;
66264790Sbapt
67264790Sbaptlocnamelist:
68264790Sbapt	{ $<cval>$ = cLOCAL; }    /* set up semantic stack for <class> = LOCAL */
69264790Sbapt	{ $<tval>$ = $<tval>-1; } /* copy <type> to where <namelist> expects it */
70264790Sbapt	namelist
71264790Sbapt	{ $$ = $3; }
72264790Sbapt	;
73264790Sbapt%%
74264790Sbapt
75264790Sbaptextern int YYLEX_DECL();
76264790Sbaptextern void YYERROR_DECL();
77