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

📄 parse.c

📁 生成C++的词法/语法分析的Flex语法分析器
💻 C
📖 第 1 页 / 共 4 页
字号:
			;    break;}case 38:#line 449 "parse.y"{			varlength = true;			if ( yyvsp[-3] > yyvsp[-1] || yyvsp[-3] < 0 )			    {			    synerr( "bad iteration values" );			    yyval = yyvsp[-5];			    }			else			    {			    if ( yyvsp[-3] == 0 ) 				{ 				if ( yyvsp[-1] <= 0 ) 				    { 				    synerr( "bad iteration values" ); 				    yyval = yyvsp[-5]; 				    } 				else 				    yyval = mkopt( mkrep( yyvsp[-5], 1, yyvsp[-1] ) ); 				}			    else				yyval = mkrep( yyvsp[-5], yyvsp[-3], yyvsp[-1] );			    }			;    break;}case 39:#line 475 "parse.y"{			varlength = true;			if ( yyvsp[-2] <= 0 )			    {			    synerr( "iteration value must be positive" );			    yyval = yyvsp[-4];			    }			else			    yyval = mkrep( yyvsp[-4], yyvsp[-2], INFINITY );			;    break;}case 40:#line 489 "parse.y"{			/* the singleton could be something like "(foo)",			 * in which case we have no idea what its length			 * is, so we punt here.			 */			varlength = true;			if ( yyvsp[-1] <= 0 )			    {			    synerr( "iteration value must be positive" );			    yyval = yyvsp[-3];			    }			else			    yyval = link_machines( yyvsp[-3], copysingl( yyvsp[-3], yyvsp[-1] - 1 ) );			;    break;}case 41:#line 507 "parse.y"{			if ( ! madeany )			    {			    /* create the '.' character class */			    anyccl = cclinit();			    ccladd( anyccl, '\n' );			    cclnegate( anyccl );			    if ( useecs )				mkeccl( ccltbl + cclmap[anyccl],					ccllen[anyccl], nextecm,					ecgroup, csize, csize );			    madeany = true;			    }			++rulelen;			yyval = mkstate( -anyccl );			;    break;}case 42:#line 529 "parse.y"{			if ( ! cclsorted )			    /* sort characters for fast searching.  We use a			     * shell sort since this list could be large.			     */			    cshell( ccltbl + cclmap[yyvsp[0]], ccllen[yyvsp[0]], true );			if ( useecs )			    mkeccl( ccltbl + cclmap[yyvsp[0]], ccllen[yyvsp[0]],				    nextecm, ecgroup, csize, csize );			++rulelen;			yyval = mkstate( -yyvsp[0] );			;    break;}case 43:#line 546 "parse.y"{			++rulelen;			yyval = mkstate( -yyvsp[0] );			;    break;}case 44:#line 553 "parse.y"{ yyval = yyvsp[-1]; ;    break;}case 45:#line 556 "parse.y"{ yyval = yyvsp[-1]; ;    break;}case 46:#line 559 "parse.y"{			++rulelen;			if ( caseins && yyvsp[0] >= 'A' && yyvsp[0] <= 'Z' )			    yyvsp[0] = clower( yyvsp[0] );			yyval = mkstate( yyvsp[0] );			;    break;}case 47:#line 570 "parse.y"{ yyval = yyvsp[-1]; ;    break;}case 48:#line 573 "parse.y"{			/* *Sigh* - to be compatible Unix lex, negated ccls			 * match newlines			 */#ifdef NOTDEF			ccladd( yyvsp[-1], '\n' ); /* negated ccls don't match '\n' */			cclsorted = false; /* because we added the newline */#endif			cclnegate( yyvsp[-1] );			yyval = yyvsp[-1];			;    break;}case 49:#line 587 "parse.y"{			if ( yyvsp[-2] > yyvsp[0] )			    synerr( "negative range in character class" );			else			    {			    if ( caseins )				{				if ( yyvsp[-2] >= 'A' && yyvsp[-2] <= 'Z' )				    yyvsp[-2] = clower( yyvsp[-2] );				if ( yyvsp[0] >= 'A' && yyvsp[0] <= 'Z' )				    yyvsp[0] = clower( yyvsp[0] );				}			    for ( i = yyvsp[-2]; i <= yyvsp[0]; ++i )			        ccladd( yyvsp[-3], i );			    /* keep track if this ccl is staying in alphabetical			     * order			     */			    cclsorted = cclsorted && (yyvsp[-2] > lastchar);			    lastchar = yyvsp[0];			    }			yyval = yyvsp[-3];			;    break;}case 50:#line 615 "parse.y"{			if ( caseins )			    if ( yyvsp[0] >= 'A' && yyvsp[0] <= 'Z' )				yyvsp[0] = clower( yyvsp[0] );			ccladd( yyvsp[-1], yyvsp[0] );			cclsorted = cclsorted && (yyvsp[0] > lastchar);			lastchar = yyvsp[0];			yyval = yyvsp[-1];			;    break;}case 51:#line 627 "parse.y"{			cclsorted = true;			lastchar = 0;			yyval = cclinit();			;    break;}case 52:#line 635 "parse.y"{			if ( caseins )			    if ( yyvsp[0] >= 'A' && yyvsp[0] <= 'Z' )				yyvsp[0] = clower( yyvsp[0] );			++rulelen;			yyval = link_machines( yyvsp[-1], mkstate( yyvsp[0] ) );			;    break;}case 53:#line 646 "parse.y"{ yyval = mkstate( SYM_EPSILON ); ;    break;}}#line 783 "/u/icdc/rdt/tools/lib/bison.cc"   /* the action file gets copied in in place of this dollarsign  */  yyvsp -= yylen;  yyssp -= yylen;#ifdef YY_parse_LSP_NEEDED  yylsp -= yylen;#endif#if YY_parse_DEBUG != 0  if (YY_parse_DEBUG_FLAG)    {      short *ssp1 = yyss - 1;      fprintf (stderr, "state stack now");      while (ssp1 != yyssp)	fprintf (stderr, " %d", *++ssp1);      fprintf (stderr, "\n");    }#endif  *++yyvsp = yyval;#ifdef YY_parse_LSP_NEEDED  yylsp++;  if (yylen == 0)    {      yylsp->first_line = YY_parse_LLOC.first_line;      yylsp->first_column = YY_parse_LLOC.first_column;      yylsp->last_line = (yylsp-1)->last_line;      yylsp->last_column = (yylsp-1)->last_column;      yylsp->text = 0;    }  else    {      yylsp->last_line = (yylsp+yylen-1)->last_line;      yylsp->last_column = (yylsp+yylen-1)->last_column;    }#endif  /* 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 - YYNTBASE] + *yyssp;  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)    yystate = yytable[yystate];  else    yystate = yydefgoto[yyn - YYNTBASE];  YYGOTO(yynewstate);YYLABEL(yyerrlab)   /* here on detecting error */  if (! yyerrstatus)    /* If not already recovering from an error, report this error.  */    {      ++YY_parse_NERRS;#ifdef YY_parse_ERROR_VERBOSE      yyn = yypact[yystate];      if (yyn > YYFLAG && yyn < YYLAST)	{	  int size = 0;	  char *msg;	  int x, count;	  count = 0;	  /* Start X at -yyn if nec to avoid negative indexes in yycheck.  */	  for (x = (yyn < 0 ? -yyn : 0);	       x < (sizeof(yytname) / sizeof(char *)); x++)	    if (yycheck[x + yyn] == x)	      size += strlen(yytname[x]) + 15, count++;	  msg = (char *) malloc(size + 15);	  if (msg != 0)	    {	      strcpy(msg, "parse error");	      if (count < 5)		{		  count = 0;		  for (x = (yyn < 0 ? -yyn : 0);		       x < (sizeof(yytname) / sizeof(char *)); x++)		    if (yycheck[x + yyn] == x)		      {			strcat(msg, count == 0 ? ", expecting `" : " or `");			strcat(msg, yytname[x]);			strcat(msg, "'");			count++;		      }		}	      YY_parse_ERROR(msg);	      free(msg);	    }	  else	    YY_parse_ERROR ("parse error; also virtual memory exceeded");	}      else#endif /* YY_parse_ERROR_VERBOSE */	YY_parse_ERROR("parse error");    }  YYGOTO(yyerrlab1);YYLABEL(yyerrlab1)   /* here on error raised explicitly by an action */  if (yyerrstatus == 3)    {      /* if just tried and failed to reuse lookahead token after an error, discard it.  */      /* return failure if at end of input */      if (YY_parse_CHAR == YYEOF)	YYABORT;#if YY_parse_DEBUG != 0      if (YY_parse_DEBUG_FLAG)	fprintf(stderr, "Discarding token %d (%s).\n", YY_parse_CHAR, yytname[yychar1]);#endif      YY_parse_CHAR = YYEMPTY;    }  /* Else will try to reuse lookahead token     after shifting the error token.  */  yyerrstatus = 3;              /* Each real token shifted decrements this */  YYGOTO(yyerrhandle);YYLABEL(yyerrdefault)  /* current state does not do anything special for the error token. */#if 0  /* This is wrong; only states that explicitly want error tokens     should shift them.  */  yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/  if (yyn) YYGOTO(yydefault);#endifYYLABEL(yyerrpop)   /* pop the current state because it cannot handle the error token */  if (yyssp == yyss) YYABORT;  yyvsp--;  yystate = *--yyssp;#ifdef YY_parse_LSP_NEEDED  yylsp--;#endif#if YY_parse_DEBUG != 0  if (YY_parse_DEBUG_FLAG)    {      short *ssp1 = yyss - 1;      fprintf (stderr, "Error: state stack now");      while (ssp1 != yyssp)	fprintf (stderr, " %d", *++ssp1);      fprintf (stderr, "\n");    }#endifYYLABEL(yyerrhandle)  yyn = yypact[yystate];  if (yyn == YYFLAG)    YYGOTO(yyerrdefault);  yyn += YYTERROR;  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)    YYGOTO(yyerrdefault);  yyn = yytable[yyn];  if (yyn < 0)    {      if (yyn == YYFLAG)	YYGOTO(yyerrpop);      yyn = -yyn;      YYGOTO(yyreduce);    }  else if (yyn == 0)    YYGOTO(yyerrpop);  if (yyn == YYFINAL)    YYACCEPT;#if YY_parse_DEBUG != 0  if (YY_parse_DEBUG_FLAG)    fprintf(stderr, "Shifting error token, ");#endif  *++yyvsp = YY_parse_LVAL;#ifdef YY_parse_LSP_NEEDED  *++yylsp = YY_parse_LLOC;#endif  yystate = yyn;  YYGOTO(yynewstate);/* end loop, in which YYGOTO may be used. */  YYENDGOTO}/* END *//* #line 982 "/u/icdc/rdt/tools/lib/bison.cc" */#line 1918 "y.tab.c"#line 649 "parse.y"/* build_eof_action - build the "<<EOF>>" action for the active start *                    conditions */void build_eof_action()    {    register int i;    for ( i = 1; i <= actvp; ++i )	{	if ( sceof[actvsc[i]] )	    format_pinpoint_message(		"multiple <<EOF>> rules for start condition %s",		    scname[actvsc[i]] );	else	    {	    sceof[actvsc[i]] = true;	    fprintf( temp_action_file, "case YY_STATE_EOF(%s):\n",		     scname[actvsc[i]] );	    }	}    line_directive_out( temp_action_file );    }/* synerr - report a syntax error */void synerr( str )char str[];    {    syntaxerror = true;    pinpoint_message( str );    }/* format_pinpoint_message - write out a message formatted with one string, *			     pinpointing its location */void format_pinpoint_message( msg, arg )char msg[], arg[];    {    char errmsg[MAXLINE];    (void) sprintf( errmsg, msg, arg );    pinpoint_message( errmsg );    }/* pinpoint_message - write out a message, pinpointing its location */void pinpoint_message( str )char str[];    {    fprintf( stderr, "\"%s\", line %d: %s\n", infilename, linenum, str );    }/* yyerror - eat up an error message from the parser; *	     currently, messages are ignore */void yyerror( msg )char msg[];    {    }

⌨️ 快捷键说明

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