1 /* $NetBSD: stdin2.calc.c,v 1.2 2024/09/14 21:29:05 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 "stdin2.calc.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 int 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 "stdin2.calc.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 is set below */ 357 /* yyn is set below */ 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 #line 482 "stdin2.calc.c" 484 break; 485 case 4: 486 #line 32 "calc.y" 487 { printf("%d\n",yystack.l_mark[0]);} 488 #line 487 "stdin2.calc.c" 489 break; 490 case 5: 491 #line 34 "calc.y" 492 { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; } 493 #line 492 "stdin2.calc.c" 494 break; 495 case 6: 496 #line 38 "calc.y" 497 { yyval = yystack.l_mark[-1]; } 498 #line 497 "stdin2.calc.c" 499 break; 500 case 7: 501 #line 40 "calc.y" 502 { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; } 503 #line 502 "stdin2.calc.c" 504 break; 505 case 8: 506 #line 42 "calc.y" 507 { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; } 508 #line 507 "stdin2.calc.c" 509 break; 510 case 9: 511 #line 44 "calc.y" 512 { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; } 513 #line 512 "stdin2.calc.c" 514 break; 515 case 10: 516 #line 46 "calc.y" 517 { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; } 518 #line 517 "stdin2.calc.c" 519 break; 520 case 11: 521 #line 48 "calc.y" 522 { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; } 523 #line 522 "stdin2.calc.c" 524 break; 525 case 12: 526 #line 50 "calc.y" 527 { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; } 528 #line 527 "stdin2.calc.c" 529 break; 530 case 13: 531 #line 52 "calc.y" 532 { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; } 533 #line 532 "stdin2.calc.c" 534 break; 535 case 14: 536 #line 54 "calc.y" 537 { yyval = - yystack.l_mark[0]; } 538 #line 537 "stdin2.calc.c" 539 break; 540 case 15: 541 #line 56 "calc.y" 542 { yyval = regs[yystack.l_mark[0]]; } 543 #line 542 "stdin2.calc.c" 544 break; 545 case 17: 546 #line 61 "calc.y" 547 { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; } 548 #line 547 "stdin2.calc.c" 549 break; 550 case 18: 551 #line 63 "calc.y" 552 { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; } 553 #line 552 "stdin2.calc.c" 554 break; 555 #line 554 "stdin2.calc.c" 556 } 557 yystack.s_mark -= yym; 558 yystate = *yystack.s_mark; 559 yystack.l_mark -= yym; 560 yym = yylhs[yyn]; 561 if (yystate == 0 && yym == 0) 562 { 563 #if YYDEBUG 564 if (yydebug) 565 printf("%sdebug: after reduction, shifting from state 0 to\ 566 state %d\n", YYPREFIX, YYFINAL); 567 #endif 568 yystate = YYFINAL; 569 *++yystack.s_mark = YYFINAL; 570 *++yystack.l_mark = yyval; 571 if (yychar < 0) 572 { 573 yychar = YYLEX; 574 if (yychar < 0) yychar = YYEOF; 575 #if YYDEBUG 576 if (yydebug) 577 { 578 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN]; 579 printf("%sdebug: state %d, reading %d (%s)\n", 580 YYPREFIX, YYFINAL, yychar, yys); 581 } 582 #endif 583 } 584 if (yychar == YYEOF) goto yyaccept; 585 goto yyloop; 586 } 587 if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 && 588 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate) 589 yystate = yytable[yyn]; 590 else 591 yystate = yydgoto[yym]; 592 #if YYDEBUG 593 if (yydebug) 594 printf("%sdebug: after reduction, shifting from state %d \ 595 to state %d\n", YYPREFIX, *yystack.s_mark, yystate); 596 #endif 597 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 598 *++yystack.s_mark = (YYINT) yystate; 599 *++yystack.l_mark = yyval; 600 goto yyloop; 601 602 yyoverflow: 603 YYERROR_CALL("yacc stack overflow"); 604 605 yyabort: 606 yyfreestack(&yystack); 607 return (1); 608 609 yyaccept: 610 yyfreestack(&yystack); 611 return (0); 612 } 613