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