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