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

📄 print.c

📁 Bison语法分析器
💻 C
字号:
/* Print information on generated parser, for bison,   Copyright (C) 1984, 1986, 1989 Free Software Foundation, Inc.This file is part of Bison, the GNU Compiler Compiler.Bison is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2, or (at your option)any later version.Bison is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with Bison; see the file COPYING.  If not, write tothe Free Software Foundation, Inc., 59 Temple Place - Suite 330,Boston, MA 02111-1307, USA.  */#include <stdio.h>#include "system.h"#include "machine.h"#include "alloc.h"#include "files.h"#include "gram.h"#include "state.h"extern char **tags;extern int nstates;extern short *accessing_symbol;extern core **state_table;extern shifts **shift_table;extern errs **err_table;extern reductions **reduction_table;extern char *consistent;extern char any_conflicts;extern char *conflicts;extern int final_state;extern void conflict_log PARAMS((void));extern void verbose_conflict_log PARAMS((void));extern void print_reductions PARAMS((int));void terse PARAMS((void));void verbose PARAMS((void));void print_token PARAMS((int, int));void print_state PARAMS((int));void print_core PARAMS((int));void print_actions PARAMS((int));void print_grammar PARAMS((void));voidterse (void){  if (any_conflicts)    {      conflict_log();    }}voidverbose (void){  register int i;  if (any_conflicts)    verbose_conflict_log();  print_grammar();  for (i = 0; i < nstates; i++)    {      print_state(i);    }}voidprint_token (int extnum, int token){  fprintf(foutput, _(" type %d is %s\n"), extnum, tags[token]);}voidprint_state (int state){  fprintf(foutput, _("\n\nstate %d\n\n"), state);  print_core(state);  print_actions(state);}voidprint_core (int state){  register int i;  register int k;  register int rule;  register core *statep;  register short *sp;  register short *sp1;  statep = state_table[state];  k = statep->nitems;  if (k == 0) return;  for (i = 0; i < k; i++)    {      sp1 = sp = ritem + statep->items[i];      while (*sp > 0)	sp++;      rule = -(*sp);      fprintf(foutput, "    %s  ->  ", tags[rlhs[rule]]);      for (sp = ritem + rrhs[rule]; sp < sp1; sp++)	{	  fprintf(foutput, "%s ", tags[*sp]);	}      putc('.', foutput);      while (*sp > 0)	{	  fprintf(foutput, " %s", tags[*sp]);	  sp++;	}      fprintf (foutput, _("   (rule %d)"), rule);      putc('\n', foutput);    }  putc('\n', foutput);}voidprint_actions (int state){  register int i;  register int k;  register int state1;  register int symbol;  register shifts *shiftp;  register errs *errp;  register reductions *redp;  register int rule;  shiftp = shift_table[state];  redp = reduction_table[state];  errp = err_table[state];  if (!shiftp && !redp)    {      if (final_state == state)	fprintf(foutput, _("    $default\taccept\n"));      else	fprintf(foutput, _("    NO ACTIONS\n"));      return;    }  if (shiftp)    {      k = shiftp->nshifts;      for (i = 0; i < k; i++)	{	  if (! shiftp->shifts[i]) continue;	  state1 = shiftp->shifts[i];	  symbol = accessing_symbol[state1];	  /* The following line used to be turned off.  */	  if (ISVAR(symbol)) break;          if (symbol==0)      /* I.e. strcmp(tags[symbol],"$")==0 */            fprintf(foutput, _("    $   \tgo to state %d\n"), state1);          else            fprintf(foutput, _("    %-4s\tshift, and go to state %d\n"),                    tags[symbol], state1);	}      if (i > 0)	putc('\n', foutput);    }  else    {      i = 0;      k = 0;    }  if (errp)    {      int j, nerrs;      nerrs = errp->nerrs;      for (j = 0; j < nerrs; j++)	{	  if (! errp->errs[j]) continue;	  symbol = errp->errs[j];	  fprintf(foutput, _("    %-4s\terror (nonassociative)\n"), tags[symbol]);	}      if (j > 0)	putc('\n', foutput);    }  if (consistent[state] && redp)    {      rule = redp->rules[0];      symbol = rlhs[rule];      fprintf(foutput, _("    $default\treduce using rule %d (%s)\n\n"),     	        rule, tags[symbol]);    }  else if (redp)    {      print_reductions(state);    }  if (i < k)    {      for (; i < k; i++)	{	  if (! shiftp->shifts[i]) continue;	  state1 = shiftp->shifts[i];	  symbol = accessing_symbol[state1];	  fprintf(foutput, _("    %-4s\tgo to state %d\n"), tags[symbol], state1);	}      putc('\n', foutput);    }}#define END_TEST(end) \  if (column + strlen(buffer) > (end))					 \    { fprintf (foutput, "%s\n   ", buffer); column = 3; buffer[0] = 0; } \  elsevoidprint_grammar (void){  int i, j;  short* rule;  char buffer[90];  int column = 0;  /* rule # : LHS -> RHS */  fputs(_("\nGrammar\n"), foutput);  for (i = 1; i <= nrules; i++)    /* Don't print rules disabled in reduce_grammar_tables.  */    if (rlhs[i] >= 0)      {	fprintf(foutput, _("rule %-4d %s ->"), i, tags[rlhs[i]]);	rule = &ritem[rrhs[i]];	if (*rule > 0)	  while (*rule > 0)	    fprintf(foutput, " %s", tags[*rule++]);	else	  fputs (_("		/* empty */"), foutput);	putc('\n', foutput);      }  /* TERMINAL (type #) : rule #s terminal is on RHS */  fputs(_("\nTerminals, with rules where they appear\n\n"), foutput);  fprintf(foutput, "%s (-1)\n", tags[0]);  if (translations)    {      for (i = 0; i <= max_user_token_number; i++)	if (token_translations[i] != 2)	  {	    buffer[0] = 0;	    column = strlen (tags[token_translations[i]]);	    fprintf(foutput, "%s", tags[token_translations[i]]);	    END_TEST (50);	    sprintf (buffer, " (%d)", i);	    for (j = 1; j <= nrules; j++)	      {		for (rule = &ritem[rrhs[j]]; *rule > 0; rule++)		  if (*rule == token_translations[i])		    {		      END_TEST (65);		      sprintf (buffer + strlen(buffer), " %d", j);		      break;		    }	      }	    fprintf (foutput, "%s\n", buffer);	  }    }  else    for (i = 1; i < ntokens; i++)      {	buffer[0] = 0;	column = strlen (tags[i]);	fprintf(foutput, "%s", tags[i]);	END_TEST (50);	sprintf (buffer, " (%d)", i);	for (j = 1; j <= nrules; j++)	  {	    for (rule = &ritem[rrhs[j]]; *rule > 0; rule++)	      if (*rule == i)		{		  END_TEST (65);		  sprintf (buffer + strlen(buffer), " %d", j);		  break;		}	  }	fprintf (foutput, "%s\n", buffer);      }  fputs(_("\nNonterminals, with rules where they appear\n\n"), foutput);  for (i = ntokens; i <= nsyms - 1; i++)    {      int left_count = 0, right_count = 0;      for (j = 1; j <= nrules; j++)	{	  if (rlhs[j] == i)	    left_count++;	  for (rule = &ritem[rrhs[j]]; *rule > 0; rule++)	    if (*rule == i)	      {		right_count++;		break;	      }	}      buffer[0] = 0;      fprintf(foutput, "%s", tags[i]);      column = strlen (tags[i]);      sprintf (buffer, " (%d)", i);      END_TEST (0);      if (left_count > 0)	{	  END_TEST (50);	  sprintf (buffer + strlen(buffer), _(" on left:"));	  for (j = 1; j <= nrules; j++)	    {	      END_TEST (65);	      if (rlhs[j] == i)		sprintf (buffer + strlen(buffer), " %d", j);	    }	}      if (right_count > 0)	{	  if (left_count > 0)	    sprintf (buffer + strlen(buffer), ",");	  END_TEST (50);	  sprintf (buffer + strlen(buffer), _(" on right:"));	  for (j = 1; j <= nrules; j++)	    {	      for (rule = &ritem[rrhs[j]]; *rule > 0; rule++)		if (*rule == i)		  {		    END_TEST (65);		    sprintf (buffer + strlen(buffer), " %d", j);		    break;		  }	    }	}      fprintf (foutput, "%s\n", buffer);    }}

⌨️ 快捷键说明

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