bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [RFC] Allow %expect and %expect annotations on rules


From: Akim Demaille
Subject: Re: [RFC] Allow %expect and %expect annotations on rules
Date: Wed, 7 Nov 2018 22:40:44 +0100


> Le 7 nov. 2018 à 22:39, Akim Demaille <address@hidden> a écrit :
> 
> I have rebased Paul’s original proposal, and pushed in ‘expect’ branch.
> 
> commit f4d7d30ece4a0c7c9d5911d972b93c1544155dd6
> Author: Paul Hilfinger <address@hidden>
> Date:   Tue Feb 26 16:28:36 2013 -0800
> 
>    allow %expect and %expect-rr modifiers on individual rules

On top of this, I have this stylistic/modernization commit.

commit 2cd225a361dae9af86ab04623a2a37f257eea2ae
Author: Akim Demaille <address@hidden>
Date:   Wed Feb 27 14:43:20 2013 +0100

    style: reduce scopes
    
    * src/conflicts.c, src/reader.c: Minor style changes.

diff --git a/src/conflicts.c b/src/conflicts.c
index d57b7231..5e7268a7 100644
--- a/src/conflicts.c
+++ b/src/conflicts.c
@@ -506,26 +506,25 @@ count_rr_conflicts (bool one_per_token)
 
 /*----------------------------------------------------------------------.
 | For a given rule, count the number of states for which it is involved |
-| in shift/reduce conflicts.                                               |
+| in shift/reduce conflicts.                                            |
 `----------------------------------------------------------------------*/
 
 static bool
 rule_has_state_sr_conflicts (rule *r, state *s)
 {
-  int i;
-  int j;
   transitions *trans = s->transitions;
   reductions *reds = s->reductions;
 
-  for (i = 0; i < reds->num; i++)
+  for (int i = 0; i < reds->num; ++i)
     if (reds->rules[i] == r)
-      break;
-  if (i >= reds->num)
-    return false;
-
-  FOR_EACH_SHIFT (trans, j)
-    if (bitset_test (reds->lookahead_tokens[i], TRANSITION_SYMBOL (trans, j)))
-      return true;
+      {
+        bitset lookaheads = reds->lookahead_tokens[i];
+        int j;
+        FOR_EACH_SHIFT (trans, j)
+          if (bitset_test (lookaheads, TRANSITION_SYMBOL (trans, j)))
+            return true;
+        break;
+      }
 
   return false;
 }
@@ -533,11 +532,8 @@ rule_has_state_sr_conflicts (rule *r, state *s)
 static size_t
 count_rule_sr_conflicts (rule *r)
 {
-  state_number i;
-  size_t res;
-
-  res = 0;
-  for (i = 0; i < nstates; i++)
+  size_t res = 0;
+  for (state_number i = 0; i < nstates; ++i)
     if (conflicts[i] && rule_has_state_sr_conflicts (r, states[i]))
       res++;
   return res;
@@ -551,22 +547,18 @@ count_rule_sr_conflicts (rule *r)
 static bool
 rule_has_state_rr_conflicts (rule *r, state *s)
 {
-  int i;
   reductions *reds = s->reductions;
-  size_t res;
-  bitset lookaheads;
-  
-  for (i = 0; i < reds->num; i++)
-    if (reds->rules[i] == r)
-      break;
-  if (i >= reds->num)
-    return 0;
-  lookaheads = reds->lookahead_tokens[i];
 
-  for (i = 0; i < reds->num; i++)
-    if (reds->rules[i] != r &&
-        !bitset_disjoint_p (lookaheads, reds->lookahead_tokens[i]))
-      return true;
+  for (int i = 0; i < reds->num; ++i)
+    if (reds->rules[i] == r)
+      {
+        bitset lookaheads = reds->lookahead_tokens[i];
+        for (int j = 0; j < reds->num; ++j)
+          if (reds->rules[j] != r &&
+              !bitset_disjoint_p (lookaheads, reds->lookahead_tokens[j]))
+            return true;
+        break;
+      }
 
   return false;
 }
@@ -574,13 +566,10 @@ rule_has_state_rr_conflicts (rule *r, state *s)
 static size_t
 count_rule_rr_conflicts (rule *r)
 {
-  state_number i;
-  size_t res;
-
-  res = 0;
-  for (i = 0; i < nstates; i++)
+  size_t res = 0;
+  for (state_number i = 0; i < nstates; ++i)
     if (conflicts[i] && rule_has_state_rr_conflicts (r, states[i]))
-       res++;
+      res++;
   return res;
 }
 
@@ -635,25 +624,25 @@ conflicts_total_count (void)
 static void
 rule_conflicts_print (void)
 {
-  rule_number i;
-
-  for (i = 0; i < nrules; i += 1)
+  for (rule_number i = 0; i < nrules; i += 1)
     {
       rule *r = &rules[i];
       int expected_sr = r->expected_sr_conflicts;
       int expected_rr = r->expected_rr_conflicts;
 
-      if (expected_sr != -1 || expected_rr != -1) 
+      if (expected_sr != -1 || expected_rr != -1)
         {
           int sr = count_rule_sr_conflicts (r);
-          int rr = count_rule_rr_conflicts (r);
           if (sr != expected_sr && (sr != 0 || expected_sr != -1))
-            complain (&r->location, complaint, _("\
-shift/reduce conflicts for rule %d: %d found, %d expected"),
+            complain (&r->location, complaint,
+                      _("shift/reduce conflicts for rule %d:"
+                        " %d found, %d expected"),
                       r->user_number, sr, expected_sr);
+          int rr = count_rule_rr_conflicts (r);
           if (rr != expected_rr && (rr != 0 || expected_rr != -1))
-            complain (&r->location, complaint, _("\
-reduce/reduce conflicts for rule %d: %d found, %d expected"),
+            complain (&r->location, complaint,
+                      _("reduce/reduce conflicts for rule %d:"
+                        " %d found, %d expected"),
                       r->user_number, rr, expected_rr);
         }
     }
diff --git a/src/reader.c b/src/reader.c
index 72b5ca45..985647a5 100644
--- a/src/reader.c
+++ b/src/reader.c
@@ -114,13 +114,11 @@ record_merge_function_type (int merger, uniqstr type, 
location declaration_loc)
   if (merger <= 0)
     return;
 
-  int merger_find;
-  merger_list *merge_function;
-
   if (type == NULL)
     type = uniqstr_new ("");
 
-  merger_find = 1;
+  merger_list *merge_function;
+  int merger_find = 1;
   for (merge_function = merge_functions;
        merge_function != NULL && merger_find != merger;
        merge_function = merge_function->next)
@@ -585,6 +583,7 @@ grammar_current_rule_predicate_append (const char *pred, 
location loc)
 void
 grammar_current_rule_expect_sr (int count, location loc)
 {
+  (void) loc;
   current_rule->expected_sr_conflicts = count;
 }
 
@@ -608,13 +607,11 @@ static void
 packgram (void)
 {
   unsigned itemno = 0;
-  rule_number ruleno = 0;
-
   ritem = xnmalloc (nritems + 1, sizeof *ritem);
-
   /* This sentinel is used by build_relations in gram.c.  */
   *ritem++ = 0;
 
+  rule_number ruleno = 0;
   rules = xnmalloc (nrules, sizeof *rules);
 
   for (symbol_list *p = grammar; p; p = p->next)
@@ -747,11 +744,10 @@ prepare_percent_define_front_end_variables (void)
   /* Set %define front-end variable defaults.  */
   muscle_percent_define_default ("lr.keep-unreachable-state", "false");
   {
-    char *lr_type;
     /* IELR would be a better default, but LALR is historically the
        default.  */
     muscle_percent_define_default ("lr.type", "lalr");
-    lr_type = muscle_percent_define_get ("lr.type");
+    char *lr_type = muscle_percent_define_get ("lr.type");
     if (STRNEQ (lr_type, "canonical-lr"))
       muscle_percent_define_default ("lr.default-reduction", "most");
     else




reply via email to

[Prev in Thread] Current Thread [Next in Thread]