10c8de5b0SBaptiste Daroussin %locations
20c8de5b0SBaptiste Daroussin %{
30c8de5b0SBaptiste Daroussin #include <stdlib.h>
40c8de5b0SBaptiste Daroussin
50c8de5b0SBaptiste Daroussin typedef enum {cGLOBAL, cLOCAL} class;
60c8de5b0SBaptiste Daroussin typedef enum {tREAL, tINTEGER} type;
70c8de5b0SBaptiste Daroussin typedef char * name;
80c8de5b0SBaptiste Daroussin
90c8de5b0SBaptiste Daroussin struct symbol { class c; type t; name id; };
100c8de5b0SBaptiste Daroussin typedef struct symbol symbol;
110c8de5b0SBaptiste Daroussin
120c8de5b0SBaptiste Daroussin struct namelist { symbol *s; struct namelist *next; };
130c8de5b0SBaptiste Daroussin typedef struct namelist namelist;
140c8de5b0SBaptiste Daroussin
150c8de5b0SBaptiste Daroussin extern symbol *mksymbol(type t, class c, name id);
160c8de5b0SBaptiste Daroussin
170c8de5b0SBaptiste Daroussin #ifdef YYBISON
180c8de5b0SBaptiste Daroussin #define YYLEX_DECL() yylex(void)
190c8de5b0SBaptiste Daroussin #define YYERROR_DECL() yyerror(const char *s)
200c8de5b0SBaptiste Daroussin #endif
210c8de5b0SBaptiste Daroussin %}
220c8de5b0SBaptiste Daroussin
230c8de5b0SBaptiste Daroussin %token <cval> GLOBAL LOCAL
240c8de5b0SBaptiste Daroussin %token <tval> REAL INTEGER
250c8de5b0SBaptiste Daroussin %token <id> NAME
260c8de5b0SBaptiste Daroussin
270c8de5b0SBaptiste Daroussin %type <nlist> declaration namelist(<cval>, <tval>) locnamelist(<tval>)
280c8de5b0SBaptiste Daroussin %destructor { } <nlist>
290c8de5b0SBaptiste Daroussin %type <cval> class
300c8de5b0SBaptiste Daroussin %type <tval> type
310c8de5b0SBaptiste Daroussin
320c8de5b0SBaptiste Daroussin %destructor {
330c8de5b0SBaptiste Daroussin namelist *p = $$;
340c8de5b0SBaptiste Daroussin while (p != NULL)
350c8de5b0SBaptiste Daroussin { namelist *pp = p;
360c8de5b0SBaptiste Daroussin p = p->next;
370c8de5b0SBaptiste Daroussin free(pp->s); free(pp);
380c8de5b0SBaptiste Daroussin }
390c8de5b0SBaptiste Daroussin } <nlist>
400c8de5b0SBaptiste Daroussin
410c8de5b0SBaptiste Daroussin %union
420c8de5b0SBaptiste Daroussin {
430c8de5b0SBaptiste Daroussin class cval;
440c8de5b0SBaptiste Daroussin type tval;
450c8de5b0SBaptiste Daroussin namelist * nlist;
460c8de5b0SBaptiste Daroussin name id;
470c8de5b0SBaptiste Daroussin }
480c8de5b0SBaptiste Daroussin
490c8de5b0SBaptiste Daroussin %start declaration
500c8de5b0SBaptiste Daroussin
510c8de5b0SBaptiste Daroussin %%
520c8de5b0SBaptiste Daroussin declaration: class type namelist($1, $2)
53*c5b5d71aSJung-uk Kim { $$ = $3; @$ = @3; }
540c8de5b0SBaptiste Daroussin | type locnamelist($1)
55*c5b5d71aSJung-uk Kim { $$ = $2; @$ = @-1; }
560c8de5b0SBaptiste Daroussin ;
570c8de5b0SBaptiste Daroussin
580c8de5b0SBaptiste Daroussin class : GLOBAL { $$ = cGLOBAL; }
590c8de5b0SBaptiste Daroussin | LOCAL { $$ = cLOCAL; }
600c8de5b0SBaptiste Daroussin ;
610c8de5b0SBaptiste Daroussin
620c8de5b0SBaptiste Daroussin type : REAL { $$ = tREAL; }
630c8de5b0SBaptiste Daroussin | INTEGER { $$ = tINTEGER; }
640c8de5b0SBaptiste Daroussin ;
650c8de5b0SBaptiste Daroussin
namelist($c,$t)660c8de5b0SBaptiste Daroussin namelist($c, $t): namelist NAME
670c8de5b0SBaptiste Daroussin { $$->s = mksymbol($t, $c, $2);
680c8de5b0SBaptiste Daroussin $$->next = $1;
690c8de5b0SBaptiste Daroussin }
700c8de5b0SBaptiste Daroussin | NAME
710c8de5b0SBaptiste Daroussin { $$->s = mksymbol($t, $c, $1);
720c8de5b0SBaptiste Daroussin $$->next = NULL;
730c8de5b0SBaptiste Daroussin }
740c8de5b0SBaptiste Daroussin ;
750c8de5b0SBaptiste Daroussin
locnamelist($t)760c8de5b0SBaptiste Daroussin locnamelist($t): namelist
770c8de5b0SBaptiste Daroussin { $$ = $1; @$ = @2; }
780c8de5b0SBaptiste Daroussin ;
790c8de5b0SBaptiste Daroussin %%
800c8de5b0SBaptiste Daroussin
810c8de5b0SBaptiste Daroussin extern int YYLEX_DECL();
820c8de5b0SBaptiste Daroussin extern void YYERROR_DECL();
83