// Copyright (c) 1993-1999 Microsoft Corporation /* SCCSWHAT( "@(#)yypars.c 2.4 88/05/09 15:22:59 " ) */ ___a_r_u_start static char *SCCSID = "@(#)yypars.c:1.3"; # define YYFLAG -1000 # define YYERROR goto yyerrlab # define YYACCEPT return(0) # define YYABORT return(1) #ifdef YYDEBUG /* RRR - 10/9/85 */ #define yyprintf(a, b, c, d, e) printf(a, b, c, d, e) #else #define yyprintf(a, b, c, d) #endif #ifndef YYPRINT #define YYPRINT printf #endif #if ! defined YYSTATIC #define YYSTATIC #endif /* parser for yacc output */ #ifdef YYDEBUG YYSTATIC int yydebug = 0; /* 1 for debugging */ #endif YYSTATIC YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */ YYSTATIC short yys[YYMAXDEPTH]; /* the parse stack */ YYSTATIC int yychar = -1; /* current input token number */ YYSTATIC int yynerrs = 0; /* number of errors */ YYSTATIC short yyerrflag = 0; /* error recovery flag */ #ifdef YYRECOVER /* ** yyscpy : copy f onto t and return a ptr to the null terminator at the ** end of t. */ YYSTATIC char *yyscpy(t,f) register char *t, *f; { while(*t = *f++) t++; return(t); /* ptr to the null char */ } #endif #ifndef YYNEAR #define YYNEAR #endif #ifndef YYPASCAL #define YYPASCAL #endif #ifndef YYLOCAL #define YYLOCAL #endif #if ! defined YYPARSER #define YYPARSER yyparse #endif #if ! defined YYLEX #define YYLEX yylex #endif static void yy_vc_init(); typedef void (*pfn)(); static pfn *pcase_fn_array; static int returnflag = 0; static YYSTYPE *yypvt; static int yym_vc_max = 0; extern short GrammarAct; extern short yysavestate; #define MAX_RECOVERY_ATTEMPTS (50) #define MAX_RETRY_COUNT (3) static short RetryCount = 0; static short MaxRecoveryAttempts = 0; static short fJustDiscarded = 0; YYLOCAL YYNEAR YYPASCAL YYPARSER() { register short yyn; short yystate, *yyps, *yysave_yyps; YYSTYPE *yypv,*yysave_yypv; YYSTYPE yysave_yyval; short yyj, yym; short fHaveRecoveredChar = 0; yy_vc_init(); #ifdef YYDEBUG yydebug = 1; #endif /* YYDEBUG */ yystate = 0; yychar = -1; yynerrs = 0; yyerrflag = 0; yyps= &yys[-1]; yypv= &yyv[-1]; yystack: /* put a state and value onto the stack */ RetryCount = 0; #ifdef YYDEBUG yyprintf( "[yydebug] state %d, char %d = %c\n", yystate, yychar,yychar, 0 ); #else /* YYDEBUG */ yyprintf( "[yydebug] state %d, char %d\n", yystate, yychar, 0 ); #endif /* YYDEBUG */ if( ++yyps > &yys[YYMAXDEPTH] ) { /* yyerror( "yacc stack overflow" ); */ ParseError(C_STACK_OVERFLOW, (char *)NULL); return(1); } *yyps = yystate; ++yypv; #ifdef UNION yyunion(yypv, &yyval); #else *yypv = yyval; #endif yynewstate: yysavestate = yystate; yysave_yypv = yypv; yysave_yyval= yyval; yysave_yyps = yyps; yyn = yypact[yystate]; if( yyn <= YYFLAG ) { /* simple state, no lookahead */ goto yydefault; } if( ! fHaveRecoveredChar ) { if( yychar < 0 ) /* need a lookahead */ { yychar = YYLEX(); } } fHaveRecoveredChar = 0; if( ((yyn += yychar) < 0) || (yyn >= YYLAST) ) { goto yydefault; } if( yychk[ yyn = yyact[ yyn ] ] == yychar ) { /* valid shift */ yychar = -1; #ifdef UNION yyunion(&yyval, &yylval); #else yyval = yylval; #endif yystate = yyn; if( yyerrflag > 0 ) { --yyerrflag; } goto yystack; } yydefault: /* default state action */ if( (yyn = yydef[yystate]) == -2 ) { register short *yyxi; if( yychar < 0 ) { yychar = YYLEX(); } /* ** search exception table, we find a -1 followed by the current state. ** if we find one, we'll look through terminal,state pairs. if we find ** a terminal which matches the current one, we have a match. ** the exception table is when we have a reduce on a terminal. */ #if YYOPTTIME yyxi = yyexca + yyexcaind[yystate]; while(( *yyxi != yychar ) && ( *yyxi >= 0 )){ yyxi += 2; } #else for(yyxi = yyexca; (*yyxi != (-1)) || (yyxi[1] != yystate); yyxi += 2 ) { ; /* VOID */ } while( *(yyxi += 2) >= 0 ){ if( *yyxi == yychar ) { break; } } #endif if( (yyn = yyxi[1]) < 0 ) { return(0); /* accept */ } } if( yyn == 0 ) /* error */ { int yytempchar; if( (yychar != EOI ) && ( RetryCount < MAX_RETRY_COUNT ) && ( MaxRecoveryAttempts < MAX_RECOVERY_ATTEMPTS ) ) { if( RetryCount == 0 ) SyntaxError( BENIGN_SYNTAX_ERROR, yysavestate ); if((( yytempchar = PossibleMissingToken( yysavestate, yychar ) ) != -1 )) { char Buf[ 50 ]; fHaveRecoveredChar = 1; yyunlex( yychar ); yychar = yytempchar; if( (yytempchar < 128 ) && isprint( yytempchar ) ) { sprintf( Buf, " %c ", yytempchar ); } else if( yytempchar == IDENTIFIER ) { yylval.yy_pSymName = GenTempName(); sprintf( Buf, " identifier %s", yylval.yy_pSymName ); } else if( (yytempchar == NUMERICCONSTANT ) || (yytempchar == NUMERICLONGCONSTANT ) || (yytempchar == NUMERICULONGCONSTANT ) || (yytempchar == HEXCONSTANT ) || (yytempchar == HEXLONGCONSTANT ) || (yytempchar == HEXULONGCONSTANT ) ) { sprintf( Buf, "a number" ); yylval.yy_numeric.Val = 0; yylval.yy_numeric.pValStr = new char[2]; strcpy( yylval.yy_numeric.pValStr, "0"); } ParseError( ASSUMING_CHAR, Buf ); RetryCount = 0; MaxRecoveryAttempts++; fJustDiscarded = 0; } else { char buf[ 20 ]; if( (yychar < 128 ) && isprint( yychar ) ) { sprintf( buf, " %c ", yychar ); } else { sprintf( buf, " the last token " ); } ParseError( DISCARDING_CHAR, buf ); yychar = -1; RetryCount++; MaxRecoveryAttempts++; fJustDiscarded = 1; } yystate = yysavestate; yypv = yysave_yypv; yyval = yysave_yyval; yyps = yysave_yyps; goto yynewstate; } else if( (yychar == EOI ) && (fJustDiscarded == 0 ) ) { SyntaxError( UNEXPECTED_END_OF_FILE, yysavestate ); return 1; } else { SyntaxError( SYNTAX_ERROR, yysavestate ); return 1; } } /* reduction by production yyn */ /* yyreduce: */ { #ifdef YYDEBUG yyprintf("[yydebug] reduce %d\n",yyn, 0, 0, 0); #else /* YYDEBUG */ yyprintf("[yydebug] reduce %d\n",yyn, 0, 0); #endif /* YYDEBUG */ yypvt = yypv; yyps -= yyr2[yyn]; yypv -= yyr2[yyn]; #ifdef UNION yyunion(&yyval, &yypv[1]); #else yyval = yypv[1]; #endif yym = yyn; yyn = yyr1[yyn]; /* consult goto table to find next state */ yyj = yypgo[yyn] + *yyps + 1; if( (yyj >= YYLAST) || (yychk[ yystate = yyact[yyj] ] != -yyn) ) { yystate = yyact[yypgo[yyn]]; } returnflag = 0; GrammarAct = yym; (*(pcase_fn_array[ (yym <= yym_vc_max) ? yym : 0 ]))(); if(returnflag != 0) return returnflag; } goto yystack; /* stack new state and value */ } ___a_r_u_myact $A ___a_r_u_end