[BACK]Return to verbose.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / yacc

Diff for /src/usr.bin/yacc/verbose.c between version 1.11 and 1.12

version 1.11, 2014/01/08 21:40:25 version 1.12, 2014/03/13 00:56:39
Line 1 
Line 1 
 /*      $OpenBSD$       */  /* $OpenBSD$     */
 /*      $NetBSD: verbose.c,v 1.4 1996/03/19 03:21:50 jtc Exp $  */  /* $NetBSD: verbose.c,v 1.4 1996/03/19 03:21:50 jtc Exp $        */
   
 /*  /*
  * Copyright (c) 1989 The Regents of the University of California.   * Copyright (c) 1989 The Regents of the University of California.
Line 51 
Line 51 
 void  void
 verbose(void)  verbose(void)
 {  {
     int i;          int i;
   
     if (!vflag) return;          if (!vflag)
                   return;
   
     null_rules = (short *) malloc(nrules*sizeof(short));          null_rules = malloc(nrules * sizeof(short));
     if (null_rules == 0) no_space();          if (null_rules == NULL)
     fprintf(verbose_file, "\f\n");                  no_space();
     for (i = 0; i < nstates; i++)          fprintf(verbose_file, "\f\n");
         print_state(i);          for (i = 0; i < nstates; i++)
     free(null_rules);                  print_state(i);
           free(null_rules);
   
     if (nunused)          if (nunused)
         log_unused();                  log_unused();
     if (SRtotal || RRtotal)          if (SRtotal || RRtotal)
         log_conflicts();                  log_conflicts();
   
     fprintf(verbose_file, "\n\n%d terminals, %d nonterminals\n", ntokens,          fprintf(verbose_file, "\n\n%d terminals, %d nonterminals\n", ntokens,
             nvars);              nvars);
     fprintf(verbose_file, "%d grammar rules, %d states\n", nrules - 2, nstates);          fprintf(verbose_file, "%d grammar rules, %d states\n", nrules - 2,
               nstates);
 }  }
   
   
 void  void
 log_unused(void)  log_unused(void)
 {  {
     int i;          int i;
     short *p;          short *p;
   
     fprintf(verbose_file, "\n\nRules never reduced:\n");          fprintf(verbose_file, "\n\nRules never reduced:\n");
     for (i = 3; i < nrules; ++i)          for (i = 3; i < nrules; ++i) {
     {                  if (!rules_used[i]) {
         if (!rules_used[i])                          fprintf(verbose_file, "\t%s :", symbol_name[rlhs[i]]);
         {                          for (p = ritem + rrhs[i]; *p >= 0; ++p)
             fprintf(verbose_file, "\t%s :", symbol_name[rlhs[i]]);                                  fprintf(verbose_file, " %s", symbol_name[*p]);
             for (p = ritem + rrhs[i]; *p >= 0; ++p)                          fprintf(verbose_file, "  (%d)\n", i - 2);
                 fprintf(verbose_file, " %s", symbol_name[*p]);                  }
             fprintf(verbose_file, "  (%d)\n", i - 2);  
         }          }
     }  
 }  }
   
   
 void  void
 log_conflicts(void)  log_conflicts(void)
 {  {
     int i;          int i;
   
     fprintf(verbose_file, "\n\n");          fprintf(verbose_file, "\n\n");
     for (i = 0; i < nstates; i++)          for (i = 0; i < nstates; i++) {
     {                  if (SRconflicts[i] || RRconflicts[i]) {
         if (SRconflicts[i] || RRconflicts[i])                          fprintf(verbose_file, "State %d contains ", i);
         {                          if (SRconflicts[i] == 1)
             fprintf(verbose_file, "State %d contains ", i);                                  fprintf(verbose_file, "1 shift/reduce conflict");
             if (SRconflicts[i] == 1)                          else if (SRconflicts[i] > 1)
                 fprintf(verbose_file, "1 shift/reduce conflict");                                  fprintf(verbose_file, "%d shift/reduce conflicts",
             else if (SRconflicts[i] > 1)                                      SRconflicts[i]);
                 fprintf(verbose_file, "%d shift/reduce conflicts",                          if (SRconflicts[i] && RRconflicts[i])
                         SRconflicts[i]);                                  fprintf(verbose_file, ", ");
             if (SRconflicts[i] && RRconflicts[i])                          if (RRconflicts[i] == 1)
                 fprintf(verbose_file, ", ");                                  fprintf(verbose_file, "1 reduce/reduce conflict");
             if (RRconflicts[i] == 1)                          else if (RRconflicts[i] > 1)
                 fprintf(verbose_file, "1 reduce/reduce conflict");                                  fprintf(verbose_file, "%d reduce/reduce conflicts",
             else if (RRconflicts[i] > 1)                                      RRconflicts[i]);
                 fprintf(verbose_file, "%d reduce/reduce conflicts",                          fprintf(verbose_file, ".\n");
                         RRconflicts[i]);                  }
             fprintf(verbose_file, ".\n");  
         }          }
     }  
 }  }
   
   
 void  void
 print_state(int state)  print_state(int state)
 {  {
     if (state)          if (state)
         fprintf(verbose_file, "\n\n");                  fprintf(verbose_file, "\n\n");
     if (SRconflicts[state] || RRconflicts[state])          if (SRconflicts[state] || RRconflicts[state])
         print_conflicts(state);                  print_conflicts(state);
     fprintf(verbose_file, "state %d\n", state);          fprintf(verbose_file, "state %d\n", state);
     print_core(state);          print_core(state);
     print_nulls(state);          print_nulls(state);
     print_actions(state);          print_actions(state);
 }  }
   
   
 void  void
 print_conflicts(int state)  print_conflicts(int state)
 {  {
     int symbol, act = REDUCE, number = 0;          int symbol, act = REDUCE, number = 0;
     action *p;          action *p;
   
     symbol = -1;          symbol = -1;
     for (p = parser[state]; p; p = p->next)          for (p = parser[state]; p; p = p->next) {
     {                  if (p->suppressed == 2)
         if (p->suppressed == 2)                          continue;
             continue;  
   
         if (p->symbol != symbol)                  if (p->symbol != symbol) {
         {                          symbol = p->symbol;
             symbol = p->symbol;                          number = p->number;
             number = p->number;                          if (p->action_code == SHIFT)
             if (p->action_code == SHIFT)                                  act = SHIFT;
                 act = SHIFT;                          else
             else                                  act = REDUCE;
                 act = REDUCE;                  } else if (p->suppressed == 1) {
         }                          if (state == final_state && symbol == 0) {
         else if (p->suppressed == 1)                                  fprintf(verbose_file,
         {                                      "%d: shift/reduce conflict "
             if (state == final_state && symbol == 0)                                      "(accept, reduce %d) on $end\n",
             {                                      state, p->number - 2);
                 fprintf(verbose_file, "%d: shift/reduce conflict \                          } else {
 (accept, reduce %d) on $end\n", state, p->number - 2);                                  if (act == SHIFT) {
             }                                          fprintf(verbose_file,
             else                                              "%d: shift/reduce conflict "
             {                                              "(shift %d, reduce %d) on %s\n",
                 if (act == SHIFT)                                              state, number, p->number - 2,
                 {                                              symbol_name[symbol]);
                     fprintf(verbose_file, "%d: shift/reduce conflict \                                  } else {
 (shift %d, reduce %d) on %s\n", state, number, p->number - 2,                                          fprintf(verbose_file,
                             symbol_name[symbol]);                                              "%d: reduce/reduce conflict "
                                               "(reduce %d, reduce %d) on %s\n",
                                               state, number - 2, p->number - 2,
                                               symbol_name[symbol]);
                                   }
                           }
                 }                  }
                 else  
                 {  
                     fprintf(verbose_file, "%d: reduce/reduce conflict \  
 (reduce %d, reduce %d) on %s\n", state, number - 2, p->number - 2,  
                             symbol_name[symbol]);  
                 }  
             }  
         }          }
     }  
 }  }
   
   
 void  void
 print_core(int state)  print_core(int state)
 {  {
     int i;          int i;
     int k;          int k;
     int rule;          int rule;
     core *statep;          core *statep;
     short *sp;          short *sp;
     short *sp1;          short *sp1;
   
     statep = state_table[state];          statep = state_table[state];
     k = statep->nitems;          k = statep->nitems;
   
     for (i = 0; i < k; i++)          for (i = 0; i < k; i++) {
     {                  sp1 = sp = ritem + statep->items[i];
         sp1 = sp = ritem + statep->items[i];  
   
         while (*sp >= 0) ++sp;                  while (*sp >= 0)
         rule = -(*sp);                          ++sp;
         fprintf(verbose_file, "\t%s : ", symbol_name[rlhs[rule]]);                  rule = -(*sp);
                   fprintf(verbose_file, "\t%s : ", symbol_name[rlhs[rule]]);
   
         for (sp = ritem + rrhs[rule]; sp < sp1; sp++)                  for (sp = ritem + rrhs[rule]; sp < sp1; sp++)
             fprintf(verbose_file, "%s ", symbol_name[*sp]);                          fprintf(verbose_file, "%s ", symbol_name[*sp]);
   
         putc('.', verbose_file);                  putc('.', verbose_file);
   
         while (*sp >= 0)                  while (*sp >= 0) {
         {                          fprintf(verbose_file, " %s", symbol_name[*sp]);
             fprintf(verbose_file, " %s", symbol_name[*sp]);                          sp++;
             sp++;                  }
                   fprintf(verbose_file, "  (%d)\n", -2 - *sp);
         }          }
         fprintf(verbose_file, "  (%d)\n", -2 - *sp);  
     }  
 }  }
   
   
 void  void
 print_nulls(int state)  print_nulls(int state)
 {  {
     action *p;          action *p;
     int i, j, k, nnulls;          int i, j, k, nnulls;
   
     nnulls = 0;          nnulls = 0;
     for (p = parser[state]; p; p = p->next)          for (p = parser[state]; p; p = p->next) {
     {                  if (p->action_code == REDUCE &&
         if (p->action_code == REDUCE &&                      (p->suppressed == 0 || p->suppressed == 1)) {
                 (p->suppressed == 0 || p->suppressed == 1))                          i = p->number;
         {                          if (rrhs[i] + 1 == rrhs[i + 1]) {
             i = p->number;                                  for (j = 0; j < nnulls && i > null_rules[j]; ++j)
             if (rrhs[i] + 1 == rrhs[i+1])                                          continue;
             {  
                 for (j = 0; j < nnulls && i > null_rules[j]; ++j)  
                     continue;  
   
                 if (j == nnulls)                                  if (j == nnulls) {
                 {                                          ++nnulls;
                     ++nnulls;                                          null_rules[j] = i;
                     null_rules[j] = i;                                  } else if (i != null_rules[j]) {
                                           ++nnulls;
                                           for (k = nnulls - 1; k > j; --k)
                                                   null_rules[k] = null_rules[k - 1];
                                           null_rules[j] = i;
                                   }
                           }
                 }                  }
                 else if (i != null_rules[j])  
                 {  
                     ++nnulls;  
                     for (k = nnulls - 1; k > j; --k)  
                         null_rules[k] = null_rules[k-1];  
                     null_rules[j] = i;  
                 }  
             }  
         }          }
     }  
   
     for (i = 0; i < nnulls; ++i)          for (i = 0; i < nnulls; ++i) {
     {                  j = null_rules[i];
         j = null_rules[i];                  fprintf(verbose_file, "\t%s : .  (%d)\n", symbol_name[rlhs[j]],
         fprintf(verbose_file, "\t%s : .  (%d)\n", symbol_name[rlhs[j]],                      j - 2);
                 j - 2);          }
     }          fprintf(verbose_file, "\n");
     fprintf(verbose_file, "\n");  
 }  }
   
   
 void  void
 print_actions(int stateno)  print_actions(int stateno)
 {  {
     action *p;          action *p;
     shifts *sp;          shifts *sp;
     int as;          int as;
   
     if (stateno == final_state)          if (stateno == final_state)
         fprintf(verbose_file, "\t$end  accept\n");                  fprintf(verbose_file, "\t$end  accept\n");
   
     p = parser[stateno];          p = parser[stateno];
     if (p)          if (p) {
     {                  print_shifts(p);
         print_shifts(p);                  print_reductions(p, defred[stateno]);
         print_reductions(p, defred[stateno]);          }
     }          sp = shift_table[stateno];
           if (sp && sp->nshifts > 0) {
     sp = shift_table[stateno];                  as = accessing_symbol[sp->shift[sp->nshifts - 1]];
     if (sp && sp->nshifts > 0)                  if (ISVAR(as))
     {                          print_gotos(stateno);
         as = accessing_symbol[sp->shift[sp->nshifts - 1]];          }
         if (ISVAR(as))  
             print_gotos(stateno);  
     }  
 }  }
   
   
 void  void
 print_shifts(action *p)  print_shifts(action * p)
 {  {
     int count;          int count;
     action *q;          action *q;
   
     count = 0;          count = 0;
     for (q = p; q; q = q->next)          for (q = p; q; q = q->next) {
     {                  if (q->suppressed < 2 && q->action_code == SHIFT)
         if (q->suppressed < 2 && q->action_code == SHIFT)                          ++count;
             ++count;          }
     }  
   
     if (count > 0)          if (count > 0) {
     {                  for (; p; p = p->next) {
         for (; p; p = p->next)                          if (p->action_code == SHIFT && p->suppressed == 0)
         {                                  fprintf(verbose_file, "\t%s  shift %d\n",
             if (p->action_code == SHIFT && p->suppressed == 0)                                      symbol_name[p->symbol], p->number);
                 fprintf(verbose_file, "\t%s  shift %d\n",                  }
                             symbol_name[p->symbol], p->number);  
         }          }
     }  
 }  }
   
   
 void  void
 print_reductions(action *p, int defred)  print_reductions(action * p, int defred)
 {  {
     int k, anyreds;          int k, anyreds;
     action *q;          action *q;
   
     anyreds = 0;          anyreds = 0;
     for (q = p; q ; q = q->next)          for (q = p; q; q = q->next) {
     {                  if (q->action_code == REDUCE && q->suppressed < 2) {
         if (q->action_code == REDUCE && q->suppressed < 2)                          anyreds = 1;
         {                          break;
             anyreds = 1;                  }
             break;  
         }          }
     }  
   
     if (anyreds == 0)          if (anyreds == 0)
         fprintf(verbose_file, "\t.  error\n");                  fprintf(verbose_file, "\t.  error\n");
     else          else {
     {                  for (; p; p = p->next) {
         for (; p; p = p->next)                          if (p->action_code == REDUCE && p->number != defred) {
         {                                  k = p->number - 2;
             if (p->action_code == REDUCE && p->number != defred)                                  if (p->suppressed == 0)
             {                                          fprintf(verbose_file, "\t%s  reduce %d\n",
                 k = p->number - 2;                                              symbol_name[p->symbol], k);
                 if (p->suppressed == 0)                          }
                     fprintf(verbose_file, "\t%s  reduce %d\n",                  }
                             symbol_name[p->symbol], k);  
             }  
         }  
   
         if (defred > 0)                  if (defred > 0)
             fprintf(verbose_file, "\t.  reduce %d\n", defred - 2);                          fprintf(verbose_file, "\t.  reduce %d\n", defred - 2);
     }          }
 }  }
   
   
 void  void
 print_gotos(int stateno)  print_gotos(int stateno)
 {  {
     int i, k;          int i, k;
     int as;          int as;
     short *to_state;          short *to_state;
     shifts *sp;          shifts *sp;
   
     putc('\n', verbose_file);          putc('\n', verbose_file);
     sp = shift_table[stateno];          sp = shift_table[stateno];
     to_state = sp->shift;          to_state = sp->shift;
     for (i = 0; i < sp->nshifts; ++i)          for (i = 0; i < sp->nshifts; ++i) {
     {                  k = to_state[i];
         k = to_state[i];                  as = accessing_symbol[k];
         as = accessing_symbol[k];                  if (ISVAR(as))
         if (ISVAR(as))                          fprintf(verbose_file, "\t%s  goto %d\n",
             fprintf(verbose_file, "\t%s  goto %d\n", symbol_name[as], k);                              symbol_name[as], k);
     }          }
 }  }

Legend:
Removed from v.1.11  
changed lines
  Added in v.1.12