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

📄 parse-gram.c

📁 bison 2.0 主要可以用来做语法分析用的
💻 C
📖 第 1 页 / 共 4 页
字号:
#line 308 "parse-gram.y"    { (yyval.list) = symbol_list_prepend ((yyvsp[-1].list), (yyvsp[0].symbol), (yylsp[0])); }    break;  case 50:#line 314 "parse-gram.y"    {       current_type = (yyvsp[0].uniqstr);     }    break;  case 51:#line 318 "parse-gram.y"    {       symbol_class_set ((yyvsp[0].symbol), current_class, (yylsp[0]));       symbol_type_set ((yyvsp[0].symbol), current_type, (yylsp[0]));     }    break;  case 52:#line 323 "parse-gram.y"    {      symbol_class_set ((yyvsp[-1].symbol), current_class, (yylsp[-1]));      symbol_type_set ((yyvsp[-1].symbol), current_type, (yylsp[-1]));      symbol_user_token_number_set ((yyvsp[-1].symbol), (yyvsp[0].integer), (yylsp[0]));    }    break;  case 53:#line 329 "parse-gram.y"    {      symbol_class_set ((yyvsp[-1].symbol), current_class, (yylsp[-1]));      symbol_type_set ((yyvsp[-1].symbol), current_type, (yylsp[-1]));      symbol_make_alias ((yyvsp[-1].symbol), (yyvsp[0].symbol), (yyloc));    }    break;  case 54:#line 335 "parse-gram.y"    {      symbol_class_set ((yyvsp[-2].symbol), current_class, (yylsp[-2]));      symbol_type_set ((yyvsp[-2].symbol), current_type, (yylsp[-2]));      symbol_user_token_number_set ((yyvsp[-2].symbol), (yyvsp[-1].integer), (yylsp[-1]));      symbol_make_alias ((yyvsp[-2].symbol), (yyvsp[0].symbol), (yyloc));    }    break;  case 60:#line 364 "parse-gram.y"    {      if (yacc_flag)	complain_at ((yyloc), _("POSIX forbids declarations in the grammar"));    }    break;  case 61:#line 369 "parse-gram.y"    {      yyerrok;    }    break;  case 62:#line 375 "parse-gram.y"    { current_lhs = (yyvsp[0].symbol); current_lhs_location = (yylsp[0]); }    break;  case 64:#line 379 "parse-gram.y"    { grammar_rule_end ((yylsp[0])); }    break;  case 65:#line 380 "parse-gram.y"    { grammar_rule_end ((yylsp[0])); }    break;  case 67:#line 386 "parse-gram.y"    { grammar_rule_begin (current_lhs, current_lhs_location); }    break;  case 68:#line 388 "parse-gram.y"    { grammar_current_rule_symbol_append ((yyvsp[0].symbol), (yylsp[0])); }    break;  case 69:#line 390 "parse-gram.y"    { grammar_current_rule_action_append ((yyvsp[0].chars), (yylsp[0])); }    break;  case 70:#line 392 "parse-gram.y"    { grammar_current_rule_prec_set ((yyvsp[0].symbol), (yylsp[0])); }    break;  case 71:#line 394 "parse-gram.y"    { grammar_current_rule_dprec_set ((yyvsp[0].integer), (yylsp[0])); }    break;  case 72:#line 396 "parse-gram.y"    { grammar_current_rule_merge_set ((yyvsp[0].uniqstr), (yylsp[0])); }    break;  case 73:#line 400 "parse-gram.y"    { (yyval.symbol) = (yyvsp[0].symbol); }    break;  case 74:#line 401 "parse-gram.y"    { (yyval.symbol) = (yyvsp[0].symbol); }    break;  case 75:#line 406 "parse-gram.y"    { (yyval.chars) = (yyvsp[0].chars); }    break;  case 76:#line 412 "parse-gram.y"    {      (yyval.symbol) = symbol_get ((yyvsp[0].chars), (yylsp[0]));      symbol_class_set ((yyval.symbol), token_sym, (yylsp[0]));    }    break;  case 77:#line 421 "parse-gram.y"    {      (yyval.chars) = (yyvsp[0].chars) + 1;      (yyval.chars)[strlen ((yyval.chars)) - 1] = '\0';    }    break;  case 79:#line 430 "parse-gram.y"    {      muscle_code_grow ("epilogue", (yyvsp[0].chars), (yylsp[0]));      scanner_last_string_free ();    }    break;    }/* Line 1037 of yacc.c.  */#line 1739 "parse-gram.c"  yyvsp -= yylen;  yyssp -= yylen;  yylsp -= yylen;  YY_STACK_PRINT (yyss, yyssp);  *++yyvsp = yyval;  *++yylsp = yyloc;  /* Now `shift' the result of the reduction.  Determine what state     that goes to, based on the state we popped back to and the rule     number reduced by.  */  yyn = yyr1[yyn];  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)    yystate = yytable[yystate];  else    yystate = yydefgoto[yyn - YYNTOKENS];  goto yynewstate;/*------------------------------------.| yyerrlab -- here on detecting error |`------------------------------------*/yyerrlab:  /* If not already recovering from an error, report this error.  */  if (!yyerrstatus)    {      ++yynerrs;#if YYERROR_VERBOSE      yyn = yypact[yystate];      if (YYPACT_NINF < yyn && yyn < YYLAST)	{	  YYSIZE_T yysize = 0;	  int yytype = YYTRANSLATE (yychar);	  const char* yyprefix;	  char *yymsg;	  int yyx;	  /* Start YYX at -YYN if negative to avoid negative indexes in	     YYCHECK.  */	  int yyxbegin = yyn < 0 ? -yyn : 0;	  /* Stay within bounds of both yycheck and yytname.  */	  int yychecklim = YYLAST - yyn;	  int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;	  int yycount = 0;	  yyprefix = ", expecting ";	  for (yyx = yyxbegin; yyx < yyxend; ++yyx)	    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)	      {		yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]);		yycount += 1;		if (yycount == 5)		  {		    yysize = 0;		    break;		  }	      }	  yysize += (sizeof ("syntax error, unexpected ")		     + yystrlen (yytname[yytype]));	  yymsg = (char *) YYSTACK_ALLOC (yysize);	  if (yymsg != 0)	    {	      char *yyp = yystpcpy (yymsg, "syntax error, unexpected ");	      yyp = yystpcpy (yyp, yytname[yytype]);	      if (yycount < 5)		{		  yyprefix = ", expecting ";		  for (yyx = yyxbegin; yyx < yyxend; ++yyx)		    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)		      {			yyp = yystpcpy (yyp, yyprefix);			yyp = yystpcpy (yyp, yytname[yyx]);			yyprefix = " or ";		      }		}	      yyerror (yymsg);	      YYSTACK_FREE (yymsg);	    }	  else	    yyerror ("syntax error; also virtual memory exhausted");	}      else#endif /* YYERROR_VERBOSE */	yyerror ("syntax error");    }  yyerror_range[0] = yylloc;  if (yyerrstatus == 3)    {      /* If just tried and failed to reuse look-ahead token after an	 error, discard it.  */      if (yychar <= YYEOF)        {          /* If at end of input, pop the error token,	     then the rest of the stack, then return failure.  */	  if (yychar == YYEOF)	     for (;;)	       {                 yyerror_range[0] = *yylsp;		 YYPOPSTACK;		 if (yyssp == yyss)		   YYABORT;		 yydestruct ("Error: popping",                             yystos[*yyssp], yyvsp, yylsp);	       }        }      else	{	  yydestruct ("Error: discarding", yytoken, &yylval, &yylloc);	  yychar = YYEMPTY;	}    }  /* Else will try to reuse look-ahead token after shifting the error     token.  */  goto yyerrlab1;/*---------------------------------------------------.| yyerrorlab -- error raised explicitly by YYERROR.  |`---------------------------------------------------*/yyerrorlab:#ifdef __GNUC__  /* Pacify GCC when the user code never invokes YYERROR and the label     yyerrorlab therefore never appears in user code.  */  if (0)     goto yyerrorlab;#endif  yyerror_range[0] = yylsp[1-yylen];  yylsp -= yylen;  yyvsp -= yylen;  yyssp -= yylen;  yystate = *yyssp;  goto yyerrlab1;/*-------------------------------------------------------------.| yyerrlab1 -- common code for both syntax error and YYERROR.  |`-------------------------------------------------------------*/yyerrlab1:  yyerrstatus = 3;	/* Each real token shifted decrements this.  */  for (;;)    {      yyn = yypact[yystate];      if (yyn != YYPACT_NINF)	{	  yyn += YYTERROR;	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)	    {	      yyn = yytable[yyn];	      if (0 < yyn)		break;	    }	}      /* Pop the current state because it cannot handle the error token.  */      if (yyssp == yyss)	YYABORT;      yyerror_range[0] = *yylsp;      yydestruct ("Error: popping", yystos[yystate], yyvsp, yylsp);      YYPOPSTACK;      yystate = *yyssp;      YY_STACK_PRINT (yyss, yyssp);    }  if (yyn == YYFINAL)    YYACCEPT;  *++yyvsp = yylval;  yyerror_range[1] = yylloc;  /* Using YYLLOC is tempting, but would change the location of     the look-ahead.  YYLOC is available though. */  YYLLOC_DEFAULT (yyloc, yyerror_range - 1, 2);  *++yylsp = yyloc;  /* Shift the error token. */  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);  yystate = yyn;  goto yynewstate;/*-------------------------------------.| yyacceptlab -- YYACCEPT comes here.  |`-------------------------------------*/yyacceptlab:  yyresult = 0;  goto yyreturn;/*-----------------------------------.| yyabortlab -- YYABORT comes here.  |`-----------------------------------*/yyabortlab:  yydestruct ("Error: discarding lookahead",              yytoken, &yylval, &yylloc);  yychar = YYEMPTY;  yyresult = 1;  goto yyreturn;#ifndef yyoverflow/*----------------------------------------------.| yyoverflowlab -- parser overflow comes here.  |`----------------------------------------------*/yyoverflowlab:  yyerror ("parser stack overflow");  yyresult = 2;  /* Fall through.  */#endifyyreturn:#ifndef yyoverflow  if (yyss != yyssa)    YYSTACK_FREE (yyss);#endif  return yyresult;}#line 436 "parse-gram.y"/* Return the location of the left-hand side of a rule whose   right-hand side is RHS[1] ... RHS[N].  Ignore empty nonterminals in   the right-hand side, and return an empty location equal to the end   boundary of RHS[0] if the right-hand side is empty.  */static YYLTYPElloc_default (YYLTYPE const *rhs, int n){  int i;  YYLTYPE loc;  /* SGI MIPSpro 7.4.1m miscompiles "loc.start = loc.end = rhs[n].end;".     The bug is fixed in 7.4.2m, but play it safe for now.  */  loc.start = rhs[n].end;  loc.end = rhs[n].end;  /* Ignore empty nonterminals the start of the the right-hand side.     Do not bother to ignore them at the end of the right-hand side,     since empty nonterminals have the same end as their predecessors.  */  for (i = 1; i <= n; i++)    if (! equal_boundaries (rhs[i].start, rhs[i].end))      {	loc.start = rhs[i].start;	break;      }  return loc;}/* Add a lex-param or a parse-param (depending on TYPE) with   declaration DECL and location LOC.  */static voidadd_param (char const *type, char *decl, location loc){  static char const alphanum[26 + 26 + 1 + 10] =    "abcdefghijklmnopqrstuvwxyz"    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"    "_"    "0123456789";  char const *name_start = NULL;  char *p;  /* Stop on last actual character.  */  for (p = decl; p[1]; p++)    if ((p == decl	 || ! memchr (alphanum, p[-1], sizeof alphanum))	&& memchr (alphanum, p[0], sizeof alphanum - 10))      name_start = p;  /* Strip the surrounding '{' and '}', and any blanks just inside     the braces.  */  while (*--p == ' ' || *p == '\t')    continue;  p[1] = '\0';  while (*++decl == ' ' || *decl == '\t')    continue;  if (! name_start)    complain_at (loc, _("missing identifier in parameter declaration"));  else    {      char *name;      size_t name_len;      for (name_len = 1;	   memchr (alphanum, name_start[name_len], sizeof alphanum);	   name_len++)	continue;      name = xmalloc (name_len + 1);      memcpy (name, name_start, name_len);      name[name_len] = '\0';      muscle_pair_list_grow (type, decl, name);      free (name);    }  scanner_last_string_free ();}/*----------------------------------------------------.| When debugging the parser, display tokens' values.  |`----------------------------------------------------*/static voidprint_token_value (FILE *file, int type, YYSTYPE const *value){  fputc (' ', file);  switch (type)    {    case ID:      fprintf (file, " = %s", value->symbol->tag);      break;    case INT:      fprintf (file, " = %d", value->integer);      break;    case STRING:      fprintf (file, " = \"%s\"", value->chars);      break;    case TYPE:      fprintf (file, " = <%s>", value->uniqstr);      break;    case BRACED_CODE:    case PERCENT_DESTRUCTOR:    case PERCENT_LEX_PARAM:    case PERCENT_PARSE_PARAM:    case PERCENT_PRINTER:    case PERCENT_UNION:    case PROLOGUE:    case EPILOGUE:      fprintf (file, " = {{ %s }}", value->chars);      break;    default:      fprintf (file, "unknown token type");      break;    }}static voidgram_error (location const *loc, char const *msg){  complain_at (*loc, "%s", msg);}char const *token_name (int type){  return yytname[type];}

⌨️ 快捷键说明

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