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