X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/33285af04d4a1d2ae110796015fe7d5069f3cc46..e89a22bfab22e4d2ee73be49dcb66b51f8d0e892:/src/reader.c?ds=inline diff --git a/src/reader.c b/src/reader.c index f693b965..529cebe9 100644 --- a/src/reader.c +++ b/src/reader.c @@ -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 | -| 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 -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); @@ -321,11 +323,25 @@ copy_at (FILE *fin, struct obstack *oout, int stack_offset) } else if (isdigit (c) || c == '-') { - int n; + int n, i; 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; } @@ -1103,7 +1119,7 @@ copy_action (symbol_list *rule, int stack_offset) case '@': copy_at (finput, &action_obstack, - stack_offset); + rule, stack_offset); 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;}"); } /*-------------------------------------------------------------------. @@ -1197,7 +1219,7 @@ copy_guard (symbol_list *rule, int stack_offset) break; case '@': - copy_at (finput, &guard_obstack, stack_offset); + copy_at (finput, &guard_obstack, rule, stack_offset); break; case EOF: @@ -1438,12 +1460,14 @@ readgram (void) /* 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); + /* Attach its lineno to that of the host rule. */ + p->line = crule->line; 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].useful = TRUE; p = p->next; while (p && p->sym) @@ -1908,6 +1933,9 @@ packgram (void) } ritem[itemno] = 0; + + if (trace_flag) + ritem_print (stderr); } /*-------------------------------------------------------------------.