]> git.saurik.com Git - bison.git/blobdiff - src/reader.c
tests: check token numbers.
[bison.git] / src / reader.c
index 24da9b74bbefd236cc185aeacc57a9f588da399f..f20d3ca0fb610cc40fa58846b6524761f153d3b3 100644 (file)
@@ -1,24 +1,22 @@
 /* Input parser for Bison
 
    Copyright (C) 1984, 1986, 1989, 1992, 1998, 2000, 2001, 2002, 2003,
-   2005, 2006, 2007 Free Software Foundation, Inc.
+   2005, 2006, 2007, 2009 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
-   Bison is free software; you can redistribute it and/or modify
+   This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
 
-   Bison is distributed in the hope that it will be useful,
+   This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include <config.h>
 #include "system.h"
@@ -30,7 +28,7 @@
 #include "files.h"
 #include "getargs.h"
 #include "gram.h"
-#include "muscle_tab.h"
+#include "muscle-tab.h"
 #include "reader.h"
 #include "symlist.h"
 #include "symtab.h"
@@ -444,20 +442,6 @@ packgram (void)
 
   rules = xnmalloc (nrules, sizeof *rules);
 
-  /* Before invoking grammar_rule_check on any rule, make sure all actions have
-     already been scanned in order to set `used' flags.  Otherwise, checking
-     that a midrule's $$ should be set will not always work properly because
-     the check must forward-reference the midrule's parent rule.  For the same
-     reason, all the `used' flags must be set before checking whether to remove
-     `$' from any midrule symbol name.  */
-  while (p)
-    {
-      code_props_translate_code (&p->action_props);
-      if (p)
-       p = p->next;
-    }
-
-  p = grammar;
   while (p)
     {
       int rule_length = 0;
@@ -571,6 +555,31 @@ reader (void)
   gram_scanner_initialize ();
   gram_parse ();
 
+  /* Set front-end %define variable defaults.  */
+  muscle_percent_define_default ("lr.keep-unreachable-states", "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");
+    if (0 != strcmp (lr_type, "canonical LR"))
+      muscle_percent_define_default ("lr.default-reductions", "all");
+    else
+      muscle_percent_define_default ("lr.default-reductions", "accepting");
+    free (lr_type);
+  }
+
+  /* Check front-end %define variables.  */
+  {
+    static char const * const values[] = {
+      "lr.type", "LALR", "IELR", "canonical LR", NULL,
+      "lr.default-reductions", "all", "consistent", "accepting", NULL,
+      NULL
+    };
+    muscle_percent_define_check_values (values);
+  }
+
   if (! complaint_issued)
     check_and_convert_grammar ();
 
@@ -643,6 +652,23 @@ check_and_convert_grammar (void)
      token symbols into FDEFINES if requested.  */
   symbols_pack ();
 
+  /* Scan rule actions after invoking symbol_check_alias_consistency (in
+     symbols_pack above) so that token types are set correctly before the rule
+     action type checking.
+
+     Before invoking grammar_rule_check (in packgram below) on any rule, make
+     sure all actions have already been scanned in order to set `used' flags.
+     Otherwise, checking that a midrule's $$ should be set will not always work
+     properly because the check must forward-reference the midrule's parent
+     rule.  For the same reason, all the `used' flags must be set before
+     checking whether to remove `$' from any midrule symbol name (also in
+     packgram).  */
+  {
+    symbol_list *sym;
+    for (sym = grammar; sym; sym = sym->next)
+      code_props_translate_code (&sym->action_props);
+  }
+
   /* Convert the grammar into the format described in gram.h.  */
   packgram ();