?? ytab.c
字號:
register int yy_i;
printf( "State %d, token ", yy_state );
if ( yychar == 0 )
printf( "end-of-file\n" );
else if ( yychar < 0 )
printf( "-none-\n" );
else
{
for ( yy_i = 0; yytoks[yy_i].t_val >= 0;
yy_i++ )
{
if ( yytoks[yy_i].t_val == yychar )
break;
}
printf( "%s\n", yytoks[yy_i].t_name );
}
}
#endif /* YYDEBUG */
if ( ++yy_ps >= &yys[ YYMAXDEPTH ] ) /* room on stack? */
{
yyerror( "yacc stack overflow" );
YYABORT;
}
*yy_ps = yy_state;
*++yy_pv = yyval;
/*
** 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;
printf( "Received token " );
if ( yychar == 0 )
printf( "end-of-file\n" );
else if ( yychar < 0 )
printf( "-none-\n" );
else
{
for ( yy_i = 0; yytoks[yy_i].t_val >= 0;
yy_i++ )
{
if ( yytoks[yy_i].t_val == yychar )
break;
}
printf( "%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;
printf( "Received token " );
if ( yychar == 0 )
printf( "end-of-file\n" );
else if ( yychar < 0 )
printf( "-none-\n" );
else
{
for ( yy_i = 0;
yytoks[yy_i].t_val >= 0;
yy_i++ )
{
if ( yytoks[yy_i].t_val
== yychar )
{
break;
}
}
printf( "%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 )
printf( _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;
printf( "Error recovery discards " );
if ( yychar == 0 )
printf( "token end-of-file\n" );
else if ( yychar < 0 )
printf( "token -none-\n" );
else
{
for ( yy_i = 0;
yytoks[yy_i].t_val >= 0;
yy_i++ )
{
if ( yytoks[yy_i].t_val
== yychar )
{
break;
}
}
printf( "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 )
printf( "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 1:
# line 203 "c.y"
{
PARSE_INFO("translation_unit :external_declaration")
} break;
case 2:
# line 207 "c.y"
{
PARSE_INFO("translation_unit :translation_unit external_declaration")
} break;
case 3:
# line 214 "c.y"
{
PARSE_INFO("external_declaration :function_definition")
} break;
case 4:
# line 218 "c.y"
{
PARSE_INFO("external_declaration :declaration")
// gen globe value
gen_globe_var_list(yypvt[-0].p_symbol);
} break;
case 5:
# line 224 "c.y"
{
PARSE_INFO("external_declaration :control_line")
} break;
case 6:
# line 231 "c.y"
{
PARSE_INFO("function_definition :declaration_specifiers declarator ")
assert( IS_FUNCTION(yypvt[-0].p_symbol) );
unoin_specifier_to_declarator(yypvt[-1].p_symbol, yypvt[-0].p_symbol);
del_symbol( yypvt[-1].p_symbol );
check_function_retval(yypvt[-0].p_symbol);
// yypvt[-0].p_symbol->args point to parameter list
// so we can tell the compound statement to link the parameters
// assign yypvt[-0].p_symbol->args to sg_parameter_list to tell compound statement
sg_parameter_list = yypvt[-0].p_symbol->args;
// add function definition to sg_function_symtab
// for function call itself
// can search in function definition table
yypvt[-0].p_symbol = add_function_def_to_functab(yypvt[-0].p_symbol);
// for compound statement code genc in code2 files
open_code2();
// set return label
set_return_label(get_a_label());
// create goto label symtab
create_goto_label_symtab();
} break;
case 7:
# line 254 "c.y"
{
PARSE_INFO("compound_statement")
// destory the goto label
destory_goto_label_symtab();
// gen return label
gen_return_label();
// set func offset
set_func_offset(yypvt[-2].p_symbol);
// gen function head
gen_func_head(yypvt[-2].p_symbol);
// copy compound statement in code2 to code
copy_code2_code();
// add function end
gen_func_end(yypvt[-2].p_symbol);
// since compound statement code has copy to code file,
// then close code2 for next function
close_code2();
yyval.p_symbol = yypvt[-2].p_symbol;
} break;
case 8:
# line 276 "c.y"
{
PARSE_INFO("function_definition :declarator ")
assert( IS_FUNCTION(yypvt[-0].p_symbol) );
// default the function return value is int
yypvt[-0].p_symbol->NOUN = SPEC_INT;
// yypvt[-0].p_symbol->args point to parameter list
// so we can tell the compound statement to link the parameters
// assign yypvt[-0].p_symbol->args to sg_parameter_list to tell compound statement
sg_parameter_list = yypvt[-0].p_symbol->args;
// add function definition to sg_function_symtab
// for function call itself
// can search in function definition table
yypvt[-0].p_symbol = add_function_def_to_functab(yypvt[-0].p_symbol);
// for compound statement code genc in code2 files
open_code2();
// set return label
set_return_label(get_a_label());
// create goto label symtab
create_goto_label_symtab();
} break;
case 9:
# line 298 "c.y"
{
PARSE_INFO("compound_statement")
// destory the goto label
destory_goto_label_symtab();
// gen return label
gen_return_label();
// set func offset
set_func_offset(yypvt[-2].p_symbol);
// gen function head
gen_func_head(yypvt[-2].p_symbol);
// copy compound statement in code2 to code
copy_code2_code();
// add function end
gen_func_end(yypvt[-2].p_symbol);
// since compound statement code has copy to code file,
// then close code2 for next function
close_code2();
} break;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -