summaryrefslogtreecommitdiff
path: root/test/err_inherit2.y
diff options
context:
space:
mode:
Diffstat (limited to 'test/err_inherit2.y')
-rw-r--r--test/err_inherit2.y80
1 files changed, 80 insertions, 0 deletions
diff --git a/test/err_inherit2.y b/test/err_inherit2.y
new file mode 100644
index 0000000..a39e2d0
--- /dev/null
+++ b/test/err_inherit2.y
@@ -0,0 +1,80 @@
+%{
+#include <stdlib.h>
+
+typedef enum {cGLOBAL, cLOCAL} class;
+typedef enum {tREAL, tINTEGER} type;
+typedef char * name;
+
+struct symbol { class c; type t; name id; };
+typedef struct symbol symbol;
+
+struct namelist { symbol *s; struct namelist *next; };
+typedef struct namelist namelist;
+
+extern symbol *mksymbol(type t, class c, name id);
+
+#ifdef YYBISON
+#define YYLEX_DECL() yylex(void)
+#define YYERROR_DECL() yyerror(const char *s)
+#endif
+%}
+
+%token <cval> GLOBAL LOCAL
+%token <tval> REAL INTEGER
+%token <id> NAME
+
+%type <nlist> declaration namelist(<cval>, <tval>) locnamelist(<tval>)
+%type <cval> class
+%type <tval> type
+
+%destructor {
+ namelist *p = $$;
+ while (p != NULL)
+ { namelist *pp = p;
+ p = p->next;
+ free(pp->s); free(pp);
+ }
+ } <nlist>
+
+%union
+{
+ class cval;
+ type tval;
+ namelist * nlist;
+ name id;
+}
+
+%start declaration
+
+%%
+declaration: class type namelist($1, $2)
+ { $$ = $3; }
+ | type locnamelist($1)
+ { $$ = $2; }
+ ;
+
+class : GLOBAL { $$ = cGLOBAL; }
+ | LOCAL { $$ = cLOCAL; }
+ ;
+
+type : REAL { $$ = tREAL; }
+ | INTEGER { $$ = tINTEGER; }
+ ;
+
+namelist($<tval>c, $t, extra): namelist NAME
+ { $$->s = mksymbol($<tval>t, $<cval>c, $2);
+ $$->next = $1;
+ }
+ | NAME
+ { $$->s = mksymbol($t, $c, $1);
+ $$->next = NULL;
+ }
+ ;
+
+locnamelist($t): namelist(cLOCAL, $t)
+ { $$ = $1; }
+ ;
+%%
+
+extern int YYLEX_DECL();
+extern void YYERROR_DECL();