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