📄 y_tab.c
字号:
/*
** we have a new state - find out what to do
*/
yy_newstate:
if ( ( yy_n = yypact[ yy_state ] ) <= YYFLAG )
goto yydefault; /* simple state */
#if YYDEBUG
/*
** if debugging, need to mark whether new token grabbed
*/
yytmp = yychar < 0;
#endif
if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) )
yychar = 0; /* reached EOF */
#if YYDEBUG
if ( yydebug && yytmp )
{
register int yy_i;
fprintf(file, "Received token " );
if ( yychar == 0 )
fprintf(file, "end-of-file\n" );
else if ( yychar < 0 )
fprintf(file, "-none-\n" );
else
{
for ( yy_i = 0; yytoks[yy_i].t_val >= 0;
yy_i++ )
{
if ( yytoks[yy_i].t_val == yychar )
break;
}
fprintf(file, "%s\n", yytoks[yy_i].t_name );
}
}
#endif /* YYDEBUG */
if ( ( ( yy_n += yychar ) < 0 ) || ( yy_n >= YYLAST ) )
goto yydefault;
if ( yychk[ yy_n = yyact[ yy_n ] ] == yychar ) /*valid shift*/
{
yychar = -1;
yyval = yylval;
yy_state = yy_n;
if ( yyerrflag > 0 )
yyerrflag--;
goto yy_stack;
}
yydefault:
if ( ( yy_n = yydef[ yy_state ] ) == -2 )
{
#if YYDEBUG
yytmp = yychar < 0;
#endif
if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) )
yychar = 0; /* reached EOF */
#if YYDEBUG
if ( yydebug && yytmp )
{
register int yy_i;
fprintf(file, "Received token " );
if ( yychar == 0 )
fprintf(file, "end-of-file\n" );
else if ( yychar < 0 )
fprintf(file, "-none-\n" );
else
{
for ( yy_i = 0;
yytoks[yy_i].t_val >= 0;
yy_i++ )
{
if ( yytoks[yy_i].t_val
== yychar )
{
break;
}
}
fprintf(file, "%s\n", yytoks[yy_i].t_name );
}
}
#endif /* YYDEBUG */
/*
** look through exception table
*/
{
register int *yyxi = yyexca;
while ( ( *yyxi != -1 ) ||
( yyxi[1] != yy_state ) )
{
yyxi += 2;
}
while ( ( *(yyxi += 2) >= 0 ) &&
( *yyxi != yychar ) )
;
if ( ( yy_n = yyxi[1] ) < 0 )
YYACCEPT;
}
}
/*
** check for syntax error
*/
if ( yy_n == 0 ) /* have an error */
{
/* no worry about speed here! */
switch ( yyerrflag )
{
case 0: /* new error */
yyerror( "syntax error" );
goto skip_init;
yyerrlab:
/*
** get globals into registers.
** we have a user generated syntax type error
*/
yy_pv = yypv;
yy_ps = yyps;
yy_state = yystate;
yynerrs++;
skip_init:
case 1:
case 2: /* incompletely recovered error */
/* try again... */
yyerrflag = 3;
/*
** find state where "error" is a legal
** shift action
*/
while ( yy_ps >= yys )
{
yy_n = yypact[ *yy_ps ] + YYERRCODE;
if ( yy_n >= 0 && yy_n < YYLAST &&
yychk[yyact[yy_n]] == YYERRCODE) {
/*
** simulate shift of "error"
*/
yy_state = yyact[ yy_n ];
goto yy_stack;
}
/*
** current state has no shift on
** "error", pop stack
*/
#if YYDEBUG
# define _POP_ "Error recovery pops state %d, uncovers state %d\n"
if ( yydebug )
fprintf(file, _POP_, *yy_ps,
yy_ps[-1] );
# undef _POP_
#endif
yy_ps--;
yy_pv--;
}
/*
** there is no state on stack with "error" as
** a valid shift. give up.
*/
YYABORT;
case 3: /* no shift yet; eat a token */
#if YYDEBUG
/*
** if debugging, look up token in list of
** pairs. 0 and negative shouldn't occur,
** but since timing doesn't matter when
** debugging, it doesn't hurt to leave the
** tests here.
*/
if ( yydebug )
{
register int yy_i;
fprintf(file, "Error recovery discards " );
if ( yychar == 0 )
fprintf(file, "token end-of-file\n" );
else if ( yychar < 0 )
fprintf(file, "token -none-\n" );
else
{
for ( yy_i = 0;
yytoks[yy_i].t_val >= 0;
yy_i++ )
{
if ( yytoks[yy_i].t_val
== yychar )
{
break;
}
}
fprintf(file, "token %s\n",
yytoks[yy_i].t_name );
}
}
#endif /* YYDEBUG */
if ( yychar == 0 ) /* reached EOF. quit */
YYABORT;
yychar = -1;
goto yy_newstate;
}
}/* end if ( yy_n == 0 ) */
/*
** reduction by production yy_n
** put stack tops, etc. so things right after switch
*/
#if YYDEBUG
/*
** if debugging, print the string that is the user's
** specification of the reduction which is just about
** to be done.
*/
if ( yydebug )
fprintf(file, "Reduce by (%d) \"%s\"\n",
yy_n, yyreds[ yy_n ] );
#endif
yytmp = yy_n; /* value to switch over */
yypvt = yy_pv; /* $vars top of value stack */
/*
** Look in goto table for next state
** Sorry about using yy_state here as temporary
** register variable, but why not, if it works...
** If yyr2[ yy_n ] doesn't have the low order bit
** set, then there is no action to be done for
** this reduction. So, no saving & unsaving of
** registers done. The only difference between the
** code just after the if and the body of the if is
** the goto yy_stack in the body. This way the test
** can be made before the choice of what to do is needed.
*/
{
/* length of production doubled with extra bit */
register int yy_len = yyr2[ yy_n ];
if ( !( yy_len & 01 ) )
{
yy_len >>= 1;
yyval = ( yy_pv -= yy_len )[1]; /* $$ = $1 */
yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] +
*( yy_ps -= yy_len ) + 1;
if ( yy_state >= YYLAST ||
yychk[ yy_state =
yyact[ yy_state ] ] != -yy_n )
{
yy_state = yyact[ yypgo[ yy_n ] ];
}
goto yy_stack;
}
yy_len >>= 1;
yyval = ( yy_pv -= yy_len )[1]; /* $$ = $1 */
yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] +
*( yy_ps -= yy_len ) + 1;
if ( yy_state >= YYLAST ||
yychk[ yy_state = yyact[ yy_state ] ] != -yy_n )
{
yy_state = yyact[ yypgo[ yy_n ] ];
}
}
/* save until reenter driver code */
yystate = yy_state;
yyps = yy_ps;
yypv = yy_pv;
}
/*
** code supplied by user is placed in this switch
*/
switch( yytmp )
{
case 3: /* Statement : FOR T FROM Expr TO Expr STEP Expr DRAW L_BRACKET Expr COMMA Expr R_BRACKET */
# line 31 "funcdraw.y"
{ start = GetExprValue(yypvt[-10]);
end = GetExprValue(yypvt[-8]);
step = GetExprValue(yypvt[-6]);
DrawLoop(start, end, step, yypvt[-3], yypvt[-1]) ;
} break;
case 4: /* Statement : ORIGIN IS L_BRACKET Expr COMMA Expr R_BRACKET */
# line 37 "funcdraw.y"
{ Origin_x = GetExprValue(yypvt[-3]);
Origin_y = GetExprValue(yypvt[-1]);
} break;
case 5: /* Statement : SCALE IS L_BRACKET Expr COMMA Expr R_BRACKET */
# line 41 "funcdraw.y"
{ Scale_x = GetExprValue(yypvt[-3]);
Scale_y = GetExprValue(yypvt[-1]);
} break;
case 6: /* Statement : ROT IS Expr */
# line 45 "funcdraw.y"
{ Rot_angle = GetExprValue(yypvt[-0]);
} break;
case 7: /* Expr : T */
# line 49 "funcdraw.y"
{ yyval = MakeExprNode(T); } break;
case 8: /* Expr : CONST_ID */
# line 50 "funcdraw.y"
{ yyval = MakeExprNode(CONST_ID, tokens.value); } break;
case 9: /* Expr : Expr PLUS Expr */
# line 51 "funcdraw.y"
{ yyval = MakeExprNode(PLUS, yypvt[-2], yypvt[-0]); } break;
case 10: /* Expr : Expr MINUS Expr */
# line 52 "funcdraw.y"
{ yyval = MakeExprNode(MINUS, yypvt[-2], yypvt[-0]); } break;
case 11: /* Expr : Expr MUL Expr */
# line 53 "funcdraw.y"
{ yyval = MakeExprNode(MUL, yypvt[-2], yypvt[-0]); } break;
case 12: /* Expr : Expr DIV Expr */
# line 54 "funcdraw.y"
{ yyval = MakeExprNode(DIV, yypvt[-2], yypvt[-0]); } break;
case 13: /* Expr : Expr POWER Expr */
# line 55 "funcdraw.y"
{ yyval = MakeExprNode(POWER, yypvt[-2], yypvt[-0]); } break;
case 14: /* Expr : L_BRACKET Expr R_BRACKET */
# line 56 "funcdraw.y"
{ yyval = yypvt[-1]; } break;
case 15: /* Expr : PLUS Expr */
# line 57 "funcdraw.y"
{ yyval = yypvt[-0]; } break;
case 16: /* Expr : MINUS Expr */
# line 59 "funcdraw.y"
{ yyval = MakeExprNode(MINUS, MakeExprNode(CONST_ID, 0.0), yypvt[-0]); } break;
case 17: /* Expr : FUNC L_BRACKET Expr R_BRACKET */
# line 60 "funcdraw.y"
{ yyval = MakeExprNode(FUNC, tokens.FuncPtr, yypvt[-1]);} break;
case 18: /* Expr : ERRTOKEN */
# line 61 "funcdraw.y"
{ yyerror("error token in the input");} break;
}
goto yystack; /* reset registers in driver code */
}
# ifndef YY_ADVANCE_ERROR_HOLD_NOT_USED
yyinsert (token,value)
int token;
YYSTYPE value;
{
int yyn;
if ( ( yyn = yypact[ *yyps ] ) <= YYFLAG )
return 0 ;
if ( ( ( yyn += token ) < 0 ) || ( yyn >= YYLAST ) )
return 0 ;
if ( yychk[ yyn = yyact[ yyn ] ] != token )
return 0 ;
yystate = yyn;
if ( ++yyps >= &yys[ YYMAXDEPTH ] )
{
yyerror( "yacc stack overflow" );
return 0 ;
}
*yyps = yystate;
*++yypv = value;
return 1 ;
}
int yyexpect (int token)
{
while (yychar && yychar != (token))
if ((yychar = yylex()) <=0)
yychar = 0;
return yychar != 0;
}
# endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -