1272651Sbapt%parse-param {
2272651Sbapt	struct parser_param *param,
3272651Sbapt	int flag
4272651Sbapt	}
5272651Sbapt
6272651Sbapt%{
7272651Sbapt#include <stdlib.h>
8272651Sbapt
9272651Sbapttypedef enum {cGLOBAL, cLOCAL} class;
10272651Sbapttypedef enum {tREAL, tINTEGER} type;
11272651Sbapttypedef char * name;
12272651Sbapt
13272651Sbaptstruct symbol { class c; type t; name id; };
14272651Sbapttypedef struct symbol symbol;
15272651Sbapt
16272651Sbaptstruct namelist { symbol *s; struct namelist *next; };
17272651Sbapttypedef struct namelist namelist;
18272651Sbapt
19272651Sbaptstruct parser_param {
20272651Sbapt	int *rtrn;
21272651Sbapt	symbol ss;
22272651Sbapt};
23272651Sbapt
24272651Sbaptextern symbol *mksymbol(type t, class c, name id);
25272651Sbapt
26272651Sbapt#ifdef YYBISON
27272651Sbapt#define YYLEX_DECL() yylex(void)
28272651Sbapt#define YYERROR_DECL() yyerror(const char *s)
29272651Sbapt#endif
30272651Sbapt%}
31272651Sbapt
32272651Sbapt%token <cval> GLOBAL LOCAL
33272651Sbapt%token <tval> REAL INTEGER
34272651Sbapt%token <id>   NAME
35272651Sbapt
36272651Sbapt%type <nlist> declaration
37272651Sbapt%type <nlist> locnamelist
38272651Sbapt%type <cval>  class
39272651Sbapt%type <tval>  type
40272651Sbapt%type <nlist>  namelist
41272651Sbapt
42272651Sbapt%destructor { if (!param->rtrn) close($$); } <file>
43272651Sbapt
44272651Sbapt%destructor	{
45272651Sbapt		  namelist *p = $$;
46272651Sbapt		  while (p != NULL)
47272651Sbapt		  { namelist *pp = p;
48272651Sbapt		    p = p->next;
49272651Sbapt		    free(pp->s); free(pp);
50272651Sbapt		  }
51272651Sbapt		} declaration
52272651Sbapt
53272651Sbapt%union
54272651Sbapt{
55272651Sbapt    class	cval;
56272651Sbapt    type	tval;
57272651Sbapt    namelist *	nlist;
58272651Sbapt    name	id;
59272651Sbapt}
60272651Sbapt
61272651Sbapt%start declaration
62272651Sbapt
63272651Sbapt%%
64272651Sbaptdeclaration: class type namelist'(' class ',' type ')'
65272651Sbapt	{ $$ = $3; }
66272651Sbapt	| type locnamelist '(' class ')'
67272651Sbapt	{ $$ = $2; }
68272651Sbapt	;
69272651Sbapt
70272651Sbaptclass	: GLOBAL { $$ = cGLOBAL; }
71272651Sbapt	| LOCAL  { $$ = cLOCAL; }
72272651Sbapt	;
73272651Sbapt
74272651Sbapttype	: REAL    { $$ = tREAL; }
75272651Sbapt	| INTEGER { $$ = tINTEGER; }
76272651Sbapt	;
77272651Sbapt
78272651Sbaptnamelist: namelist NAME
79272651Sbapt	    { $$->s = mksymbol($<tval>0, $<cval>0, $2);
80272651Sbapt	      $$->next = $1;
81272651Sbapt	    }
82272651Sbapt	| NAME
83272651Sbapt	    { $$->s = mksymbol(0, 0, $1);
84272651Sbapt	      $$->next = NULL;
85272651Sbapt	    }
86272651Sbapt	;
87272651Sbapt
88272651Sbaptlocnamelist: namelist '(' LOCAL ',' type ')'
89272651Sbapt	{ $$ = $1; }
90272651Sbapt	;
91272651Sbapt%%
92272651Sbapt
93272651Sbaptextern int YYLEX_DECL();
94272651Sbaptextern void YYERROR_DECL();
95