1 /* original parser id follows */ 2 /* yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93" */ 3 /* (use YYMAJOR/YYMINOR for ifdefs dependent on parser version) */ 4 5 #define YYBYACC 1 6 #define YYMAJOR 1 7 #define YYMINOR 9 8 #define YYCHECK "yyyymmdd" 9 10 #define YYEMPTY (-1) 11 #define yyclearin (yychar = YYEMPTY) 12 #define yyerrok (yyerrflag = 0) 13 #define YYRECOVERING() (yyerrflag != 0) 14 #define YYENOMEM (-2) 15 #define YYEOF 0 16 17 #ifndef yyparse 18 #define yyparse calc_parse 19 #endif /* yyparse */ 20 21 #ifndef yylex 22 #define yylex calc_lex 23 #endif /* yylex */ 24 25 #ifndef yyerror 26 #define yyerror calc_error 27 #endif /* yyerror */ 28 29 #ifndef yychar 30 #define yychar calc_char 31 #endif /* yychar */ 32 33 #ifndef yyval 34 #define yyval calc_val 35 #endif /* yyval */ 36 37 #ifndef yylval 38 #define yylval calc_lval 39 #endif /* yylval */ 40 41 #ifndef yydebug 42 #define yydebug calc_debug 43 #endif /* yydebug */ 44 45 #ifndef yynerrs 46 #define yynerrs calc_nerrs 47 #endif /* yynerrs */ 48 49 #ifndef yyerrflag 50 #define yyerrflag calc_errflag 51 #endif /* yyerrflag */ 52 53 #ifndef yylhs 54 #define yylhs calc_lhs 55 #endif /* yylhs */ 56 57 #ifndef yylen 58 #define yylen calc_len 59 #endif /* yylen */ 60 61 #ifndef yydefred 62 #define yydefred calc_defred 63 #endif /* yydefred */ 64 65 #ifndef yydgoto 66 #define yydgoto calc_dgoto 67 #endif /* yydgoto */ 68 69 #ifndef yysindex 70 #define yysindex calc_sindex 71 #endif /* yysindex */ 72 73 #ifndef yyrindex 74 #define yyrindex calc_rindex 75 #endif /* yyrindex */ 76 77 #ifndef yygindex 78 #define yygindex calc_gindex 79 #endif /* yygindex */ 80 81 #ifndef yytable 82 #define yytable calc_table 83 #endif /* yytable */ 84 85 #ifndef yycheck 86 #define yycheck calc_check 87 #endif /* yycheck */ 88 89 #ifndef yyname 90 #define yyname calc_name 91 #endif /* yyname */ 92 93 #ifndef yyrule 94 #define yyrule calc_rule 95 #endif /* yyrule */ 96 #define YYPREFIX "calc_" 97 98 #define YYPURE 1 99 100 #line 2 "pure_calc.y" 101 # include <stdio.h> 102 # include <ctype.h> 103 104 int regs[26]; 105 int base; 106 107 #ifdef YYBISON 108 #define YYSTYPE int 109 #define YYLEX_PARAM &yylval 110 #define YYLEX_DECL() yylex(YYSTYPE *yylval) 111 #define YYERROR_DECL() yyerror(const char *s) 112 int YYLEX_DECL(); 113 static void YYERROR_DECL(); 114 #endif 115 116 #line 117 "pure_calc.tab.c" 117 118 #if ! defined(YYSTYPE) && ! defined(YYSTYPE_IS_DECLARED) 119 /* Default: YYSTYPE is the semantic value type. */ 120 typedef int YYSTYPE; 121 # define YYSTYPE_IS_DECLARED 1 122 #endif 123 124 /* compatibility with bison */ 125 #ifdef YYPARSE_PARAM 126 /* compatibility with FreeBSD */ 127 # ifdef YYPARSE_PARAM_TYPE 128 # define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) 129 # else 130 # define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) 131 # endif 132 #else 133 # define YYPARSE_DECL() yyparse(void) 134 #endif 135 136 /* Parameters sent to lex. */ 137 #ifdef YYLEX_PARAM 138 # ifdef YYLEX_PARAM_TYPE 139 # define YYLEX_DECL() yylex(YYSTYPE *yylval, YYLEX_PARAM_TYPE YYLEX_PARAM) 140 # else 141 # define YYLEX_DECL() yylex(YYSTYPE *yylval, void * YYLEX_PARAM) 142 # endif 143 # define YYLEX yylex(&yylval, YYLEX_PARAM) 144 #else 145 # define YYLEX_DECL() yylex(YYSTYPE *yylval) 146 # define YYLEX yylex(&yylval) 147 #endif 148 149 /* Parameters sent to yyerror. */ 150 #ifndef YYERROR_DECL 151 #define YYERROR_DECL() yyerror(const char *s) 152 #endif 153 #ifndef YYERROR_CALL 154 #define YYERROR_CALL(msg) yyerror(msg) 155 #endif 156 157 extern int YYPARSE_DECL(); 158 159 #define DIGIT 257 160 #define LETTER 258 161 #define UMINUS 259 162 #define YYERRCODE 256 163 typedef int YYINT; 164 static const YYINT calc_lhs[] = { -1, 165 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 166 2, 2, 2, 2, 2, 2, 3, 3, 167 }; 168 static const YYINT calc_len[] = { 2, 169 0, 3, 3, 1, 3, 3, 3, 3, 3, 3, 170 3, 3, 3, 2, 1, 1, 1, 2, 171 }; 172 static const YYINT calc_defred[] = { 1, 173 0, 0, 17, 0, 0, 0, 0, 0, 0, 3, 174 0, 15, 14, 0, 2, 0, 0, 0, 0, 0, 175 0, 0, 18, 0, 6, 0, 0, 0, 0, 9, 176 10, 11, 177 }; 178 static const YYINT calc_dgoto[] = { 1, 179 7, 8, 9, 180 }; 181 static const YYINT calc_sindex[] = { 0, 182 -40, -7, 0, -55, -38, -38, 1, -29, -247, 0, 183 -38, 0, 0, 22, 0, -38, -38, -38, -38, -38, 184 -38, -38, 0, -29, 0, 51, 60, -20, -20, 0, 185 0, 0, 186 }; 187 static const YYINT calc_rindex[] = { 0, 188 0, 0, 0, 2, 0, 0, 0, 9, -9, 0, 189 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 190 0, 0, 0, 10, 0, -6, 14, 5, 13, 0, 191 0, 0, 192 }; 193 static const YYINT calc_gindex[] = { 0, 194 0, 65, 0, 195 }; 196 #define YYTABLESIZE 220 197 static const YYINT calc_table[] = { 6, 198 16, 6, 10, 13, 5, 11, 5, 22, 17, 23, 199 15, 15, 20, 18, 7, 19, 22, 21, 4, 5, 200 0, 20, 8, 12, 0, 0, 21, 16, 16, 0, 201 0, 16, 16, 16, 13, 16, 0, 16, 15, 15, 202 0, 0, 7, 15, 15, 7, 15, 7, 15, 7, 203 8, 12, 0, 8, 12, 8, 0, 8, 22, 17, 204 0, 0, 25, 20, 18, 0, 19, 0, 21, 13, 205 14, 0, 0, 0, 0, 24, 0, 0, 0, 0, 206 26, 27, 28, 29, 30, 31, 32, 22, 17, 0, 207 0, 0, 20, 18, 16, 19, 22, 21, 0, 0, 208 0, 20, 18, 0, 19, 0, 21, 0, 0, 0, 209 0, 0, 0, 0, 16, 0, 0, 13, 0, 0, 210 0, 0, 0, 0, 0, 15, 0, 0, 7, 0, 211 0, 0, 0, 0, 0, 0, 8, 12, 0, 0, 212 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 213 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 214 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 217 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219 0, 0, 0, 0, 0, 2, 3, 4, 3, 12, 220 }; 221 static const YYINT calc_check[] = { 40, 222 10, 40, 10, 10, 45, 61, 45, 37, 38, 257, 223 10, 10, 42, 43, 10, 45, 37, 47, 10, 10, 224 -1, 42, 10, 10, -1, -1, 47, 37, 38, -1, 225 -1, 41, 42, 43, 41, 45, -1, 47, 37, 38, 226 -1, -1, 38, 42, 43, 41, 45, 43, 47, 45, 227 38, 38, -1, 41, 41, 43, -1, 45, 37, 38, 228 -1, -1, 41, 42, 43, -1, 45, -1, 47, 5, 229 6, -1, -1, -1, -1, 11, -1, -1, -1, -1, 230 16, 17, 18, 19, 20, 21, 22, 37, 38, -1, 231 -1, -1, 42, 43, 124, 45, 37, 47, -1, -1, 232 -1, 42, 43, -1, 45, -1, 47, -1, -1, -1, 233 -1, -1, -1, -1, 124, -1, -1, 124, -1, -1, 234 -1, -1, -1, -1, -1, 124, -1, -1, 124, -1, 235 -1, -1, -1, -1, -1, -1, 124, 124, -1, -1, 236 -1, -1, -1, -1, -1, 124, -1, -1, -1, -1, 237 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 238 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 239 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 240 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 241 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 242 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 243 -1, -1, -1, -1, -1, 256, 257, 258, 257, 258, 244 }; 245 #define YYFINAL 1 246 #ifndef YYDEBUG 247 #define YYDEBUG 0 248 #endif 249 #define YYMAXTOKEN 259 250 #define YYUNDFTOKEN 265 251 #define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? YYUNDFTOKEN : (a)) 252 #if YYDEBUG 253 static const char *const calc_name[] = { 254 255 "end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 256 0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0, 257 0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 258 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0, 259 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 260 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 261 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 262 0,0,0,0,0,0,"DIGIT","LETTER","UMINUS",0,0,0,0,0,"illegal-symbol", 263 }; 264 static const char *const calc_rule[] = { 265 "$accept : list", 266 "list :", 267 "list : list stat '\\n'", 268 "list : list error '\\n'", 269 "stat : expr", 270 "stat : LETTER '=' expr", 271 "expr : '(' expr ')'", 272 "expr : expr '+' expr", 273 "expr : expr '-' expr", 274 "expr : expr '*' expr", 275 "expr : expr '/' expr", 276 "expr : expr '%' expr", 277 "expr : expr '&' expr", 278 "expr : expr '|' expr", 279 "expr : '-' expr", 280 "expr : LETTER", 281 "expr : number", 282 "number : DIGIT", 283 "number : number DIGIT", 284 285 }; 286 #endif 287 288 int yydebug; 289 int yynerrs; 290 291 /* define the initial stack-sizes */ 292 #ifdef YYSTACKSIZE 293 #undef YYMAXDEPTH 294 #define YYMAXDEPTH YYSTACKSIZE 295 #else 296 #ifdef YYMAXDEPTH 297 #define YYSTACKSIZE YYMAXDEPTH 298 #else 299 #define YYSTACKSIZE 10000 300 #define YYMAXDEPTH 10000 301 #endif 302 #endif 303 304 #define YYINITSTACKSIZE 200 305 306 typedef struct { 307 unsigned stacksize; 308 YYINT *s_base; 309 YYINT *s_mark; 310 YYINT *s_last; 311 YYSTYPE *l_base; 312 YYSTYPE *l_mark; 313 } YYSTACKDATA; 314 #line 72 "pure_calc.y" 315 /* start of programs */ 316 317 #ifdef YYBYACC 318 static int YYLEX_DECL(); 319 #endif 320 321 int 322 main (void) 323 { 324 while(!feof(stdin)) { 325 yyparse(); 326 } 327 return 0; 328 } 329 330 static void 331 YYERROR_DECL() 332 { 333 fprintf(stderr, "%s\n", s); 334 } 335 336 int 337 YYLEX_DECL() 338 { 339 /* lexical analysis routine */ 340 /* returns LETTER for a lower case letter, yylval = 0 through 25 */ 341 /* return DIGIT for a digit, yylval = 0 through 9 */ 342 /* all other characters are returned immediately */ 343 344 int c; 345 346 while( (c=getchar()) == ' ' ) { /* skip blanks */ } 347 348 /* c is now nonblank */ 349 350 if( islower( c )) { 351 *yylval = c - 'a'; 352 return ( LETTER ); 353 } 354 if( isdigit( c )) { 355 *yylval = c - '0'; 356 return ( DIGIT ); 357 } 358 return( c ); 359 } 360 #line 361 "pure_calc.tab.c" 361 362 #if YYDEBUG 363 #include <stdio.h> /* needed for printf */ 364 #endif 365 366 #include <stdlib.h> /* needed for malloc, etc */ 367 #include <string.h> /* needed for memset */ 368 369 /* allocate initial stack or double stack size, up to YYMAXDEPTH */ 370 static int yygrowstack(YYSTACKDATA *data) 371 { 372 int i; 373 unsigned newsize; 374 YYINT *newss; 375 YYSTYPE *newvs; 376 377 if ((newsize = data->stacksize) == 0) 378 newsize = YYINITSTACKSIZE; 379 else if (newsize >= YYMAXDEPTH) 380 return YYENOMEM; 381 else if ((newsize *= 2) > YYMAXDEPTH) 382 newsize = YYMAXDEPTH; 383 384 i = (int) (data->s_mark - data->s_base); 385 newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss)); 386 if (newss == 0) 387 return YYENOMEM; 388 389 data->s_base = newss; 390 data->s_mark = newss + i; 391 392 newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); 393 if (newvs == 0) 394 return YYENOMEM; 395 396 data->l_base = newvs; 397 data->l_mark = newvs + i; 398 399 data->stacksize = newsize; 400 data->s_last = data->s_base + newsize - 1; 401 return 0; 402 } 403 404 #if YYPURE || defined(YY_NO_LEAKS) 405 static void yyfreestack(YYSTACKDATA *data) 406 { 407 free(data->s_base); 408 free(data->l_base); 409 memset(data, 0, sizeof(*data)); 410 } 411 #else 412 #define yyfreestack(data) /* nothing */ 413 #endif 414 415 #define YYABORT goto yyabort 416 #define YYREJECT goto yyabort 417 #define YYACCEPT goto yyaccept 418 #define YYERROR goto yyerrlab 419 420 int 421 YYPARSE_DECL() 422 { 423 int yyerrflag; 424 int yychar; 425 YYSTYPE yyval; 426 YYSTYPE yylval; 427 428 /* variables for the parser stack */ 429 YYSTACKDATA yystack; 430 int yym, yyn, yystate; 431 #if YYDEBUG 432 const char *yys; 433 434 if ((yys = getenv("YYDEBUG")) != 0) 435 { 436 yyn = *yys; 437 if (yyn >= '0' && yyn <= '9') 438 yydebug = yyn - '0'; 439 } 440 #endif 441 442 memset(&yyval, 0, sizeof(yyval)); 443 memset(&yylval, 0, sizeof(yylval)); 444 445 yym = 0; 446 yyn = 0; 447 yynerrs = 0; 448 yyerrflag = 0; 449 yychar = YYEMPTY; 450 yystate = 0; 451 452 #if YYPURE 453 memset(&yystack, 0, sizeof(yystack)); 454 #endif 455 456 if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 457 yystack.s_mark = yystack.s_base; 458 yystack.l_mark = yystack.l_base; 459 yystate = 0; 460 *yystack.s_mark = 0; 461 462 yyloop: 463 if ((yyn = yydefred[yystate]) != 0) goto yyreduce; 464 if (yychar < 0) 465 { 466 yychar = YYLEX; 467 if (yychar < 0) yychar = YYEOF; 468 #if YYDEBUG 469 if (yydebug) 470 { 471 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN]; 472 printf("%sdebug: state %d, reading %d (%s)\n", 473 YYPREFIX, yystate, yychar, yys); 474 } 475 #endif 476 } 477 if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 && 478 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar) 479 { 480 #if YYDEBUG 481 if (yydebug) 482 printf("%sdebug: state %d, shifting to state %d\n", 483 YYPREFIX, yystate, yytable[yyn]); 484 #endif 485 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 486 yystate = yytable[yyn]; 487 *++yystack.s_mark = yytable[yyn]; 488 *++yystack.l_mark = yylval; 489 yychar = YYEMPTY; 490 if (yyerrflag > 0) --yyerrflag; 491 goto yyloop; 492 } 493 if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 && 494 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar) 495 { 496 yyn = yytable[yyn]; 497 goto yyreduce; 498 } 499 if (yyerrflag != 0) goto yyinrecovery; 500 501 YYERROR_CALL("syntax error"); 502 503 goto yyerrlab; /* redundant goto avoids 'unused label' warning */ 504 yyerrlab: 505 ++yynerrs; 506 507 yyinrecovery: 508 if (yyerrflag < 3) 509 { 510 yyerrflag = 3; 511 for (;;) 512 { 513 if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 && 514 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE) 515 { 516 #if YYDEBUG 517 if (yydebug) 518 printf("%sdebug: state %d, error recovery shifting\ 519 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); 520 #endif 521 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 522 yystate = yytable[yyn]; 523 *++yystack.s_mark = yytable[yyn]; 524 *++yystack.l_mark = yylval; 525 goto yyloop; 526 } 527 else 528 { 529 #if YYDEBUG 530 if (yydebug) 531 printf("%sdebug: error recovery discarding state %d\n", 532 YYPREFIX, *yystack.s_mark); 533 #endif 534 if (yystack.s_mark <= yystack.s_base) goto yyabort; 535 --yystack.s_mark; 536 --yystack.l_mark; 537 } 538 } 539 } 540 else 541 { 542 if (yychar == YYEOF) goto yyabort; 543 #if YYDEBUG 544 if (yydebug) 545 { 546 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN]; 547 printf("%sdebug: state %d, error recovery discards token %d (%s)\n", 548 YYPREFIX, yystate, yychar, yys); 549 } 550 #endif 551 yychar = YYEMPTY; 552 goto yyloop; 553 } 554 555 yyreduce: 556 #if YYDEBUG 557 if (yydebug) 558 printf("%sdebug: state %d, reducing by rule %d (%s)\n", 559 YYPREFIX, yystate, yyn, yyrule[yyn]); 560 #endif 561 yym = yylen[yyn]; 562 if (yym > 0) 563 yyval = yystack.l_mark[1-yym]; 564 else 565 memset(&yyval, 0, sizeof yyval); 566 567 switch (yyn) 568 { 569 case 3: 570 #line 34 "pure_calc.y" 571 { yyerrok ; } 572 break; 573 case 4: 574 #line 38 "pure_calc.y" 575 { printf("%d\n",yystack.l_mark[0]);} 576 break; 577 case 5: 578 #line 40 "pure_calc.y" 579 { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } 580 break; 581 case 6: 582 #line 44 "pure_calc.y" 583 { yyval = yystack.l_mark[-1]; } 584 break; 585 case 7: 586 #line 46 "pure_calc.y" 587 { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } 588 break; 589 case 8: 590 #line 48 "pure_calc.y" 591 { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } 592 break; 593 case 9: 594 #line 50 "pure_calc.y" 595 { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } 596 break; 597 case 10: 598 #line 52 "pure_calc.y" 599 { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } 600 break; 601 case 11: 602 #line 54 "pure_calc.y" 603 { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } 604 break; 605 case 12: 606 #line 56 "pure_calc.y" 607 { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } 608 break; 609 case 13: 610 #line 58 "pure_calc.y" 611 { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } 612 break; 613 case 14: 614 #line 60 "pure_calc.y" 615 { yyval = - yystack.l_mark[0]; } 616 break; 617 case 15: 618 #line 62 "pure_calc.y" 619 { yyval = regs[yystack.l_mark[0]]; } 620 break; 621 case 17: 622 #line 67 "pure_calc.y" 623 { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; } 624 break; 625 case 18: 626 #line 69 "pure_calc.y" 627 { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; } 628 break; 629 #line 630 "pure_calc.tab.c" 630 } 631 yystack.s_mark -= yym; 632 yystate = *yystack.s_mark; 633 yystack.l_mark -= yym; 634 yym = yylhs[yyn]; 635 if (yystate == 0 && yym == 0) 636 { 637 #if YYDEBUG 638 if (yydebug) 639 printf("%sdebug: after reduction, shifting from state 0 to\ 640 state %d\n", YYPREFIX, YYFINAL); 641 #endif 642 yystate = YYFINAL; 643 *++yystack.s_mark = YYFINAL; 644 *++yystack.l_mark = yyval; 645 if (yychar < 0) 646 { 647 yychar = YYLEX; 648 if (yychar < 0) yychar = YYEOF; 649 #if YYDEBUG 650 if (yydebug) 651 { 652 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN]; 653 printf("%sdebug: state %d, reading %d (%s)\n", 654 YYPREFIX, YYFINAL, yychar, yys); 655 } 656 #endif 657 } 658 if (yychar == YYEOF) goto yyaccept; 659 goto yyloop; 660 } 661 if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 && 662 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate) 663 yystate = yytable[yyn]; 664 else 665 yystate = yydgoto[yym]; 666 #if YYDEBUG 667 if (yydebug) 668 printf("%sdebug: after reduction, shifting from state %d \ 669 to state %d\n", YYPREFIX, *yystack.s_mark, yystate); 670 #endif 671 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 672 *++yystack.s_mark = (YYINT) yystate; 673 *++yystack.l_mark = yyval; 674 goto yyloop; 675 676 yyoverflow: 677 YYERROR_CALL("yacc stack overflow"); 678 679 yyabort: 680 yyfreestack(&yystack); 681 return (1); 682 683 yyaccept: 684 yyfreestack(&yystack); 685 return (0); 686 } 687