📄 parse.c
字号:
;
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);
#endif
YYLABEL(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");
}
#endif
YYLABEL(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 + -