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 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: 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,$t)64*0c8de5b0SBaptiste Daroussin namelist($c, $t): namelist 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(@1, $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