inherit1.y revision 303975
1258283Speter%{
2258283Speter#include <stdlib.h>
3258283Speter
4258283Spetertypedef enum {cGLOBAL, cLOCAL} class;
5258283Spetertypedef enum {tREAL, tINTEGER} type;
6258283Spetertypedef char * name;
7258283Speter
8258283Speterstruct symbol { class c; type t; name id; };
9258283Spetertypedef struct symbol symbol;
10258283Speter
11258283Speterstruct namelist { symbol *s; struct namelist *next; };
12258283Spetertypedef struct namelist namelist;
13258283Speter
14258283Speterextern symbol *mksymbol(type t, class c, name id);
15258283Speter
16258283Speter#ifdef YYBISON
17258283Speter#define YYLEX_DECL() yylex(void)
18258283Speter#define YYERROR_DECL() yyerror(const char *s)
19258283Speterextern int YYLEX_DECL();
20258283Speterextern void YYERROR_DECL();
21258283Speter#endif
22258283Speter%}
23258283Speter
24258283Speter%token <cval> GLOBAL LOCAL
25258283Speter%token <tval> REAL INTEGER
26258283Speter%token <id>   NAME
27258283Speter
28258283Speter%type <nlist> declaration namelist locnamelist
29258283Speter%type <cval>  class
30258283Speter%type <tval>  type
31258283Speter
32258283Speter%union
33258283Speter{
34258283Speter    class	cval;
35258283Speter    type	tval;
36258283Speter    namelist *	nlist;
37258283Speter    name	id;
38}
39
40%start declaration
41
42%%
43declaration: class type namelist
44	{ $$ = $3; }
45	| type locnamelist
46	{ $$ = $2; }
47	;
48
49class	: GLOBAL { $$ = cGLOBAL; }
50	| LOCAL  { $$ = cLOCAL; }
51	;
52
53type	: REAL    { $$ = tREAL; }
54	| INTEGER { $$ = tINTEGER; }
55	;
56
57namelist: namelist NAME
58	    { $$->s = mksymbol($<tval>0, $<cval>-1, $2);
59	      $$->next = $1;
60	    }
61	| NAME
62	    { $$->s = mksymbol($<tval>0, $<cval>-1, $1);
63	      $$->next = NULL;
64	    }
65	;
66
67locnamelist:
68	{ $<cval>$ = cLOCAL; }    /* set up semantic stack for <class> = LOCAL */
69	{ $<tval>$ = $<tval>-1; } /* copy <type> to where <namelist> expects it */
70	namelist
71	{ $$ = $3; }
72	;
73%%
74
75extern int YYLEX_DECL();
76extern void YYERROR_DECL();
77