]> git.saurik.com Git - bison.git/blobdiff - src/gram.c
* src/gram.h (item_number_t): New, the type of item numbers in
[bison.git] / src / gram.c
index a67bf2e246ad36d6650624b3aa9802bc3ba672d7..d13da8176d40f290705f54c49034c358247d962c 100644 (file)
@@ -1,5 +1,5 @@
 /* Allocate input grammar variables for bison,
 /* Allocate input grammar variables for bison,
-   Copyright 1984, 1986, 1989, 2001 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1986, 1989, 2001, 2002 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 
 
 #include "system.h"
 
 
 #include "system.h"
+#include "quotearg.h"
 #include "gram.h"
 #include "symtab.h"
 #include "reader.h"
 
 /* comments for these variables are in gram.h  */
 
 #include "gram.h"
 #include "symtab.h"
 #include "reader.h"
 
 /* comments for these variables are in gram.h  */
 
-int nitems;
-int nrules;
-int nsyms;
-int ntokens;
-int nvars;
+item_number_t *ritem = NULL;
+int nritems = 0;
 
 
-short *ritem = NULL;
-int nritems;
+rule_t *rules = NULL;
+int nrules = 0;
 
 
-rule_t *rule_table = NULL;
+symbol_t **symbols = NULL;
+int nsyms = 0;
+int ntokens = 1;
+int nvars = 0;
 
 
-struct bucket **symbols = NULL;
-short *token_translations = NULL;
+token_number_t *token_translations = NULL;
 
 
-int start_symbol;
+int start_symbol = 0;
 
 
-int max_user_token_number;
+int max_user_token_number = 256;
 
 
-int semantic_parser;
+int semantic_parser = 0;
 
 
-int pure_parser;
+int pure_parser = 0;
 
 
-int error_token_number;
+int error_token_number = 0;
+
+
+/*--------------------------------------.
+| Return the number of symbols in RHS.  |
+`--------------------------------------*/
+
+int
+rule_rhs_length (rule_t *rule)
+{
+  int res = 0;
+  item_number_t *rhsp;
+  for (rhsp = rule->rhs; *rhsp >= 0; ++rhsp)
+    ++res;
+  return res;
+}
 
 
 /*------------------------.
 
 
 /*------------------------.
@@ -62,7 +77,8 @@ ritem_print (FILE *out)
   fputs ("RITEM\n", out);
   for (i = 0; i < nritems; ++i)
     if (ritem[i] >= 0)
   fputs ("RITEM\n", out);
   for (i = 0; i < nritems; ++i)
     if (ritem[i] >= 0)
-      fprintf (out, "  %s", symbols[ritem[i]]->tag);
+      fprintf (out, "  %s", quotearg_style (escape_quoting_style,
+                                           symbols[ritem[i]]->tag));
     else
       fprintf (out, "  (rule %d)\n", -ritem[i] - 1);
   fputs ("\n\n", out);
     else
       fprintf (out, "  (rule %d)\n", -ritem[i] - 1);
   fputs ("\n\n", out);
@@ -76,23 +92,15 @@ ritem_print (FILE *out)
 size_t
 ritem_longest_rhs (void)
 {
 size_t
 ritem_longest_rhs (void)
 {
-  int length;
-  int max;
+  int max = 0;
   int i;
 
   int i;
 
-  length = 0;
-  max = 0;
-  for (i = 0; i < nritems; ++i)
-    if (ritem[i] >= 0)
-      {
-       length++;
-      }
-    else
-      {
-       if (length > max)
-         max = length;
-       length = 0;
-      }
+  for (i = 1; i < nrules + 1; ++i)
+    {
+      int length = rule_rhs_length (&rules[i]);
+      if (length > max)
+       max = length;
+    }
 
   return max;
 }
 
   return max;
 }