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

📄 conflict.c

📁 生成C++词法/语法分析的GNU语法分析器
💻 C
📖 第 1 页 / 共 2 页
字号:
voidtotal_conflicts(){  extern int fixed_outfiles;  if (src_total == expected_conflicts && rrc_total == 0)    return;  if (fixed_outfiles)    {      /* 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(state)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(state)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(state)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;  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;	      /* This used to be fp1, but I think fp2 is right		 because fp2 is where the words are fetched to test with mask		 in this loop.  */	      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(){  FREE(conflicts);  FREE(shiftset);  FREE(lookaheadset);}

⌨️ 快捷键说明

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