]> git.saurik.com Git - bison.git/blobdiff - src/reader.c
Fix bug such that the first pushed token's value and location are
[bison.git] / src / reader.c
index ce23f48c9c8c5263b5a9b83b8d3761a672cb114a..7b7692328bdc558d6b6aea82b813cc2a614e66e1 100644 (file)
@@ -253,21 +253,13 @@ grammar_current_rule_begin (symbol *lhs, location loc)
 static bool
 symbol_should_be_used (symbol_list const *s)
 {
-  if (code_props_code_get (symbol_destructor_get (s->content.sym)))
+  if (symbol_destructor_get (s->content.sym))
     return true;
   if (warnings_flag & warnings_midrule_values)
-    {
-      if (s->midrule && code_props_is_value_used (s->midrule->action_props))
-        return true;
-      if (s->midrule_parent_rule)
-        {
-          symbol_list *rhs_node =
-            symbol_list_n_get (s->midrule_parent_rule,
-                               s->midrule_parent_rhs_index);
-          if (code_props_is_value_used (rhs_node->action_props))
-            return true;
-        }
-    }
+    return ((s->midrule && s->midrule->used)
+           || (s->midrule_parent_rule
+               && symbol_list_n_get (s->midrule_parent_rule,
+                                     s->midrule_parent_rhs_index)->used));
   return false;
 }
 
@@ -286,7 +278,7 @@ grammar_rule_check (const symbol_list *r)
 
      Don't worry about the default action if $$ is untyped, since $$'s
      value can't be used.  */
-  if (!code_props_code_get (r->action_props) && r->content.sym->type_name)
+  if (!r->action && r->content.sym->type_name)
     {
       symbol *first_rhs = r->next->content.sym;
       /* If $$ is being set in default way, report if any type mismatch.  */
@@ -311,11 +303,10 @@ grammar_rule_check (const symbol_list *r)
     symbol_list const *l = r;
     int n = 0;
     for (; l && l->content.sym; l = l->next, ++n)
-      if (! (code_props_is_value_used (l->action_props)
+      if (! (l->used
             || !symbol_should_be_used (l)
             /* The default action, $$ = $1, `uses' both.  */
-            || (!code_props_code_get (r->action_props)
-                 && (n == 0 || n == 1))))
+            || (!r->action && (n == 0 || n == 1))))
        {
          if (n)
            warn_at (r->location, _("unused value: $%d"), n);
@@ -355,8 +346,7 @@ grammar_midrule_action (void)
 
   /* Make a DUMMY nonterminal, whose location is that of the midrule
      action.  Create the MIDRULE.  */
-  location dummy_location =
-    code_props_location_get (current_rule->action_props);
+  location dummy_location = current_rule->action_location;
   symbol *dummy = dummy_symbol_get (dummy_location);
   symbol_list *midrule = symbol_list_sym_new (dummy, dummy_location);
 
@@ -366,12 +356,12 @@ grammar_midrule_action (void)
   ++nritems;
   /* Attach its location and actions to that of the DUMMY.  */
   midrule->location = dummy_location;
-  code_props_rule_action_init (
-    &midrule->action_props,
-    code_props_code_get (current_rule->action_props),
-    code_props_location_get (current_rule->action_props),
-    midrule);
-  code_props_none_init (&current_rule->action_props);
+  midrule->action = current_rule->action;
+  midrule->action_location = dummy_location;
+  current_rule->action = NULL;
+  /* The action has not been translated yet, so $$ use hasn't been
+     detected yet.  */
+  midrule->used = false;
 
   if (previous_rule_end)
     previous_rule_end->next = midrule;
@@ -397,6 +387,7 @@ grammar_midrule_action (void)
 void
 grammar_current_rule_prec_set (symbol *precsym, location loc)
 {
+  symbol_class_set (precsym, token_sym, loc, false);
   if (current_rule->ruleprec)
     complain_at (loc, _("only one %s allowed per rule"), "%prec");
   current_rule->ruleprec = precsym;
@@ -436,7 +427,7 @@ grammar_current_rule_merge_set (uniqstr name, location loc)
 void
 grammar_current_rule_symbol_append (symbol *sym, location loc)
 {
-  if (code_props_code_get (current_rule->action_props))
+  if (current_rule->action)
     grammar_midrule_action ();
   grammar_symbol_append (sym, loc);
 }
@@ -446,12 +437,12 @@ grammar_current_rule_symbol_append (symbol *sym, location loc)
 void
 grammar_current_rule_action_append (const char *action, location loc)
 {
-  if (code_props_code_get (current_rule->action_props))
+  if (current_rule->action)
     grammar_midrule_action ();
   /* After all symbol declarations have been parsed, packgram invokes
-     code_props_translate_code.  */
-  code_props_rule_action_init (&current_rule->action_props, action, loc,
-                               current_rule);
+     translate_rule_action.  */
+  current_rule->action = action;
+  current_rule->action_location = loc;
 }
 
 \f
@@ -482,7 +473,8 @@ packgram (void)
      `$' from any midrule symbol name.  */
   while (p)
     {
-      code_props_translate_code (&p->action_props);
+      if (p->action)
+        p->action = translate_rule_action (p);
       if (p)
        p = p->next;
     }
@@ -504,20 +496,16 @@ packgram (void)
       rules[ruleno].precsym = NULL;
       rules[ruleno].location = p->location;
       rules[ruleno].useful = true;
-      rules[ruleno].action = code_props_code_get (p->action_props);
-      if (rules[ruleno].action)
-        rules[ruleno].action_location =
-          code_props_location_get (p->action_props);
+      rules[ruleno].action = p->action;
+      rules[ruleno].action_location = p->action_location;
 
       /* If the midrule's $$ is set or its $n is used, remove the `$' from the
         symbol name so that it's a user-defined symbol so that the default
         %destructor and %printer apply.  */
       if (p->midrule_parent_rule
-          && (code_props_is_value_used (p->action_props)
-             || code_props_is_value_used (
-                  symbol_list_n_get (
-                    p->midrule_parent_rule,
-                    p->midrule_parent_rhs_index)->action_props)))
+          && (p->used
+             || symbol_list_n_get (p->midrule_parent_rule,
+                                   p->midrule_parent_rhs_index)->used))
        p->content.sym->tag += 1;
 
       /* Don't check the generated rule 0.  It has no action, so some rhs