xref: /freebsd/contrib/byacc/test/inherit1.y (revision 6cec9cad762b6476313fb1f8e931a1647822db6b)
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 extern int YYLEX_DECL();
20*0c8de5b0SBaptiste Daroussin extern void YYERROR_DECL();
21*0c8de5b0SBaptiste Daroussin #endif
22*0c8de5b0SBaptiste Daroussin %}
23*0c8de5b0SBaptiste Daroussin 
24*0c8de5b0SBaptiste Daroussin %token <cval> GLOBAL LOCAL
25*0c8de5b0SBaptiste Daroussin %token <tval> REAL INTEGER
26*0c8de5b0SBaptiste Daroussin %token <id>   NAME
27*0c8de5b0SBaptiste Daroussin 
28*0c8de5b0SBaptiste Daroussin %type <nlist> declaration namelist locnamelist
29*0c8de5b0SBaptiste Daroussin %type <cval>  class
30*0c8de5b0SBaptiste Daroussin %type <tval>  type
31*0c8de5b0SBaptiste Daroussin 
32*0c8de5b0SBaptiste Daroussin %union
33*0c8de5b0SBaptiste Daroussin {
34*0c8de5b0SBaptiste Daroussin     class	cval;
35*0c8de5b0SBaptiste Daroussin     type	tval;
36*0c8de5b0SBaptiste Daroussin     namelist *	nlist;
37*0c8de5b0SBaptiste Daroussin     name	id;
38*0c8de5b0SBaptiste Daroussin }
39*0c8de5b0SBaptiste Daroussin 
40*0c8de5b0SBaptiste Daroussin %start declaration
41*0c8de5b0SBaptiste Daroussin 
42*0c8de5b0SBaptiste Daroussin %%
43*0c8de5b0SBaptiste Daroussin declaration: class type namelist
44*0c8de5b0SBaptiste Daroussin 	{ $$ = $3; }
45*0c8de5b0SBaptiste Daroussin 	| type locnamelist
46*0c8de5b0SBaptiste Daroussin 	{ $$ = $2; }
47*0c8de5b0SBaptiste Daroussin 	;
48*0c8de5b0SBaptiste Daroussin 
49*0c8de5b0SBaptiste Daroussin class	: GLOBAL { $$ = cGLOBAL; }
50*0c8de5b0SBaptiste Daroussin 	| LOCAL  { $$ = cLOCAL; }
51*0c8de5b0SBaptiste Daroussin 	;
52*0c8de5b0SBaptiste Daroussin 
53*0c8de5b0SBaptiste Daroussin type	: REAL    { $$ = tREAL; }
54*0c8de5b0SBaptiste Daroussin 	| INTEGER { $$ = tINTEGER; }
55*0c8de5b0SBaptiste Daroussin 	;
56*0c8de5b0SBaptiste Daroussin 
57*0c8de5b0SBaptiste Daroussin namelist: namelist NAME
58*0c8de5b0SBaptiste Daroussin 	    { $$->s = mksymbol($<tval>0, $<cval>-1, $2);
59*0c8de5b0SBaptiste Daroussin 	      $$->next = $1;
60*0c8de5b0SBaptiste Daroussin 	    }
61*0c8de5b0SBaptiste Daroussin 	| NAME
62*0c8de5b0SBaptiste Daroussin 	    { $$->s = mksymbol($<tval>0, $<cval>-1, $1);
63*0c8de5b0SBaptiste Daroussin 	      $$->next = NULL;
64*0c8de5b0SBaptiste Daroussin 	    }
65*0c8de5b0SBaptiste Daroussin 	;
66*0c8de5b0SBaptiste Daroussin 
67*0c8de5b0SBaptiste Daroussin locnamelist:
68*0c8de5b0SBaptiste Daroussin 	{ $<cval>$ = cLOCAL; }    /* set up semantic stack for <class> = LOCAL */
69*0c8de5b0SBaptiste Daroussin 	{ $<tval>$ = $<tval>-1; } /* copy <type> to where <namelist> expects it */
70*0c8de5b0SBaptiste Daroussin 	namelist
71*0c8de5b0SBaptiste Daroussin 	{ $$ = $3; }
72*0c8de5b0SBaptiste Daroussin 	;
73*0c8de5b0SBaptiste Daroussin %%
74*0c8de5b0SBaptiste Daroussin 
75*0c8de5b0SBaptiste Daroussin extern int YYLEX_DECL();
76*0c8de5b0SBaptiste Daroussin extern void YYERROR_DECL();
77