]> git.saurik.com Git - bison.git/commitdiff
* src/reader.c (grammar_current_rule_check): Also check that $$
authorAkim Demaille <akim@epita.fr>
Tue, 27 Dec 2005 17:50:00 +0000 (17:50 +0000)
committerAkim Demaille <akim@epita.fr>
Tue, 27 Dec 2005 17:50:00 +0000 (17:50 +0000)
is used.
Take the rule to check as argument, hence rename as...
(grammar_rule_check): this.
* src/reader.h, src/reader.c (grammar_rule_begin, grammar_rule_end):
Rename as...
(grammar_rule_begin, grammar_rule_end): these, for consistency.
(grammar_midrule_action, grammar_symbol_append): Now static.
* tests/torture.at (input): Don't rely on the default action
being always performed.
* tests/calc.at: "Set" $$ even when the action is "cut" with
YYERROR or other.
* tests/actions.at (Exotic Dollars): Instead of using unused
values, check that the warning is issued.

ChangeLog
NEWS
src/parse-gram.c
src/parse-gram.h
src/parse-gram.y
src/reader.c
src/reader.h
src/scan-gram.l
tests/actions.at
tests/calc.at
tests/torture.at

index 78f9344fced938ee73c9b94483ecc45c11bff79f..68f33170f572562f5c46f359009ce7505bcfe833 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2005-12-27  Akim Demaille  <akim@epita.fr>
+
+       * src/reader.c (grammar_current_rule_check): Also check that $$
+       is used.
+       Take the rule to check as argument, hence rename as...
+       (grammar_rule_check): this.
+       * src/reader.h, src/reader.c (grammar_rule_begin, grammar_rule_end):
+       Rename as...
+       (grammar_rule_begin, grammar_rule_end): these, for consistency.
+       (grammar_midrule_action, grammar_symbol_append): Now static.
+       * tests/torture.at (input): Don't rely on the default action
+       being always performed.
+       * tests/calc.at: "Set" $$ even when the action is "cut" with
+       YYERROR or other.
+       * tests/actions.at (Exotic Dollars): Instead of using unused
+       values, check that the warning is issued.
+
 2005-12-22  Paul Eggert  <eggert@cs.ucla.edu>
 
        * NEWS: Improve wording for unused-value warnings.
diff --git a/NEWS b/NEWS
index 176ce6f27df09ec78e2954172852b64eeade8674..2b7c1013ba90e9607a28c85f0162bce884e5ac73 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -7,13 +7,13 @@ Changes in version 2.1a:
   Typed right-hand side symbols whose value are not used are reported.
   For instance:
 
-     exp: exp "?" exp ":" exp { $$ = $1 ? $1 : $3; }
+     exp: exp "?" exp ":" exp { $1 ? $1 : $3; }
        | exp "+" exp
        ;
 
-  will trigger a warning about $5 of the first rule, and $3 in the
-  second ($1 is copied to $$ by the default rule).  This example
-  most likely contains two errors, and should be rewritten as:
+  will trigger a warning about $$ and $5 in the first rule, and $3 in
+  the second ($1 is copied to $$ by the default rule).  This example
+  most likely contains three errors, and should be rewritten as:
 
      exp: exp "?" exp ":" exp { $$ = $1 ? $3 : $5; }
        | exp "+" exp         { $$ = $1 + $3; }
@@ -22,7 +22,7 @@ Changes in version 2.1a:
   However, if the original actions were really intended, the warnings
   can be suppressed by letting Bison believe the values are used, e.g.:
 
-     exp: exp "?" exp ":" exp { $$ = $1 ? $1 : $3; (void) $5; }
+     exp: exp "?" exp ":" exp { $1 ? $1 : $3; (void) ($$, $5); }
        | exp "+" exp         { $$ = $1; (void) $3; }
        ;
 
index f508798f104d5a14c346de8b9d93bfc6c7b0277c..ef889573dfe4f5b0d0546e543a274bb12564f69d 100644 (file)
 
 
 /* Copy the first part of user declarations.  */
-#line 1 "parse-gram.y"
+#line 1 "../../src/parse-gram.y"
 /* Bison Grammar Parser                             -*- C -*-
 
    Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
@@ -253,7 +253,7 @@ static int current_prec = 0;
 #endif
 
 #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-#line 82 "parse-gram.y"
+#line 82 "../../src/parse-gram.y"
 typedef union YYSTYPE {
   symbol *symbol;
   symbol_list *list;
@@ -263,7 +263,7 @@ typedef union YYSTYPE {
   uniqstr uniqstr;
 } YYSTYPE;
 /* Line 196 of yacc.c.  */
-#line 267 "parse-gram.c"
+#line 267 "../../src/parse-gram.c"
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 # define YYSTYPE_IS_TRIVIAL 1
@@ -287,7 +287,7 @@ typedef struct YYLTYPE
 
 
 /* Line 219 of yacc.c.  */
-#line 291 "parse-gram.c"
+#line 291 "../../src/parse-gram.c"
 
 /* Define YYMODERN_C if this compiler supports C89 or better.  If
    __STDC__ is defined, the compiler is modern.  IBM xlc 7.0 when run
@@ -923,94 +923,94 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
   switch (yytype)
     {
       case 3: /* "\"string\"" */
-#line 169 "parse-gram.y"
+#line 169 "../../src/parse-gram.y"
         { fprintf (stderr, "\"%s\"", (yyvaluep->chars)); };
-#line 929 "parse-gram.c"
+#line 929 "../../src/parse-gram.c"
         break;
       case 4: /* "\"integer\"" */
-#line 182 "parse-gram.y"
+#line 182 "../../src/parse-gram.y"
         { fprintf (stderr, "%d", (yyvaluep->integer)); };
-#line 934 "parse-gram.c"
+#line 934 "../../src/parse-gram.c"
         break;
       case 8: /* "\"%destructor {...}\"" */
-#line 171 "parse-gram.y"
+#line 171 "../../src/parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 939 "parse-gram.c"
+#line 939 "../../src/parse-gram.c"
         break;
       case 9: /* "\"%printer {...}\"" */
-#line 175 "parse-gram.y"
+#line 175 "../../src/parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 944 "parse-gram.c"
+#line 944 "../../src/parse-gram.c"
         break;
       case 10: /* "\"%union {...}\"" */
-#line 176 "parse-gram.y"
+#line 176 "../../src/parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 949 "parse-gram.c"
+#line 949 "../../src/parse-gram.c"
         break;
       case 26: /* "\"%initial-action {...}\"" */
-#line 172 "parse-gram.y"
+#line 172 "../../src/parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 954 "parse-gram.c"
+#line 954 "../../src/parse-gram.c"
         break;
       case 27: /* "\"%lex-param {...}\"" */
-#line 173 "parse-gram.y"
+#line 173 "../../src/parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 959 "parse-gram.c"
+#line 959 "../../src/parse-gram.c"
         break;
       case 34: /* "\"%parse-param {...}\"" */
-#line 174 "parse-gram.y"
+#line 174 "../../src/parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 964 "parse-gram.c"
+#line 964 "../../src/parse-gram.c"
         break;
       case 42: /* "\"type\"" */
-#line 180 "parse-gram.y"
+#line 180 "../../src/parse-gram.y"
         { fprintf (stderr, "<%s>", (yyvaluep->uniqstr)); };
-#line 969 "parse-gram.c"
+#line 969 "../../src/parse-gram.c"
         break;
       case 46: /* "\"identifier\"" */
-#line 184 "parse-gram.y"
+#line 184 "../../src/parse-gram.y"
         { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
-#line 974 "parse-gram.c"
+#line 974 "../../src/parse-gram.c"
         break;
       case 47: /* "\"identifier:\"" */
-#line 186 "parse-gram.y"
+#line 186 "../../src/parse-gram.y"
         { fprintf (stderr, "%s:", (yyvaluep->symbol)->tag); };
-#line 979 "parse-gram.c"
+#line 979 "../../src/parse-gram.c"
         break;
       case 49: /* "\"%{...%}\"" */
-#line 178 "parse-gram.y"
+#line 178 "../../src/parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 984 "parse-gram.c"
+#line 984 "../../src/parse-gram.c"
         break;
       case 50: /* "\"epilogue\"" */
-#line 178 "parse-gram.y"
+#line 178 "../../src/parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 989 "parse-gram.c"
+#line 989 "../../src/parse-gram.c"
         break;
       case 51: /* "\"{...}\"" */
-#line 177 "parse-gram.y"
+#line 177 "../../src/parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 994 "parse-gram.c"
+#line 994 "../../src/parse-gram.c"
         break;
       case 72: /* "symbol" */
-#line 184 "parse-gram.y"
+#line 184 "../../src/parse-gram.y"
         { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
-#line 999 "parse-gram.c"
+#line 999 "../../src/parse-gram.c"
         break;
       case 73: /* "action" */
-#line 177 "parse-gram.y"
+#line 177 "../../src/parse-gram.y"
         { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
-#line 1004 "parse-gram.c"
+#line 1004 "../../src/parse-gram.c"
         break;
       case 74: /* "string_as_id" */
-#line 184 "parse-gram.y"
+#line 184 "../../src/parse-gram.y"
         { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
-#line 1009 "parse-gram.c"
+#line 1009 "../../src/parse-gram.c"
         break;
       case 75: /* "string_content" */
-#line 169 "parse-gram.y"
+#line 169 "../../src/parse-gram.y"
         { fprintf (stderr, "\"%s\"", (yyvaluep->chars)); };
-#line 1014 "parse-gram.c"
+#line 1014 "../../src/parse-gram.c"
         break;
       default:
         break;
@@ -1509,7 +1509,7 @@ YYLTYPE yylloc;
 
 
   /* User initialization code.  */
-#line 72 "parse-gram.y"
+#line 72 "../../src/parse-gram.y"
 {
   /* Bison's grammar can initial empty locations, hence a default
      location is needed. */
@@ -1518,7 +1518,7 @@ YYLTYPE yylloc;
   yylloc.start.column = yylloc.end.column = 0;
 }
 /* Line 1087 of yacc.c.  */
-#line 1522 "parse-gram.c"
+#line 1522 "../../src/parse-gram.c"
   yylsp[0] = yylloc;
   goto yysetstate;
 
@@ -1703,52 +1703,52 @@ yyreduce:
   switch (yyn)
     {
         case 6:
-#line 207 "parse-gram.y"
+#line 207 "../../src/parse-gram.y"
     { prologue_augment ((yyvsp[(1) - (1)].chars), (yylsp[(1) - (1)])); }
     break;
 
   case 7:
-#line 208 "parse-gram.y"
+#line 208 "../../src/parse-gram.y"
     { debug_flag = true; }
     break;
 
   case 8:
-#line 209 "parse-gram.y"
+#line 209 "../../src/parse-gram.y"
     { muscle_insert ((yyvsp[(2) - (2)].chars), "1"); }
     break;
 
   case 9:
-#line 210 "parse-gram.y"
+#line 210 "../../src/parse-gram.y"
     { muscle_insert ((yyvsp[(2) - (3)].chars), (yyvsp[(3) - (3)].chars)); }
     break;
 
   case 10:
-#line 211 "parse-gram.y"
+#line 211 "../../src/parse-gram.y"
     { defines_flag = true; }
     break;
 
   case 11:
-#line 212 "parse-gram.y"
+#line 212 "../../src/parse-gram.y"
     { error_verbose = true; }
     break;
 
   case 12:
-#line 213 "parse-gram.y"
+#line 213 "../../src/parse-gram.y"
     { expected_sr_conflicts = (yyvsp[(2) - (2)].integer); }
     break;
 
   case 13:
-#line 214 "parse-gram.y"
+#line 214 "../../src/parse-gram.y"
     { expected_rr_conflicts = (yyvsp[(2) - (2)].integer); }
     break;
 
   case 14:
-#line 215 "parse-gram.y"
+#line 215 "../../src/parse-gram.y"
     { spec_file_prefix = (yyvsp[(3) - (3)].chars); }
     break;
 
   case 15:
-#line 217 "parse-gram.y"
+#line 217 "../../src/parse-gram.y"
     {
     nondeterministic_parser = true;
     glr_parser = true;
@@ -1756,86 +1756,86 @@ yyreduce:
     break;
 
   case 16:
-#line 222 "parse-gram.y"
+#line 222 "../../src/parse-gram.y"
     {
     muscle_code_grow ("initial_action", (yyvsp[(1) - (1)].chars), (yylsp[(1) - (1)]));
   }
     break;
 
   case 17:
-#line 225 "parse-gram.y"
+#line 225 "../../src/parse-gram.y"
     { add_param ("lex_param", (yyvsp[(1) - (1)].chars), (yylsp[(1) - (1)])); }
     break;
 
   case 18:
-#line 226 "parse-gram.y"
+#line 226 "../../src/parse-gram.y"
     { locations_flag = true; }
     break;
 
   case 19:
-#line 227 "parse-gram.y"
+#line 227 "../../src/parse-gram.y"
     { spec_name_prefix = (yyvsp[(3) - (3)].chars); }
     break;
 
   case 20:
-#line 228 "parse-gram.y"
+#line 228 "../../src/parse-gram.y"
     { no_lines_flag = true; }
     break;
 
   case 21:
-#line 229 "parse-gram.y"
+#line 229 "../../src/parse-gram.y"
     { nondeterministic_parser = true; }
     break;
 
   case 22:
-#line 230 "parse-gram.y"
+#line 230 "../../src/parse-gram.y"
     { spec_outfile = (yyvsp[(3) - (3)].chars); }
     break;
 
   case 23:
-#line 231 "parse-gram.y"
+#line 231 "../../src/parse-gram.y"
     { add_param ("parse_param", (yyvsp[(1) - (1)].chars), (yylsp[(1) - (1)])); }
     break;
 
   case 24:
-#line 232 "parse-gram.y"
+#line 232 "../../src/parse-gram.y"
     { pure_parser = true; }
     break;
 
   case 25:
-#line 233 "parse-gram.y"
+#line 233 "../../src/parse-gram.y"
     { version_check (&(yylsp[(2) - (2)]), (yyvsp[(2) - (2)].chars)); }
     break;
 
   case 26:
-#line 234 "parse-gram.y"
+#line 234 "../../src/parse-gram.y"
     { skeleton = (yyvsp[(2) - (2)].chars); }
     break;
 
   case 27:
-#line 235 "parse-gram.y"
+#line 235 "../../src/parse-gram.y"
     { token_table_flag = true; }
     break;
 
   case 28:
-#line 236 "parse-gram.y"
+#line 236 "../../src/parse-gram.y"
     { report_flag = report_states; }
     break;
 
   case 29:
-#line 237 "parse-gram.y"
+#line 237 "../../src/parse-gram.y"
     { yacc_flag = true; }
     break;
 
   case 33:
-#line 245 "parse-gram.y"
+#line 245 "../../src/parse-gram.y"
     {
       grammar_start_symbol_set ((yyvsp[(2) - (2)].symbol), (yylsp[(2) - (2)]));
     }
     break;
 
   case 34:
-#line 249 "parse-gram.y"
+#line 249 "../../src/parse-gram.y"
     {
       typed = true;
       MUSCLE_INSERT_INT ("stype_line", (yylsp[(1) - (1)]).start.line);
@@ -1844,7 +1844,7 @@ yyreduce:
     break;
 
   case 35:
-#line 255 "parse-gram.y"
+#line 255 "../../src/parse-gram.y"
     {
       symbol_list *list;
       for (list = (yyvsp[(2) - (2)].list); list; list = list->next)
@@ -1854,7 +1854,7 @@ yyreduce:
     break;
 
   case 36:
-#line 262 "parse-gram.y"
+#line 262 "../../src/parse-gram.y"
     {
       symbol_list *list;
       for (list = (yyvsp[(2) - (2)].list); list; list = list->next)
@@ -1864,26 +1864,26 @@ yyreduce:
     break;
 
   case 37:
-#line 269 "parse-gram.y"
+#line 269 "../../src/parse-gram.y"
     {
       default_prec = true;
     }
     break;
 
   case 38:
-#line 273 "parse-gram.y"
+#line 273 "../../src/parse-gram.y"
     {
       default_prec = false;
     }
     break;
 
   case 39:
-#line 279 "parse-gram.y"
+#line 279 "../../src/parse-gram.y"
     { current_class = nterm_sym; }
     break;
 
   case 40:
-#line 280 "parse-gram.y"
+#line 280 "../../src/parse-gram.y"
     {
       current_class = unknown_sym;
       current_type = NULL;
@@ -1891,12 +1891,12 @@ yyreduce:
     break;
 
   case 41:
-#line 284 "parse-gram.y"
+#line 284 "../../src/parse-gram.y"
     { current_class = token_sym; }
     break;
 
   case 42:
-#line 285 "parse-gram.y"
+#line 285 "../../src/parse-gram.y"
     {
       current_class = unknown_sym;
       current_type = NULL;
@@ -1904,7 +1904,7 @@ yyreduce:
     break;
 
   case 43:
-#line 290 "parse-gram.y"
+#line 290 "../../src/parse-gram.y"
     {
       symbol_list *list;
       for (list = (yyvsp[(3) - (3)].list); list; list = list->next)
@@ -1914,7 +1914,7 @@ yyreduce:
     break;
 
   case 44:
-#line 300 "parse-gram.y"
+#line 300 "../../src/parse-gram.y"
     {
       symbol_list *list;
       ++current_prec;
@@ -1929,49 +1929,49 @@ yyreduce:
     break;
 
   case 45:
-#line 314 "parse-gram.y"
+#line 314 "../../src/parse-gram.y"
     { (yyval.assoc) = left_assoc; }
     break;
 
   case 46:
-#line 315 "parse-gram.y"
+#line 315 "../../src/parse-gram.y"
     { (yyval.assoc) = right_assoc; }
     break;
 
   case 47:
-#line 316 "parse-gram.y"
+#line 316 "../../src/parse-gram.y"
     { (yyval.assoc) = non_assoc; }
     break;
 
   case 48:
-#line 320 "parse-gram.y"
+#line 320 "../../src/parse-gram.y"
     { current_type = NULL; }
     break;
 
   case 49:
-#line 321 "parse-gram.y"
+#line 321 "../../src/parse-gram.y"
     { current_type = (yyvsp[(1) - (1)].uniqstr); }
     break;
 
   case 50:
-#line 327 "parse-gram.y"
+#line 327 "../../src/parse-gram.y"
     { (yyval.list) = symbol_list_new ((yyvsp[(1) - (1)].symbol), (yylsp[(1) - (1)])); }
     break;
 
   case 51:
-#line 328 "parse-gram.y"
+#line 328 "../../src/parse-gram.y"
     { (yyval.list) = symbol_list_prepend ((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].symbol), (yylsp[(2) - (2)])); }
     break;
 
   case 52:
-#line 334 "parse-gram.y"
+#line 334 "../../src/parse-gram.y"
     {
        current_type = (yyvsp[(1) - (1)].uniqstr);
      }
     break;
 
   case 53:
-#line 338 "parse-gram.y"
+#line 338 "../../src/parse-gram.y"
     {
        symbol_class_set ((yyvsp[(1) - (1)].symbol), current_class, (yylsp[(1) - (1)]));
        symbol_type_set ((yyvsp[(1) - (1)].symbol), current_type, (yylsp[(1) - (1)]));
@@ -1979,7 +1979,7 @@ yyreduce:
     break;
 
   case 54:
-#line 343 "parse-gram.y"
+#line 343 "../../src/parse-gram.y"
     {
       symbol_class_set ((yyvsp[(1) - (2)].symbol), current_class, (yylsp[(1) - (2)]));
       symbol_type_set ((yyvsp[(1) - (2)].symbol), current_type, (yylsp[(1) - (2)]));
@@ -1988,7 +1988,7 @@ yyreduce:
     break;
 
   case 55:
-#line 349 "parse-gram.y"
+#line 349 "../../src/parse-gram.y"
     {
       symbol_class_set ((yyvsp[(1) - (2)].symbol), current_class, (yylsp[(1) - (2)]));
       symbol_type_set ((yyvsp[(1) - (2)].symbol), current_type, (yylsp[(1) - (2)]));
@@ -1997,7 +1997,7 @@ yyreduce:
     break;
 
   case 56:
-#line 355 "parse-gram.y"
+#line 355 "../../src/parse-gram.y"
     {
       symbol_class_set ((yyvsp[(1) - (3)].symbol), current_class, (yylsp[(1) - (3)]));
       symbol_type_set ((yyvsp[(1) - (3)].symbol), current_type, (yylsp[(1) - (3)]));
@@ -2007,7 +2007,7 @@ yyreduce:
     break;
 
   case 62:
-#line 384 "parse-gram.y"
+#line 384 "../../src/parse-gram.y"
     {
       if (yacc_flag)
        complain_at ((yyloc), _("POSIX forbids declarations in the grammar"));
@@ -2015,74 +2015,74 @@ yyreduce:
     break;
 
   case 63:
-#line 389 "parse-gram.y"
+#line 389 "../../src/parse-gram.y"
     {
       yyerrok;
     }
     break;
 
   case 64:
-#line 395 "parse-gram.y"
+#line 395 "../../src/parse-gram.y"
     { current_lhs = (yyvsp[(1) - (1)].symbol); current_lhs_location = (yylsp[(1) - (1)]); }
     break;
 
   case 66:
-#line 399 "parse-gram.y"
-    { grammar_rule_end ((yylsp[(1) - (1)])); }
+#line 399 "../../src/parse-gram.y"
+    { grammar_current_rule_end ((yylsp[(1) - (1)])); }
     break;
 
   case 67:
-#line 400 "parse-gram.y"
-    { grammar_rule_end ((yylsp[(3) - (3)])); }
+#line 400 "../../src/parse-gram.y"
+    { grammar_current_rule_end ((yylsp[(3) - (3)])); }
     break;
 
   case 69:
-#line 406 "parse-gram.y"
-    { grammar_rule_begin (current_lhs, current_lhs_location); }
+#line 406 "../../src/parse-gram.y"
+    { grammar_current_rule_begin (current_lhs, current_lhs_location); }
     break;
 
   case 70:
-#line 408 "parse-gram.y"
+#line 408 "../../src/parse-gram.y"
     { grammar_current_rule_symbol_append ((yyvsp[(2) - (2)].symbol), (yylsp[(2) - (2)])); }
     break;
 
   case 71:
-#line 410 "parse-gram.y"
+#line 410 "../../src/parse-gram.y"
     { grammar_current_rule_action_append ((yyvsp[(2) - (2)].chars), (yylsp[(2) - (2)])); }
     break;
 
   case 72:
-#line 412 "parse-gram.y"
+#line 412 "../../src/parse-gram.y"
     { grammar_current_rule_prec_set ((yyvsp[(3) - (3)].symbol), (yylsp[(3) - (3)])); }
     break;
 
   case 73:
-#line 414 "parse-gram.y"
+#line 414 "../../src/parse-gram.y"
     { grammar_current_rule_dprec_set ((yyvsp[(3) - (3)].integer), (yylsp[(3) - (3)])); }
     break;
 
   case 74:
-#line 416 "parse-gram.y"
+#line 416 "../../src/parse-gram.y"
     { grammar_current_rule_merge_set ((yyvsp[(3) - (3)].uniqstr), (yylsp[(3) - (3)])); }
     break;
 
   case 75:
-#line 420 "parse-gram.y"
+#line 420 "../../src/parse-gram.y"
     { (yyval.symbol) = (yyvsp[(1) - (1)].symbol); }
     break;
 
   case 76:
-#line 421 "parse-gram.y"
+#line 421 "../../src/parse-gram.y"
     { (yyval.symbol) = (yyvsp[(1) - (1)].symbol); }
     break;
 
   case 77:
-#line 426 "parse-gram.y"
+#line 426 "../../src/parse-gram.y"
     { (yyval.chars) = (yyvsp[(1) - (1)].chars); }
     break;
 
   case 78:
-#line 432 "parse-gram.y"
+#line 432 "../../src/parse-gram.y"
     {
       (yyval.symbol) = symbol_get (quotearg_style (c_quoting_style, (yyvsp[(1) - (1)].chars)), (yylsp[(1) - (1)]));
       symbol_class_set ((yyval.symbol), token_sym, (yylsp[(1) - (1)]));
@@ -2090,12 +2090,12 @@ yyreduce:
     break;
 
   case 79:
-#line 441 "parse-gram.y"
+#line 441 "../../src/parse-gram.y"
     { (yyval.chars) = (yyvsp[(1) - (1)].chars); }
     break;
 
   case 81:
-#line 448 "parse-gram.y"
+#line 448 "../../src/parse-gram.y"
     {
       muscle_code_grow ("epilogue", (yyvsp[(2) - (2)].chars), (yylsp[(2) - (2)]));
       scanner_last_string_free ();
@@ -2104,7 +2104,7 @@ yyreduce:
 
 
 /* Line 1276 of yacc.c.  */
-#line 2108 "parse-gram.c"
+#line 2108 "../../src/parse-gram.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -2323,7 +2323,7 @@ yyreturn:
 }
 
 
-#line 454 "parse-gram.y"
+#line 454 "../../src/parse-gram.y"
 
 
 
index 4b6f7766e839a17c63bb1dd1d554ef6eaa2e3477..33ebbdb130343fae4ef7259d29a707c0757c0473 100644 (file)
 
 
 #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-#line 82 "parse-gram.y"
+#line 82 "../../src/parse-gram.y"
 typedef union YYSTYPE {
   symbol *symbol;
   symbol_list *list;
@@ -147,7 +147,7 @@ typedef union YYSTYPE {
   uniqstr uniqstr;
 } YYSTYPE;
 /* Line 1541 of yacc.c.  */
-#line 151 "parse-gram.h"
+#line 151 "../../src/parse-gram.h"
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 # define YYSTYPE_IS_TRIVIAL 1
index d4f2731e6cea38f41b8e85ec7f03f0d110f5d4b2..db63e5082d863784d2fc6d2a77237a98cc2929ac 100644 (file)
@@ -396,14 +396,14 @@ rules:
 ;
 
 rhses.1:
-  rhs                { grammar_rule_end (@1); }
-| rhses.1 "|" rhs    { grammar_rule_end (@3); }
+  rhs                { grammar_current_rule_end (@1); }
+| rhses.1 "|" rhs    { grammar_current_rule_end (@3); }
 | rhses.1 ";"
 ;
 
 rhs:
   /* Nothing.  */
-    { grammar_rule_begin (current_lhs, current_lhs_location); }
+    { grammar_current_rule_begin (current_lhs, current_lhs_location); }
 | rhs symbol
     { grammar_current_rule_symbol_append ($2, @2); }
 | rhs action
index b55b0fa98626b87c1cce6d6f7c663ab2c526efdd..f02e132f635d8414efbbf866b58048310884c00b 100644 (file)
@@ -36,6 +36,9 @@
 #include "symlist.h"
 #include "symtab.h"
 
+static void grammar_midrule_action (void);
+static void grammar_symbol_append (symbol *sym, location loc);
+
 static symbol_list *grammar = NULL;
 static bool start_flag = false;
 merger_list *merge_functions;
@@ -153,7 +156,7 @@ free_merger_functions (void)
 static symbol_list *grammar_end = NULL;
 
 /* Append SYM to the grammar.  */
-void
+static void
 grammar_symbol_append (symbol *sym, location loc)
 {
   symbol_list *p = symbol_list_new (sym, loc);
@@ -164,6 +167,11 @@ grammar_symbol_append (symbol *sym, location loc)
     grammar = p;
 
   grammar_end = p;
+
+  /* SYM = 0 stands for an end of rule, it is not an actual
+     part of it.  */
+  if (sym)
+    ++nritems;
 }
 
 /* The rule currently being defined, and the previous rule.
@@ -178,7 +186,7 @@ static symbol_list *previous_rule_end = NULL;
 `----------------------------------------------*/
 
 void
-grammar_rule_begin (symbol *lhs, location loc)
+grammar_current_rule_begin (symbol *lhs, location loc)
 {
   if (!start_flag)
     {
@@ -189,8 +197,6 @@ grammar_rule_begin (symbol *lhs, location loc)
 
   /* Start a new rule and record its lhs.  */
   ++nrules;
-  ++nritems;
-
   previous_rule_end = grammar_end;
   grammar_symbol_append (lhs, loc);
   current_rule = grammar_end;
@@ -207,17 +213,14 @@ grammar_rule_begin (symbol *lhs, location loc)
 }
 
 
-/*------------------------------------------------------------------.
-| Check that the last rule (CURRENT_RULE) is properly defined.  For |
-| instance, there should be no type clash on the default action.    |
-`------------------------------------------------------------------*/
+/*----------------------------------------------------------------.
+| Check that the rule R is properly defined.  For instance, there |
+| should be no type clash on the default action.                  |
+`----------------------------------------------------------------*/
 
 static void
-grammar_current_rule_check (void)
+grammar_rule_check (const symbol_list *r)
 {
-  symbol *lhs = current_rule->sym;
-  char const *lhs_type = lhs->type_name;
-
   /* Type check.
 
      If there is an action, then there is nothing we can do: the user
@@ -225,36 +228,40 @@ grammar_current_rule_check (void)
 
      Don't worry about the default action if $$ is untyped, since $$'s
      value can't be used.  */
-  if (!current_rule->action && lhs_type)
+  if (!r->action && r->sym->type_name)
     {
-      symbol *first_rhs = current_rule->next->sym;
+      symbol *first_rhs = r->next->sym;
       /* If $$ is being set in default way, report if any type mismatch.  */
       if (first_rhs)
        {
+         char const *lhs_type = r->sym->type_name;
          const char *rhs_type =
            first_rhs->type_name ? first_rhs->type_name : "";
          if (!UNIQSTR_EQ (lhs_type, rhs_type))
-           warn_at (current_rule->location,
+           warn_at (r->location,
                     _("type clash on default action: <%s> != <%s>"),
                     lhs_type, rhs_type);
        }
       /* Warn if there is no default for $$ but we need one.  */
       else
-       warn_at (current_rule->location,
+       warn_at (r->location,
                 _("empty rule for typed nonterminal, and no action"));
     }
-
-  /* Check that all the symbol values are used. */
-  if (typed)
-    {
-      symbol_list *l = current_rule;
-      int n = 1;
-      for (l = current_rule->next; l && l->sym; l = l->next, ++n)
-       /* The default action `uses' $1. */
-       if (! (!current_rule->action && n == 1)
-           && l->sym->type_name && !l->used)
-         warn_at (current_rule->location, _("unused value: $%d"), n);
-    }
+  
+  /* Check that typed symbol values are used.  */
+  {
+    symbol_list *l = r;
+    int n = 0;
+    for (; l && l->sym; l = l->next, ++n)
+      if (! (l->used
+            || !l->sym->type_name
+            /* The default action, $$ = $1, `uses' both.  */
+            || !r->action && (n == 0 || n == 1)))
+       if (n)
+         warn_at (r->location, _("unused value: $%d"), n);
+       else
+         warn_at (r->location, _("unset value: $$"));
+  }
 }
 
 
@@ -263,12 +270,12 @@ grammar_current_rule_check (void)
 `-------------------------------------*/
 
 void
-grammar_rule_end (location loc)
+grammar_current_rule_end (location loc)
 {
   /* Put an empty link in the list to mark the end of this rule  */
   grammar_symbol_append (NULL, grammar_end->location);
   current_rule->location = loc;
-  grammar_current_rule_check ();
+  grammar_rule_check (current_rule);
 }
 
 
@@ -279,7 +286,7 @@ grammar_rule_end (location loc)
 | rule.                                                              |
 `-------------------------------------------------------------------*/
 
-void
+static void
 grammar_midrule_action (void)
 {
   /* Since the action was written out with this rule's number, we must
@@ -364,7 +371,6 @@ grammar_current_rule_symbol_append (symbol *sym, location loc)
 {
   if (current_rule->action)
     grammar_midrule_action ();
-  ++nritems;
   grammar_symbol_append (sym, loc);
 }
 
index ad1ad819e8c62101a9f6910145befb59ada37d65..3e8a7bd4b4306e389a727a07f0fb6cb0c464c0ab 100644 (file)
@@ -61,14 +61,11 @@ char const *token_name (int);
 /* From reader.c. */
 void grammar_start_symbol_set (symbol *sym, location loc);
 void prologue_augment (const char *prologue, location loc);
-void grammar_symbol_append (symbol *sym, location loc);
-void grammar_rule_begin (symbol *lhs, location loc);
-void grammar_rule_end (location loc);
-void grammar_midrule_action (void);
+void grammar_current_rule_begin (symbol *lhs, location loc);
+void grammar_current_rule_end (location loc);
 void grammar_current_rule_prec_set (symbol *precsym, location loc);
 void grammar_current_rule_dprec_set (int dprec, location loc);
 void grammar_current_rule_merge_set (uniqstr name, location loc);
-
 void grammar_current_rule_symbol_append (symbol *sym, location loc);
 void grammar_current_rule_action_append (const char *action, location loc);
 extern symbol_list *current_rule;
index 471d7b91255cb785028076d5c9ac301b91f97c76..58cda0c9e6bfdbbe86b5350b0db005a2357d95b7 100644 (file)
@@ -815,6 +815,7 @@ handle_action_dollar (char *text, location loc)
        type_name = "";
       obstack_fgrow1 (&obstack_for_string,
                      "]b4_lhs_value([%s])[", type_name);
+      current_rule->used = true;
     }
   else
     {
@@ -837,8 +838,7 @@ handle_action_dollar (char *text, location loc)
          obstack_fgrow3 (&obstack_for_string,
                          "]b4_rhs_value(%d, %d, [%s])[",
                          rule_length, n, type_name);
-         if (typed)
-           symbol_list_n_used_set (current_rule, n, true);
+         symbol_list_n_used_set (current_rule, n, true);
        }
       else
        complain_at (loc, _("integer out of range: %s"), quote (text));
index 33b9a4f7c3dac2727fd4160f63db5df86a04f0e5..bd71bbc8c4af602f86fa5484fc45431eb9fbd6f4 100644 (file)
@@ -30,13 +30,13 @@ AT_SETUP([Mid-rule actions])
 # action.
 
 AT_DATA_GRAMMAR([[input.y]],
-[[%{
+[[%error-verbose
+%debug
+%{
 # include <stdio.h>
 # include <stdlib.h>
   static void yyerror (const char *msg);
   static int yylex (void);
-# define YYDEBUG         1
-# define YYERROR_VERBOSE 1
 %}
 %%
 exp:     { putchar ('0'); }
@@ -91,13 +91,13 @@ AT_CLEANUP
 AT_SETUP([Exotic Dollars])
 
 AT_DATA_GRAMMAR([[input.y]],
-[[%{
+[[%error-verbose
+%debug
+%{
 # include <stdio.h>
 # include <stdlib.h>
   static void yyerror (const char *msg);
   static int yylex (void);
-# define YYDEBUG         1
-# define YYERROR_VERBOSE 1
 # define USE(Var)
 %}
 
@@ -107,13 +107,12 @@ AT_DATA_GRAMMAR([[input.y]],
 };
 
 %type <val> a_1 a_2 a_5
-            sum_of_the_five_previous_values
+            exp sum_of_the_five_previous_values
 
 %%
 exp: a_1 a_2 { $<val>$ = 3; } { $<val>$ = $<val>3 + 1; } a_5
      sum_of_the_five_previous_values
     {
-       USE (($1, $2, $5));
        printf ("%d\n", $6);
     }
 ;
@@ -147,7 +146,11 @@ main (void)
 }
 ]])
 
-AT_CHECK([bison -d -v -o input.c input.y])
+AT_CHECK([bison -d -v -o input.c input.y], 0, [], 
+[input.y:30.6-34.5: warning: unused value: $1
+input.y:30.6-34.5: warning: unused value: $2
+input.y:30.6-34.5: warning: unused value: $5
+])
 AT_COMPILE([input])
 AT_PARSER_CHECK([./input], 0,
 [[15
index 81297bc478ad0b40c743081e72bcbde26725bdc0..65d430cc7516b910b33b4789678e239676fa469a 100644 (file)
@@ -129,15 +129,15 @@ exp:
 | exp '^' exp        { $$ = power ($1, $3); }
 | '(' exp ')'        { $$ = $2;             }
 | '(' error ')'      { $$ = 1111;           }
-| '!'                { YYERROR;             }
-| '-' error          { YYERROR;             }
+| '!'                { $$ = 0; YYERROR;     }
+| '-' error          { $$ = 0; YYERROR;     }
 ;
 %%
-/* The input. */
+/* The input.  */
 static FILE *input;
 
 ]AT_LALR1_CC_IF(
-[/* A C++ error reporting function. */
+[/* A C++ error reporting function.  */
 void
 yy::parser::error (const location& l, const std::string& m)
 {
index b35052fc450d498d6920d852c21ddaa0deca6785..ff373c21486115c6f668525a097ca65ae01bea25 100644 (file)
@@ -50,13 +50,12 @@ my $max = $ARGV[0] || 10;
 
 print <<EOF;
 ]AT_DATA_GRAMMAR_PROLOGUE[
+%error-verbose
+%debug
 %{
 #include <stdio.h>
 #include <stdlib.h>
 
-#define YYERROR_VERBOSE 1
-#define YYDEBUG 1
-
 static int yylex (void);
 static void yyerror (const char *msg);
 %}
@@ -166,24 +165,25 @@ my $max = $ARGV[0] || 10;
 
 print <<EOF;
 ]AT_DATA_GRAMMAR_PROLOGUE[
+%error-verbose
+%debug
 %{
 #include <stdio.h>
 #include <stdlib.h>
 
-#define YYERROR_VERBOSE 1
-#define YYDEBUG 1
-
 static int yylex (void);
 static void yyerror (const char *msg);
 %}
-EOF
 
+%token
+EOF
 for my $size (1 .. $max)
   {
-    print "%token t$size $size \"$size\"\n";
+    print "    t$size $size \"$size\"\n";
   };
 
 print <<EOF;
+
 %%
 EOF
 
@@ -258,7 +258,7 @@ AT_CLEANUP
 
 
 # AT_DATA_LOOK_AHEAD_TOKENS_GRAMMAR(FILE-NAME, SIZE)
-# -------------------------------------------
+# --------------------------------------------------
 # Create FILE-NAME, containing a self checking parser for a grammar
 # requiring SIZE look-ahead tokens.
 m4_define([AT_DATA_LOOK_AHEAD_TOKENS_GRAMMAR],
@@ -270,12 +270,12 @@ use Text::Wrap;
 my $max = $ARGV[0] || 10;
 
 print <<EOF;
+%error-verbose
+%debug
 %{
-#include <stdio.h>
-#include <stdlib.h>
-
-#define YYERROR_VERBOSE 1
-#define YYDEBUG 1
+# include <stdio.h>
+# include <stdlib.h>
+# include <assert.h>
 
 static int yylex (void);
 static void yyerror (const char *msg);
@@ -295,25 +295,26 @@ print
        map { "n$_" } (1 .. $max)),
   "\n";
 
+print "%token\n";
 for my $count (1 .. $max)
   {
-    print "%token t$count $count \"$count\"\n";
+    print "    t$count $count \"$count\"\n";
   };
 
 print <<EOF;
 %%
 input:
-  exp        { if (\@S|@1 != 1) abort (); \$\$ = \@S|@1; }
-| input exp  { if (\@S|@2 != \@S|@1 + 1) abort (); \$\$ = \@S|@2; }
+  exp        { assert (\@S|@1 == 1); \$\$ = \@S|@1; }
+| input exp  { assert (\@S|@2 == \@S|@1 + 1); \$\$ = \@S|@2; }
 ;
 
 exp:
-  n1 "1" { if (\@S|@1 != 1) abort (); }
+  n1 "1" { assert (\@S|@1 == 1); \@S|@\@S|@ = \@S|@1; }
 EOF
 
 for my $count (2 .. $max)
   {
-    print "| n$count \"$count\" { if (\@S|@1 != $count) abort (); }\n";
+    print "| n$count \"$count\" { assert (\@S|@1 == $count); \@S|@\@S|@ = \@S|@1; }\n";
   };
 print ";\n";