diff -uar ocaml-3.06/yacc/reader.c ocaml-3.06.adl/yacc/reader.c
--- ocaml-3.06/yacc/reader.c	2001-07-12 08:54:23.000000000 -0400
+++ ocaml-3.06.adl/yacc/reader.c	2003-10-17 16:47:26.000000000 -0400
@@ -50,7 +50,57 @@
 
 char line_format[] = "(* Line %d, file %s *)\n";
 
+char* generated_rules = NULL;
+int redir_input = 0;
 
+//#define lgetc(f) getc(f)
+static int lgetc(FILE* f)
+{
+   int retval = EOF;
+   if (!redir_input)
+      retval = getc(f);
+   if (retval == EOF && generated_rules)
+   {
+      if (redir_input < strlen(generated_rules))
+	 retval = generated_rules[redir_input++];
+      else
+      {
+	 free(generated_rules);
+	 generated_rules = NULL;
+      }
+   }
+   return retval;
+}
+
+#define safe_strlen(s) (s?strlen(s):0)
+
+static void add_star_rule(char* name)
+{
+   char* addstr = "%s_STAR_:  {[]} | %s_PLUS_ {$1};\n";
+   int addlen = 2 * strlen(name) + safe_strlen(generated_rules) + strlen(addstr) - 3;
+   generated_rules = realloc(generated_rules, addlen);
+   strcat(generated_rules, name);
+   strcat(generated_rules, "_STAR_:  {[]} | ");
+   strcat(generated_rules, name);
+   strcat(generated_rules, "_PLUS_ {$1};\n");
+   //printf("%s_STAR_:  {[]} | %s_PLUS_ {$1};\n", name, name);
+}
+static void add_plus_rule(char* name)
+{
+   char* addstr = "%s_PLUS_: %s {[$1]} | %s %s_PLUS_ {$1::$2};\n";
+   int addlen = 4 * strlen(name) + safe_strlen(generated_rules) + strlen(addstr) - 7;
+   generated_rules = realloc(generated_rules, addlen);
+   strcat(generated_rules, name);
+   strcat(generated_rules, "_PLUS_: ");
+   strcat(generated_rules, name);
+   strcat(generated_rules, " {[$1]} | ");
+   strcat(generated_rules, name);
+   strcat(generated_rules, " ");
+   strcat(generated_rules, name);
+   strcat(generated_rules, "_PLUS_ {$1::$2};\n");
+
+   //printf("%s_PLUS_: %s {[$1]} | %s %s_PLUS_ {$1::$2};\n", name, name, name, name);
+}
 
 void start_rule (register bucket *bp, int s_lineno);
 
@@ -74,7 +124,7 @@
     register int c;
     register int i;
 
-    if (saw_eof || (c = getc(f)) == EOF)
+    if (saw_eof || (c = lgetc(f)) == EOF)
     {
         if (line) { FREE(line); line = 0; }
         cptr = 0;
@@ -102,7 +152,7 @@
             if (line ==  0) no_space();
         }
         if (c == '\n') { line[i] = '\0'; cptr = line; return; }
-        c = getc(f);
+        c = lgetc(f);
         if (c ==  EOF) { saw_eof = 1; c = '\n'; }
     }
 }
@@ -741,12 +791,44 @@
 get_name(void)
 {
     register int c;
+    struct llist* old;
 
     cinc = 0;
     for (c = *cptr; IS_IDENT(c); c = *++cptr)
         cachec(c);
     cachec(NUL);
 
+    c = nextc();
+    if (c == '*')
+    {
+       printf("Star on %s (adding plus rule also)\n", cache);
+       add_star_rule(cache);
+       add_plus_rule(cache);
+       --cinc;
+       ++cptr;
+       cachec('_');
+       cachec('S');
+       cachec('T');
+       cachec('A');
+       cachec('R');
+       cachec('_');
+       cachec(NUL);
+    }
+    if (c == '+')
+    {
+       printf("Plus on %s\n", cache);
+       add_plus_rule(cache);
+       --cinc;
+       ++cptr;
+       cachec('_');
+       cachec('P');
+       cachec('L');
+       cachec('U');
+       cachec('S');
+       cachec('_');
+       cachec(NUL);
+    }
+
     if (is_reserved(cache)) used_reserved(cache);
 
     return (lookup(cache));
@@ -1426,6 +1508,7 @@
 void read_grammar(void)
 {
     register int c;
+    struct llist* genr;
 
     initialize_grammar();
     advance_to_start();
