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