]> git.saurik.com Git - bison.git/blobdiff - src/reader.c
* tests/regression.at, tests/torture.at, tests/calc.at: Adjust to
[bison.git] / src / reader.c
index f693b9650d7097f0462068abe74963c4659ffb86..529cebe99efa8849280a59473610b1d824fbe523 100644 (file)
@@ -304,13 +304,15 @@ copy_comment (FILE *fin, struct obstack *oout)
 /*-----------------------------------------------------------------.
 | FIN is pointing to a location (i.e., a `@').  Output to OOUT a   |
 | reference to this location. STACK_OFFSET is the number of values |
 /*-----------------------------------------------------------------.
 | FIN is pointing to a location (i.e., a `@').  Output to OOUT a   |
 | reference to this location. STACK_OFFSET is the number of values |
-| in the current rule so far, which says where to find `$0' with   |
+| in the current rule so far, which says where to find `@0' with   |
 | respect to the top of the stack.                                 |
 `-----------------------------------------------------------------*/
 
 static inline void
 | respect to the top of the stack.                                 |
 `-----------------------------------------------------------------*/
 
 static inline void
-copy_at (FILE *fin, struct obstack *oout, int stack_offset)
+copy_at (FILE *fin, struct obstack *oout,
+        struct symbol_list *rule, int stack_offset)
 {
 {
+  symbol_list *rp;
   int c;
 
   c = getc (fin);
   int c;
 
   c = getc (fin);
@@ -321,11 +323,25 @@ copy_at (FILE *fin, struct obstack *oout, int stack_offset)
     }
   else if (isdigit (c) || c == '-')
     {
     }
   else if (isdigit (c) || c == '-')
     {
-      int n;
+      int n, i;
 
       ungetc (c, fin);
       n = read_signed_integer (fin);
 
 
       ungetc (c, fin);
       n = read_signed_integer (fin);
 
+      rp = rule;
+      i = 0;
+
+      while (i < n)
+       {
+         rp = rp->next;
+         if (rp == NULL)
+           {
+             complain (_("invalid @ value"));
+             return;
+           }
+         i++;
+       }
+
       obstack_fgrow1 (oout, "yylsp[%d]", n - stack_offset);
       locations_flag = 1;
     }
       obstack_fgrow1 (oout, "yylsp[%d]", n - stack_offset);
       locations_flag = 1;
     }
@@ -1103,7 +1119,7 @@ copy_action (symbol_list *rule, int stack_offset)
 
            case '@':
              copy_at (finput, &action_obstack,
 
            case '@':
              copy_at (finput, &action_obstack,
-                      stack_offset);
+                      rule, stack_offset);
              break;
 
            case EOF:
              break;
 
            case EOF:
@@ -1125,7 +1141,13 @@ copy_action (symbol_list *rule, int stack_offset)
        }
     }
 
        }
     }
 
-  obstack_sgrow (&action_obstack, ";\n    break;}");
+  /* As a Bison extension, add the ending semicolon.  Since some Yacc
+     don't do that, help people using bison as a Yacc finding their
+     missing semicolons.  */
+  if (yacc_flag)
+    obstack_sgrow (&action_obstack, "}\n    break;");
+  else
+    obstack_sgrow (&action_obstack, ";\n    break;}");
 }
 \f
 /*-------------------------------------------------------------------.
 }
 \f
 /*-------------------------------------------------------------------.
@@ -1197,7 +1219,7 @@ copy_guard (symbol_list *rule, int stack_offset)
          break;
 
        case '@':
          break;
 
        case '@':
-         copy_at (finput, &guard_obstack, stack_offset);
+         copy_at (finput, &guard_obstack, rule, stack_offset);
          break;
 
        case EOF:
          break;
 
        case EOF:
@@ -1438,12 +1460,14 @@ readgram (void)
                  /* Make a dummy nonterminal, a gensym.  */
                  bucket *sdummy = gensym ();
 
                  /* Make a dummy nonterminal, a gensym.  */
                  bucket *sdummy = gensym ();
 
-                 /* Make a new rule, whose body is empty,
-                    before the current one, so that the action
-                    just read can belong to it.  */
+                 /* Make a new rule, whose body is empty, before the
+                    current one, so that the action just read can
+                    belong to it.  */
                  nrules++;
                  nitems++;
                  p = symbol_list_new (sdummy);
                  nrules++;
                  nitems++;
                  p = symbol_list_new (sdummy);
+                 /* Attach its lineno to that of the host rule. */
+                 p->line = crule->line;
                  if (crule1)
                    crule1->next = p;
                  else
                  if (crule1)
                    crule1->next = p;
                  else
@@ -1875,6 +1899,7 @@ packgram (void)
       rule_table[ruleno].lhs = p->sym->value;
       rule_table[ruleno].rhs = itemno;
       rule_table[ruleno].line = p->line;
       rule_table[ruleno].lhs = p->sym->value;
       rule_table[ruleno].rhs = itemno;
       rule_table[ruleno].line = p->line;
+      rule_table[ruleno].useful = TRUE;
 
       p = p->next;
       while (p && p->sym)
 
       p = p->next;
       while (p && p->sym)
@@ -1908,6 +1933,9 @@ packgram (void)
     }
 
   ritem[itemno] = 0;
     }
 
   ritem[itemno] = 0;
+
+  if (trace_flag)
+    ritem_print (stderr);
 }
 \f
 /*-------------------------------------------------------------------.
 }
 \f
 /*-------------------------------------------------------------------.