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