]> git.saurik.com Git - bison.git/blobdiff - src/print.c
* src/muscle_tab.c (muscle_m4_output): Must return TRUE for
[bison.git] / src / print.c
index d1df2fd77a49663509ca216b1eefe2d331324b51..cfc047f17e73462752fa58c5e4639b58672c1359 100644 (file)
@@ -105,6 +105,32 @@ print_core (FILE *out, state_t *state)
          for (/* Nothing */; *sp >= 0; ++sp)
            fprintf (out, " %s", escape (symbols[*sp]->tag));
 
+         /* Experimental feature: display the lookaheads. */
+         if (trace_flag && state->nlookaheads)
+           {
+             int j, k;
+             int nlookaheads = 0;
+             /* Look for lookaheads corresponding to this rule. */
+             for (j = 0; j < state->nlookaheads; ++j)
+               for (k = 0; k < ntokens; ++k)
+                 if (bitset_test (LA[state->lookaheadsp + j], k)
+                     && LArule[state->lookaheadsp + j]->number == rule)
+                   nlookaheads++;
+             if (nlookaheads)
+               {
+                 fprintf (out, "  [");
+                 for (j = 0; j < state->nlookaheads; ++j)
+                   for (k = 0; k < ntokens; ++k)
+                     if (bitset_test (LA[state->lookaheadsp + j], k)
+                         && LArule[state->lookaheadsp + j]->number == rule)
+                       fprintf (out, "%s%s",
+                                quotearg_style (escape_quoting_style,
+                                                symbols[k]->tag),
+                                --nlookaheads ? ", " : "");
+                 fprintf (out, "]");
+               }
+           }
+
          fprintf (out, _("   (rule %d)"), rule - 1);
          fputc ('\n', out);
        }
@@ -124,7 +150,7 @@ print_shifts (FILE *out, state_t *state)
     if (!SHIFT_IS_DISABLED (shiftp, i))
       {
        int state1 = shiftp->shifts[i];
-       int symbol = states[state1]->accessing_symbol;
+       token_number_t symbol = states[state1]->accessing_symbol;
        fprintf (out,
                 _("    %-4s\tshift, and go to state %d\n"),
                 escape (symbols[symbol]->tag), state1);
@@ -166,7 +192,7 @@ print_gotos (FILE *out, state_t *state)
        if (!SHIFT_IS_DISABLED (shiftp, i))
          {
            int state1 = shiftp->shifts[i];
-           int symbol = states[state1]->accessing_symbol;
+           token_number_t symbol = states[state1]->accessing_symbol;
            fprintf (out, _("    %-4s\tgo to state %d\n"),
                     escape (symbols[symbol]->tag), state1);
          }
@@ -190,7 +216,7 @@ print_reductions (FILE *out, state_t *state)
   if (state->consistent)
     {
       int rule = redp->rules[0];
-      int symbol = rules[rule].lhs->number;
+      token_number_t symbol = rules[rule].lhs->number;
       fprintf (out, _("    $default\treduce using rule %d (%s)\n\n"),
               rule - 1, escape (symbols[symbol]->tag));
       return;
@@ -360,7 +386,8 @@ do {                                                \
 static void
 print_grammar (FILE *out)
 {
-  int i, j;
+  token_number_t i;
+  int j;
   item_number_t *rule;
   char buffer[90];
   int column = 0;
@@ -368,11 +395,11 @@ print_grammar (FILE *out)
   /* rule # : LHS -> RHS */
   fprintf (out, "%s\n\n", _("Grammar"));
   fprintf (out, "  %s\n", _("Number, Line, Rule"));
-  for (i = 1; i < nrules + 1; i++)
+  for (j = 1; j < nrules + 1; j++)
     {
       fprintf (out, _("  %3d %3d %s ->"),
-              i - 1, rules[i].line, escape (rules[i].lhs->tag));
-      rule = rules[i].rhs;
+              j - 1, rules[j].line, escape (rules[j].lhs->tag));
+      rule = rules[j].rhs;
       if (*rule >= 0)
        while (*rule >= 0)
          fprintf (out, " %s", escape (symbols[*rule++]->tag));
@@ -386,7 +413,7 @@ print_grammar (FILE *out)
   /* TERMINAL (type #) : rule #s terminal is on RHS */
   fprintf (out, "%s\n\n", _("Terminals, with rules where they appear"));
   for (i = 0; i < max_user_token_number + 1; i++)
-    if (token_translations[i] != 2)
+    if (token_translations[i] != undeftoken->number)
       {
        buffer[0] = 0;
        column = strlen (escape (symbols[token_translations[i]]->tag));
@@ -396,7 +423,7 @@ print_grammar (FILE *out)
 
        for (j = 1; j < nrules + 1; j++)
          for (rule = rules[j].rhs; *rule >= 0; rule++)
-           if (*rule == token_translations[i])
+           if (item_number_as_token_number (*rule) == token_translations[i])
              {
                END_TEST (65);
                sprintf (buffer + strlen (buffer), " %d", j - 1);
@@ -417,7 +444,7 @@ print_grammar (FILE *out)
          if (rules[j].lhs->number == i)
            left_count++;
          for (rule = rules[j].rhs; *rule >= 0; rule++)
-           if (*rule == i)
+           if (item_number_as_token_number (*rule) == i)
              {
                right_count++;
                break;
@@ -452,7 +479,7 @@ print_grammar (FILE *out)
          for (j = 1; j < nrules + 1; j++)
            {
              for (rule = rules[j].rhs; *rule >= 0; rule++)
-               if (*rule == i)
+               if (item_number_as_token_number (*rule) == i)
                  {
                    END_TEST (65);
                    sprintf (buffer + strlen (buffer), " %d", j - 1);