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