bison-patches
[Top][All Lists]
Advanced

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

04-grammar-current-rule-check.patch


From: Akim Demaille
Subject: 04-grammar-current-rule-check.patch
Date: Tue, 11 Jun 2002 10:05:59 +0200

Index: ChangeLog
from  Akim Demaille  <address@hidden>

        * src/reader.c (grammar_current_rule_prec_set).
        (grammar_current_rule_check): New, eved out from...
        (readgram): here.
        Remove `xaction', `first_rhs': useless.
        * tests/input.at (Type clashes): New.
        * tests/existing.at (GNU Cim Grammar): Adjust.

Index: NEWS
--- NEWS Thu, 06 Jun 2002 20:45:16 +0200 akim (bison/6_NEWS 1.10.1.12.1.17.1.1 
664)
+++ NEWS Mon, 10 Jun 2002 23:20:35 +0200 akim (bison/6_NEWS 1.10.1.12.1.17.1.1 
664)
@@ -96,6 +96,15 @@
     Bison used to systematically output this information on top of
     the report.  Solved conflicts are now attached to their states.

+* Type clashes
+  Previous versions don't complain when there is a type clash on
+  the default action if the rule has a mid-rule action, such as in:
+
+      %type <foo> bar
+      %%
+      bar: '0' {} '0';
+
+  This is fixed.
 
 Changes in version 1.35, 2002-03-25:

Index: src/reader.c
--- src/reader.c Mon, 10 Jun 2002 21:44:41 +0200 akim (bison/b/5_reader.c 
1.77.1.3.1.18.1.7.1.3 664)
+++ src/reader.c Mon, 10 Jun 2002 23:15:07 +0200 akim (bison/b/5_reader.c 
1.77.1.3.1.18.1.7.1.4 664)
@@ -972,8 +972,6 @@
 | which says where to find `$0' with respect to the top of the      |
 | stack.  It is not the same as the rule->length in the case of mid |
 | rule actions.                                                     |
-|                                                                   |
-| This routine is used for actions.                                 |
 `------------------------------------------------------------------*/

 static void
@@ -1169,6 +1167,48 @@
   grammar_symbol_append (sdummy);
 }

+/* Set the precedence symbol of the current rule to PRECSYM. */
+
+static void
+grammar_current_rule_prec_set (symbol_t *precsym)
+{
+  if (current_rule->ruleprec)
+    complain (_("two @prec's in a row"));
+  current_rule->ruleprec = precsym;
+}
+
+/* Check that the last rule (CURRENT_RULE) is properly defined.  For
+   instance, there should be no type clash on the default action.  */
+
+static void
+grammar_current_rule_check (void)
+{
+  symbol_t *lhs = current_rule->sym;
+  symbol_t *first_rhs = current_rule->next->sym;
+
+  /* If there is an action, then there is nothing we can do: the user
+     is allowed to shoot in her foot.  */
+  if (current_rule->action)
+    return;
+
+  /* If $$ is being set in default way, report if any type mismatch.
+     */
+  if (first_rhs)
+    {
+      const char *lhs_type = lhs->type_name       ? lhs->type_name       : "";
+      const char *rhs_type = first_rhs->type_name ? first_rhs->type_name : "";
+      if (strcmp (lhs_type, rhs_type))
+       complain (_("type clash (`%s' `%s') on default action"),
+                 lhs_type, rhs_type);
+    }
+  /* Warn if there is no default for $$ but we need one.  */
+  else
+    {
+      if (lhs->type_name)
+       complain (_("empty rule for typed nonterminal, and no action"));
+    }
+}
+

 static void
 readgram (void)
@@ -1184,8 +1224,6 @@
        int action_flag = 0;
        /* Number of symbols in rhs of this rule so far */
        int rulelength = 0;
-       int xactions = 0;       /* JF for error checking */
-       symbol_t *first_rhs = 0;

        if (t == tok_identifier)
          {
@@ -1213,7 +1251,7 @@
            if (t == tok_prec)
              {
                t = lex ();
-               current_rule->ruleprec = symval;
+               grammar_current_rule_prec_set (symval);
                t = lex ();
              }

@@ -1236,11 +1274,8 @@
                    warn (_("previous rule lacks an ending `;'"));
                    break;
                  }
-
-               if (!first_rhs) /* JF */
-                 first_rhs = symval;
-               /* Not followed by colon =>
-                  process as part of this rule's rhs.  */
+               /* Not followed by colon => process as part of this
+                  rule's rhs.  */
              }

            /* If we just passed an action, that action was in the middle
@@ -1261,7 +1296,6 @@
              {
                parse_action (current_rule, rulelength);
                action_flag = 1;
-               ++xactions;     /* JF */
              }
            ++rulelength;
          }                     /* end of  read rhs of rule */
@@ -1271,37 +1305,20 @@

        if (t == tok_prec)
          {
-           complain (_("two @prec's in a row"));
            t = lex ();
-           current_rule->ruleprec = symval;
+           grammar_current_rule_prec_set (symval);
            t = lex ();
          }

        if (t == tok_left_curly)
          {
-           /* This case never occurs -wjh */
-           if (action_flag)
-             complain (_("two actions at end of one rule"));
            parse_action (current_rule, rulelength);
            action_flag = 1;
-           ++xactions; /* -wjh */
            t = lex ();
          }
-       /* If $$ is being set in default way, report if any type
-          mismatch.  */
-       else if (!xactions
-                && first_rhs && lhs->type_name != first_rhs->type_name)
-         {
-           if (lhs->type_name == 0
-               || first_rhs->type_name == 0
-               || strcmp (lhs->type_name, first_rhs->type_name))
-             complain (_("type clash (`%s' `%s') on default action"),
-                       lhs->type_name ? lhs->type_name : "",
-                       first_rhs->type_name ? first_rhs->type_name : "");
-         }
-       /* Warn if there is no default for $$ but we need one.  */
-       else if (!xactions && !first_rhs && lhs->type_name != 0)
-         complain (_("empty rule for typed nonterminal, and no action"));
+
+       grammar_current_rule_check ();
+
        if (t == tok_two_percents || t == tok_eof)
          warn (_("previous rule lacks an ending `;'"));
        if (t == tok_semicolon)
Index: tests/existing.at
--- tests/existing.at Sun, 07 Apr 2002 11:45:10 +0200 akim 
(bison/e/1_existing.a 1.1 644)
+++ tests/existing.at Mon, 10 Jun 2002 23:16:38 +0200 akim 
(bison/e/1_existing.a 1.1 644)
@@ -907,7 +907,7 @@
 LISTV           :       HIDENTIFIER     { regDecl($1, type, KNOKD, CDEFLT);}
                 |      FPP_CATEG HDOTDOTDOT      { regDecl(varargsid, 
TVARARGS, KNOKD, categ);}
                 |       HIDENTIFIER     { regDecl($1, type, KNOKD, CDEFLT);}
-                        HPAREXPSEPARATOR LISTV
+                        HPAREXPSEPARATOR LISTV {}
                 |       FPP_SPEC
                 |       FPP_SPEC
                         HPAREXPSEPARATOR LISTV
@@ -947,7 +947,7 @@
 IDENTIFIER_LISTV:       HIDENTIFIER     { regDecl($1, type, kind, categ);}
                 |      HDOTDOTDOT {      regDecl(varargsid, TVARARGS, kind, 
categ);}
                 |       HIDENTIFIER     { regDecl($1, type, kind, categ);}
-                        HPAREXPSEPARATOR IDENTIFIER_LISTV
+                        HPAREXPSEPARATOR IDENTIFIER_LISTV {}
                 ;
 MBEE_MODE_PART  :       /*EMPT*/
                 |       MODE_PART
@@ -1153,7 +1153,7 @@
                 |       HNONE                   { mout(MNONE);$$=NULL;}
                 |       HIDENTIFIER
                                 { $<ident>$=$1;}
-                        MBEE_ARG_R_PT
+                        MBEE_ARG_R_PT {}
                 |       HTHIS HIDENTIFIER       { mout(MTHIS);
                                                   moutId($2);$$=NULL;}
                 |       HNEW
Index: tests/input.at
--- tests/input.at Sat, 16 Mar 2002 13:01:57 +0100 akim (bison/d/49_input.at 
1.1 644)
+++ tests/input.at Mon, 10 Jun 2002 23:18:26 +0200 akim (bison/d/49_input.at 
1.1 644)
@@ -24,7 +24,6 @@
 ## Invalid $n.  ##
 ## ------------ ##

-
 AT_SETUP([Invalid $n])

 AT_DATA([input.y],
@@ -43,7 +42,6 @@ exp: { $$ = $1 ; };
 ## Invalid @n.  ##
 ## ------------ ##

-
 AT_SETUP([Invalid @n])

 AT_DATA([input.y],
@@ -53,6 +51,31 @@ exp: { @$ = @1 ; };

 AT_CHECK([bison input.y], [1], [],
 [[input.y:2: invalid value: @1
+]])
+
+AT_CLEANUP
+
+
+## -------------- ##
+## Type clashes.  ##
+## -------------- ##
+
+AT_SETUP([Type clashes])
+
+AT_DATA([input.y],
+[[%token foo
+%type <bar> exp
+%%
+exp: foo {} foo
+   | foo
+   | /* Empty. */
+   ;
+]])
+
+AT_CHECK([bison input.y], [1], [],
+[[input.y:5: type clash (`bar' `') on default action
+input.y:6: type clash (`bar' `') on default action
+input.y:7: empty rule for typed nonterminal, and no action
 ]])

 AT_CLEANUP



reply via email to

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