]> git.saurik.com Git - bison.git/blobdiff - src/reader.c
Regenerate.
[bison.git] / src / reader.c
index 0744b3f292a6090397d40a4dd9ef350bc8531f46..75a23692dd8c91ffe8e0125805445accc776491f 100644 (file)
@@ -36,6 +36,8 @@
 #include "symlist.h"
 #include "symtab.h"
 
+static void check_and_convert_grammar (void);
+
 static symbol_list *grammar = NULL;
 static bool start_flag = false;
 merger_list *merge_functions;
@@ -210,17 +212,16 @@ grammar_current_rule_begin (symbol *lhs, location loc)
 }
 
 
-/*-----------------------------------------------------------------.
-| A symbol is typed if it has a declared %type, or if it is a      |
-| mid-rule symbol (i.e., the generated LHS replacing a mid-rule    |
-| action) that was assigned to, as in `exp: { $$ = 1; } { $$ = $1; |
-| }'.                                                              |
-`-----------------------------------------------------------------*/
+/*----------------------------------------------------------------------.
+| A symbol should be used if it has a destructor, or if it is a         |
+| mid-rule symbol (i.e., the generated LHS replacing a mid-rule         |
+| action) that was assigned to, as in "exp: { $$ = 1; } { $$ = $1; }".  |
+`----------------------------------------------------------------------*/
 
 static bool
-symbol_typed_p (const symbol_list *s)
+symbol_should_be_used (symbol_list const *s)
 {
-  return (s->sym->type_name
+  return (s->sym->destructor
          || (s->midrule && s->midrule->used));
 }
 
@@ -259,13 +260,13 @@ grammar_rule_check (const symbol_list *r)
                 _("empty rule for typed nonterminal, and no action"));
     }
 
-  /* Check that typed symbol values are used.  */
+  /* Check that symbol values that should be used are in fact used.  */
   {
     symbol_list const *l = r;
     int n = 0;
     for (; l && l->sym; l = l->next, ++n)
       if (! (l->used
-            || !symbol_typed_p (l)
+            || !symbol_should_be_used (l)
             /* The default action, $$ = $1, `uses' both.  */
             || (!r->action && (n == 0 || n == 1))))
        {
@@ -299,7 +300,7 @@ grammar_current_rule_end (location loc)
 | rule.                                                              |
 `-------------------------------------------------------------------*/
 
-static void
+void
 grammar_midrule_action (void)
 {
   /* Since the action was written out with this rule's number, we must
@@ -393,14 +394,13 @@ grammar_current_rule_symbol_append (symbol *sym, location loc)
   grammar_symbol_append (sym, loc);
 }
 
-/* Attach an ACTION to the current rule.  If needed, move the previous
-   action as a mid-rule action.  */
+/* Attach an ACTION to the current rule.  */
 
 void
 grammar_current_rule_action_append (const char *action, location loc)
 {
-  if (current_rule->action)
-    grammar_midrule_action ();
+  /* There's no need to invoke grammar_midrule_action here, since the
+     scanner already did it if necessary.  */
   current_rule->action = action;
   current_rule->action_location = loc;
 }
@@ -469,8 +469,7 @@ packgram (void)
        p = p->next;
     }
 
-  if (itemno != nritems)
-    abort ();
+  assert (itemno == nritems);
 
   if (trace_flag & trace_sets)
     ritem_print (stderr);
@@ -516,12 +515,22 @@ reader (void)
   scanner_initialize ();
   gram_parse ();
 
-  /* If something went wrong during the parsing, don't try to
-     continue.  */
-  if (complaint_issued)
-    return;
+  if (! complaint_issued)
+    check_and_convert_grammar ();
 
-  /* Grammar has been read.  Do some checking */
+  xfclose (gram_in);
+}
+
+
+/*-------------------------------------------------------------.
+| Check the grammar that has just been read, and convert it to |
+| internal form.                                              |
+`-------------------------------------------------------------*/
+
+static void
+check_and_convert_grammar (void)
+{
+  /* Grammar has been read.  Do some checking.  */
   if (nrules == 0)
     fatal (_("no rules in the input grammar"));
 
@@ -538,7 +547,7 @@ reader (void)
       endtoken->user_token_number = 0;
     }
 
-  /* Insert the initial rule, which line is that of the first rule
+  /* Insert the initial rule, whose line is that of the first rule
      (not that of the start symbol):
 
      accept: %start EOF.  */
@@ -554,10 +563,7 @@ reader (void)
     grammar = p;
   }
 
-  if (! (nsyms <= SYMBOL_NUMBER_MAXIMUM && nsyms == ntokens + nvars))
-    abort ();
-
-  xfclose (gram_in);
+  assert (nsyms <= SYMBOL_NUMBER_MAXIMUM && nsyms == ntokens + nvars);
 
   /* Assign the symbols their symbol numbers.  Write #defines for the
      token symbols into FDEFINES if requested.  */