⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 conflicts.c

📁 Bison语法分析器
💻 C
📖 第 1 页 / 共 2 页
字号:
      /* If invoked under the name `yacc', use the output format	 specified by POSIX.  */      fprintf(stderr, _("conflicts: "));      if (src_total > 0)	fprintf(stderr, _(" %d shift/reduce"), src_total);      if (src_total > 0 && rrc_total > 0)	fprintf(stderr, ",");      if (rrc_total > 0)	fprintf(stderr, _(" %d reduce/reduce"), rrc_total);      putc('\n', stderr);    }  else    {      fprintf(stderr, _("%s contains"), infile);      if (src_total == 1)	fprintf(stderr, _(" 1 shift/reduce conflict"));      else if (src_total > 1)	fprintf(stderr, _(" %d shift/reduce conflicts"), src_total);      if (src_total > 0 && rrc_total > 0)	fprintf(stderr, _(" and"));      if (rrc_total == 1)	fprintf(stderr, _(" 1 reduce/reduce conflict"));      else if (rrc_total > 1)	fprintf(stderr, _(" %d reduce/reduce conflicts"), rrc_total);      putc('.', stderr);      putc('\n', stderr);    }}voidcount_sr_conflicts (int state){  register int i;  register int k;  register int mask;  register shifts *shiftp;  register unsigned *fp1;  register unsigned *fp2;  register unsigned *fp3;  register int symbol;  src_count = 0;  shiftp = shift_table[state];  if (!shiftp) return;  for (i = 0; i < tokensetsize; i++)    {      shiftset[i] = 0;      lookaheadset[i] = 0;    }  k = shiftp->nshifts;  for (i = 0; i < k; i++)    {      if (! shiftp->shifts[i]) continue;      symbol = accessing_symbol[shiftp->shifts[i]];      if (ISVAR(symbol)) break;      SETBIT(shiftset, symbol);    }  k = lookaheads[state + 1];  fp3 = lookaheadset + tokensetsize;  for (i = lookaheads[state]; i < k; i++)    {      fp1 = LA + i * tokensetsize;      fp2 = lookaheadset;      while (fp2 < fp3)	*fp2++ |= *fp1++;    }  fp1 = shiftset;  fp2 = lookaheadset;  while (fp2 < fp3)    *fp2++ &= *fp1++;  mask = 1;  fp2 = lookaheadset;  for (i = 0; i < ntokens; i++)    {      if (mask & *fp2)	src_count++;      mask <<= 1;      if (mask == 0)	{	  mask = 1;	  fp2++;	}    }}voidcount_rr_conflicts (int state){  register int i;  register int j;  register int count;  register unsigned mask;  register unsigned *baseword;  register unsigned *wordp;  register int m;  register int n;  rrc_count = 0;  m = lookaheads[state];  n = lookaheads[state + 1];  if (n - m < 2) return;  mask = 1;  baseword = LA + m * tokensetsize;  for (i = 0; i < ntokens; i++)    {      wordp = baseword;      count = 0;      for (j = m; j < n; j++)	{	  if (mask & *wordp)	    count++;	  wordp += tokensetsize;	}      if (count >= 2) rrc_count++;      mask <<= 1;      if (mask == 0)	{	  mask = 1;	  baseword++;	}    }}voidprint_reductions (int state){  register int i;  register int j;  register int k;  register unsigned *fp1;  register unsigned *fp2;  register unsigned *fp3;  register unsigned *fp4;  register int rule;  register int symbol;  register unsigned mask;  register int m;  register int n;  register int default_LA;  register int default_rule = 0;  register int cmax;  register int count;  register shifts *shiftp;  register errs *errp;  int nodefault = 0;  for (i = 0; i < tokensetsize; i++)    shiftset[i] = 0;  shiftp = shift_table[state];  if (shiftp)    {      k = shiftp->nshifts;      for (i = 0; i < k; i++)	{	  if (! shiftp->shifts[i]) continue;	  symbol = accessing_symbol[shiftp->shifts[i]];	  if (ISVAR(symbol)) break;	  /* if this state has a shift for the error token,	     don't use a default rule.  */	  if (symbol == error_token_number) nodefault = 1;	  SETBIT(shiftset, symbol);	}    }  errp = err_table[state];  if (errp)    {      k = errp->nerrs;      for (i = 0; i < k; i++)	{	  if (! errp->errs[i]) continue;	  symbol = errp->errs[i];	  SETBIT(shiftset, symbol);	}    }  m = lookaheads[state];  n = lookaheads[state + 1];  if (n - m == 1 && ! nodefault)    {      default_rule = LAruleno[m];      fp1 = LA + m * tokensetsize;      fp2 = shiftset;      fp3 = lookaheadset;      fp4 = lookaheadset + tokensetsize;      while (fp3 < fp4)	*fp3++ = *fp1++ & *fp2++;      mask = 1;      fp3 = lookaheadset;      for (i = 0; i < ntokens; i++)	{	  if (mask & *fp3)	    fprintf(foutput, _("    %-4s\t[reduce using rule %d (%s)]\n"),		    tags[i], default_rule, tags[rlhs[default_rule]]);	  mask <<= 1;	  if (mask == 0)	    {	      mask = 1;	      fp3++;	    }	}      fprintf(foutput, _("    $default\treduce using rule %d (%s)\n\n"),	      default_rule, tags[rlhs[default_rule]]);    }  else if (n - m >= 1)    {      cmax = 0;      default_LA = -1;      fp4 = lookaheadset + tokensetsize;      if (! nodefault)	for (i = m; i < n; i++)	  {	    fp1 = LA + i * tokensetsize;	    fp2 = shiftset;	    fp3 = lookaheadset;  	    while (fp3 < fp4)	      *fp3++ = *fp1++ & (~(*fp2++));  	    count = 0;	    mask = 1;	    fp3 = lookaheadset;	    for (j = 0; j < ntokens; j++)	      {		if (mask & *fp3)		  count++;  		mask <<= 1;		if (mask == 0)		  {		    mask = 1;		    fp3++;		  }	      }  	    if (count > cmax)	      {		cmax = count;		default_LA = i;		default_rule = LAruleno[i];	      }  	    fp2 = shiftset;	    fp3 = lookaheadset;  	    while (fp3 < fp4)	      *fp2++ |= *fp3++;	  }      for (i = 0; i < tokensetsize; i++)        shiftset[i] = 0;      if (shiftp)        {          k = shiftp->nshifts;          for (i = 0; i < k; i++)	    {	      if (! shiftp->shifts[i]) continue;	      symbol = accessing_symbol[shiftp->shifts[i]];	      if (ISVAR(symbol)) break;	      SETBIT(shiftset, symbol);	    }        }      mask = 1;      fp1 = LA + m * tokensetsize;      fp2 = shiftset;      for (i = 0; i < ntokens; i++)	{	  int defaulted = 0;	  if (mask & *fp2)	    count = 1;	  else	    count = 0;	  fp3 = fp1;	  for (j = m; j < n; j++)	    {	      if (mask & *fp3)		{		  if (count == 0)		    {		      if (j != default_LA)			{			  rule = LAruleno[j];			  fprintf(foutput, _("    %-4s\treduce using rule %d (%s)\n"),				  tags[i], rule, tags[rlhs[rule]]);			}		      else defaulted = 1;		      count++;		    }		  else		    {		      if (defaulted)			{			  rule = LAruleno[default_LA];			  fprintf(foutput, _("    %-4s\treduce using rule %d (%s)\n"),				  tags[i], rule, tags[rlhs[rule]]);			  defaulted = 0;			}		      rule = LAruleno[j];		      fprintf(foutput, _("    %-4s\t[reduce using rule %d (%s)]\n"),			      tags[i], rule, tags[rlhs[rule]]);		    }		}	      fp3 += tokensetsize;	    }	  mask <<= 1;	  if (mask == 0)	    {	      mask = 1;	      /* We tried incrementing just fp1, and just fp2; both seem wrong.		 It seems necessary to increment both in sync.  */	      fp1++;	      fp2++;	    }	}      if (default_LA >= 0)	{	  fprintf(foutput, _("    $default\treduce using rule %d (%s)\n"),		  default_rule, tags[rlhs[default_rule]]);	}      putc('\n', foutput);    }}voidfinalize_conflicts (void){  FREE(conflicts);  FREE(shiftset);  FREE(lookaheadset);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -