xref: /freebsd/contrib/byacc/test/btyacc_destroy3.y (revision 9268022b74279434ed6300244e3f977e56a8ceb5)
1*11fce282SBaptiste Daroussin %parse-param {
2*11fce282SBaptiste Daroussin 	struct parser_param *param,
3*11fce282SBaptiste Daroussin 	int flag
4*11fce282SBaptiste Daroussin 	}
5*11fce282SBaptiste Daroussin 
6*11fce282SBaptiste Daroussin %{
7*11fce282SBaptiste Daroussin #include <stdlib.h>
8*11fce282SBaptiste Daroussin 
9*11fce282SBaptiste Daroussin typedef enum {cGLOBAL, cLOCAL} class;
10*11fce282SBaptiste Daroussin typedef enum {tREAL, tINTEGER} type;
11*11fce282SBaptiste Daroussin typedef char * name;
12*11fce282SBaptiste Daroussin 
13*11fce282SBaptiste Daroussin struct symbol { class c; type t; name id; };
14*11fce282SBaptiste Daroussin typedef struct symbol symbol;
15*11fce282SBaptiste Daroussin 
16*11fce282SBaptiste Daroussin struct namelist { symbol *s; struct namelist *next; };
17*11fce282SBaptiste Daroussin typedef struct namelist namelist;
18*11fce282SBaptiste Daroussin 
19*11fce282SBaptiste Daroussin struct parser_param {
20*11fce282SBaptiste Daroussin 	int *rtrn;
21*11fce282SBaptiste Daroussin 	symbol ss;
22*11fce282SBaptiste Daroussin };
23*11fce282SBaptiste Daroussin 
24*11fce282SBaptiste Daroussin extern symbol *mksymbol(type t, class c, name id);
25*11fce282SBaptiste Daroussin 
26*11fce282SBaptiste Daroussin #ifdef YYBISON
27*11fce282SBaptiste Daroussin #define YYLEX_DECL() yylex(void)
28*11fce282SBaptiste Daroussin #define YYERROR_DECL() yyerror(const char *s)
29*11fce282SBaptiste Daroussin #endif
30*11fce282SBaptiste Daroussin %}
31*11fce282SBaptiste Daroussin 
32*11fce282SBaptiste Daroussin %token <cval> GLOBAL LOCAL
33*11fce282SBaptiste Daroussin %token <tval> REAL INTEGER
34*11fce282SBaptiste Daroussin %token <id>   NAME
35*11fce282SBaptiste Daroussin 
36*11fce282SBaptiste Daroussin %type <nlist> declaration
37*11fce282SBaptiste Daroussin %type <nlist> locnamelist
38*11fce282SBaptiste Daroussin %type <cval>  class
39*11fce282SBaptiste Daroussin %type <tval>  type
40*11fce282SBaptiste Daroussin %type <nlist>  namelist
41*11fce282SBaptiste Daroussin 
42*11fce282SBaptiste Daroussin %destructor { if (!param->rtrn) close($$); } <file>
43*11fce282SBaptiste Daroussin 
44*11fce282SBaptiste Daroussin %destructor	{
45*11fce282SBaptiste Daroussin 		  namelist *p = $$;
46*11fce282SBaptiste Daroussin 		  while (p != NULL)
47*11fce282SBaptiste Daroussin 		  { namelist *pp = p;
48*11fce282SBaptiste Daroussin 		    p = p->next;
49*11fce282SBaptiste Daroussin 		    free(pp->s); free(pp);
50*11fce282SBaptiste Daroussin 		  }
51*11fce282SBaptiste Daroussin 		} declaration
52*11fce282SBaptiste Daroussin 
53*11fce282SBaptiste Daroussin %union
54*11fce282SBaptiste Daroussin {
55*11fce282SBaptiste Daroussin     class	cval;
56*11fce282SBaptiste Daroussin     type	tval;
57*11fce282SBaptiste Daroussin     namelist *	nlist;
58*11fce282SBaptiste Daroussin     name	id;
59*11fce282SBaptiste Daroussin }
60*11fce282SBaptiste Daroussin 
61*11fce282SBaptiste Daroussin %start declaration
62*11fce282SBaptiste Daroussin 
63*11fce282SBaptiste Daroussin %%
64*11fce282SBaptiste Daroussin declaration: class type namelist'(' class ',' type ')'
65*11fce282SBaptiste Daroussin 	{ $$ = $3; }
66*11fce282SBaptiste Daroussin 	| type locnamelist '(' class ')'
67*11fce282SBaptiste Daroussin 	{ $$ = $2; }
68*11fce282SBaptiste Daroussin 	;
69*11fce282SBaptiste Daroussin 
70*11fce282SBaptiste Daroussin class	: GLOBAL { $$ = cGLOBAL; }
71*11fce282SBaptiste Daroussin 	| LOCAL  { $$ = cLOCAL; }
72*11fce282SBaptiste Daroussin 	;
73*11fce282SBaptiste Daroussin 
74*11fce282SBaptiste Daroussin type	: REAL    { $$ = tREAL; }
75*11fce282SBaptiste Daroussin 	| INTEGER { $$ = tINTEGER; }
76*11fce282SBaptiste Daroussin 	;
77*11fce282SBaptiste Daroussin 
78*11fce282SBaptiste Daroussin namelist: namelist NAME
79*11fce282SBaptiste Daroussin 	    { $$->s = mksymbol($<tval>0, $<cval>0, $2);
80*11fce282SBaptiste Daroussin 	      $$->next = $1;
81*11fce282SBaptiste Daroussin 	    }
82*11fce282SBaptiste Daroussin 	| NAME
83*11fce282SBaptiste Daroussin 	    { $$->s = mksymbol(0, 0, $1);
84*11fce282SBaptiste Daroussin 	      $$->next = NULL;
85*11fce282SBaptiste Daroussin 	    }
86*11fce282SBaptiste Daroussin 	;
87*11fce282SBaptiste Daroussin 
88*11fce282SBaptiste Daroussin locnamelist: namelist '(' LOCAL ',' type ')'
89*11fce282SBaptiste Daroussin 	{ $$ = $1; }
90*11fce282SBaptiste Daroussin 	;
91*11fce282SBaptiste Daroussin %%
92*11fce282SBaptiste Daroussin 
93*11fce282SBaptiste Daroussin extern int YYLEX_DECL();
94*11fce282SBaptiste Daroussin extern void YYERROR_DECL();
95