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