|
|
1.1 ! root 1: ! 2: /* A Bison parser, made from cexp.y */ ! 3: ! 4: #define INT 258 ! 5: #define CHAR 259 ! 6: #define NAME 260 ! 7: #define ERROR 261 ! 8: #define OR 262 ! 9: #define AND 263 ! 10: #define EQUAL 264 ! 11: #define NOTEQUAL 265 ! 12: #define LEQ 266 ! 13: #define GEQ 267 ! 14: #define LSH 268 ! 15: #define RSH 269 ! 16: #define UNARY 270 ! 17: ! 18: #line 109 "cexp.y" ! 19: ! 20: #include <setjmp.h> ! 21: /* #define YYDEBUG 1 */ ! 22: ! 23: static int yylex (); ! 24: static yyerror (); ! 25: int expression_value; ! 26: ! 27: static jmp_buf parse_return_error; ! 28: ! 29: /* some external tables of character types */ ! 30: extern unsigned char is_idstart[], is_idchar[]; ! 31: ! 32: ! 33: #line 124 "cexp.y" ! 34: typedef union { ! 35: long lval; ! 36: int voidval; ! 37: char *sval; ! 38: } YYSTYPE; ! 39: ! 40: #ifndef YYLTYPE ! 41: typedef ! 42: struct yyltype ! 43: { ! 44: int timestamp; ! 45: int first_line; ! 46: int first_column; ! 47: int last_line; ! 48: int last_column; ! 49: char *text; ! 50: } ! 51: yyltype; ! 52: ! 53: #define YYLTYPE yyltype ! 54: #endif ! 55: ! 56: #define YYACCEPT return(0) ! 57: #define YYABORT return(1) ! 58: #define YYERROR return(1) ! 59: #include <stdio.h> ! 60: ! 61: ! 62: ! 63: #define YYFINAL 59 ! 64: #define YYFLAG -32768 ! 65: #define YYNTBASE 33 ! 66: ! 67: #define YYTRANSLATE(x) (yytranslate[x]) ! 68: ! 69: static char yytranslate[] = { 0, ! 70: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 71: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 72: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 73: 2, 2, 29, 2, 2, 2, 27, 14, 2, 31, ! 74: 32, 25, 23, 9, 24, 2, 26, 2, 2, 2, ! 75: 2, 2, 2, 2, 2, 2, 2, 8, 2, 17, ! 76: 2, 18, 7, 2, 2, 2, 2, 2, 2, 2, ! 77: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 78: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 79: 2, 2, 2, 13, 2, 2, 2, 2, 2, 2, ! 80: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 81: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 82: 2, 2, 2, 12, 2, 30, 2, 2, 2, 2, ! 83: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 84: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 85: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 86: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 87: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 88: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 89: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 90: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 91: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 92: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 93: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 94: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ! 95: 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, ! 96: 6, 10, 11, 15, 16, 19, 20, 21, 22, 28 ! 97: }; ! 98: ! 99: static short yyrline[] = { 0, ! 100: 153, 158, 159, 164, 166, 168, 170, 175, 177, 179, ! 101: 181, 183, 185, 187, 189, 191, 193, 195, 197, 199, ! 102: 201, 203, 205, 207, 209, 211, 213, 215, 217 ! 103: }; ! 104: ! 105: static char * yytname[] = { 0, ! 106: "error","$illegal.","INT","CHAR","NAME","ERROR","'?'","':'","','","OR", ! 107: "AND","'|'","'^'","'&'","EQUAL","NOTEQUAL","'<'","'>'","LEQ","GEQ", ! 108: "LSH","RSH","'+'","'-'","'*'","'/'","'%'","UNARY","'!'","'~'", ! 109: "'('","')'","start" ! 110: }; ! 111: ! 112: static short yyr1[] = { 0, ! 113: 33, 34, 34, 35, 35, 35, 35, 35, 35, 35, ! 114: 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, ! 115: 35, 35, 35, 35, 35, 35, 35, 35, 35 ! 116: }; ! 117: ! 118: static short yyr2[] = { 0, ! 119: 1, 1, 3, 2, 2, 2, 3, 3, 3, 3, ! 120: 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, ! 121: 3, 3, 3, 3, 3, 5, 1, 1, 1 ! 122: }; ! 123: ! 124: static short yydefact[] = { 0, ! 125: 27, 28, 29, 0, 0, 0, 0, 1, 2, 4, ! 126: 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, ! 127: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 128: 0, 0, 0, 7, 3, 0, 25, 24, 23, 22, ! 129: 21, 15, 16, 19, 20, 17, 18, 13, 14, 11, ! 130: 12, 8, 9, 10, 0, 26, 0, 0, 0 ! 131: }; ! 132: ! 133: static short yydefgoto[] = { 57, ! 134: 8, 9 ! 135: }; ! 136: ! 137: static short yypact[] = { 28, ! 138: -32768,-32768,-32768, 28, 28, 28, 28, -3, 74,-32768, ! 139: -32768,-32768, -2, 28, 28, 28, 28, 28, 28, 28, ! 140: 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, ! 141: 28, 28, 28,-32768, 74, 53, 23, 90, 105, 119, ! 142: 132, 143, 143, 150, 150, 150, 150, 155, 155, -22, ! 143: -22,-32768,-32768,-32768, 28, 74, 8, 9,-32768 ! 144: }; ! 145: ! 146: static short yypgoto[] = {-32768, ! 147: 46, -4 ! 148: }; ! 149: ! 150: ! 151: #define YYLAST 182 ! 152: ! 153: ! 154: static short yytable[] = { 10, ! 155: 11, 12, 31, 32, 33, 14, 14, 58, 59, 35, ! 156: 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, ! 157: 46, 47, 48, 49, 50, 51, 52, 53, 54, 34, ! 158: 1, 2, 3, 17, 18, 19, 20, 21, 22, 23, ! 159: 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ! 160: 56, 4, 13, 0, 0, 0, 5, 6, 7, 15, ! 161: 55, 0, 16, 17, 18, 19, 20, 21, 22, 23, ! 162: 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ! 163: 15, 0, 0, 16, 17, 18, 19, 20, 21, 22, ! 164: 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, ! 165: 33, 18, 19, 20, 21, 22, 23, 24, 25, 26, ! 166: 27, 28, 29, 30, 31, 32, 33, 19, 20, 21, ! 167: 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, ! 168: 32, 33, 20, 21, 22, 23, 24, 25, 26, 27, ! 169: 28, 29, 30, 31, 32, 33, 21, 22, 23, 24, ! 170: 25, 26, 27, 28, 29, 30, 31, 32, 33, 23, ! 171: 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ! 172: 27, 28, 29, 30, 31, 32, 33, 29, 30, 31, ! 173: 32, 33 ! 174: }; ! 175: ! 176: static short yycheck[] = { 4, ! 177: 5, 6, 25, 26, 27, 9, 9, 0, 0, 14, ! 178: 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, ! 179: 25, 26, 27, 28, 29, 30, 31, 32, 33, 32, ! 180: 3, 4, 5, 11, 12, 13, 14, 15, 16, 17, ! 181: 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, ! 182: 55, 24, 7, -1, -1, -1, 29, 30, 31, 7, ! 183: 8, -1, 10, 11, 12, 13, 14, 15, 16, 17, ! 184: 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, ! 185: 7, -1, -1, 10, 11, 12, 13, 14, 15, 16, ! 186: 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, ! 187: 27, 12, 13, 14, 15, 16, 17, 18, 19, 20, ! 188: 21, 22, 23, 24, 25, 26, 27, 13, 14, 15, ! 189: 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, ! 190: 26, 27, 14, 15, 16, 17, 18, 19, 20, 21, ! 191: 22, 23, 24, 25, 26, 27, 15, 16, 17, 18, ! 192: 19, 20, 21, 22, 23, 24, 25, 26, 27, 17, ! 193: 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, ! 194: 21, 22, 23, 24, 25, 26, 27, 23, 24, 25, ! 195: 26, 27 ! 196: }; ! 197: #define YYPURE 1 ! 198: ! 199: #line 2 "bison.simple" ! 200: ! 201: /* Skeleton output parser for bison, ! 202: copyright (C) 1984 Bob Corbett and Richard Stallman ! 203: ! 204: Permission is granted to anyone to make or distribute verbatim copies of this program ! 205: provided that the copyright notice and this permission notice are preserved; ! 206: and provided that the recipient is not asked to waive or limit his right to ! 207: redistribute copies as permitted by this permission notice; ! 208: and provided that anyone possessing an executable copy ! 209: is granted access to copy the source code, in machine-readable form, ! 210: in some reasonable manner. ! 211: ! 212: Permission is granted to distribute derived works or enhanced versions of ! 213: this program under the above conditions with the additional condition ! 214: that the entire derivative or enhanced work ! 215: must be covered by a permission notice identical to this one. ! 216: ! 217: Anything distributed as part of a package containing portions derived ! 218: from this program, which cannot in current practice perform its function usefully ! 219: in the absense of what was derived directly from this program, ! 220: is to be considered as forming, together with the latter, ! 221: a single work derived from this program, ! 222: which must be entirely covered by a permission notice identical to this one ! 223: in order for distribution of the package to be permitted. ! 224: ! 225: In other words, you are welcome to use, share and improve this program. ! 226: You are forbidden to forbid anyone else to use, share and improve ! 227: what you give them. Help stamp out software-hoarding! */ ! 228: ! 229: /* This is the parser code that is written into each bison parser ! 230: when the %semantic_parser declaration is not specified in the grammar. ! 231: It was written by Richard Stallman by simplifying the hairy parser ! 232: used when %semantic_parser is specified. */ ! 233: ! 234: /* Note: there must be only one dollar sign in this file. ! 235: It is replaced by the list of actions, each action ! 236: as one case of the switch. */ ! 237: ! 238: #define yyerrok (yyerrstatus = 0) ! 239: #define yyclearin (yychar = YYEMPTY) ! 240: #define YYEMPTY -2 ! 241: #define YYEOF 0 ! 242: #define YYFAIL goto yyerrlab; ! 243: ! 244: #define YYTERROR 1 ! 245: ! 246: #ifndef YYIMPURE ! 247: #define YYLEX yylex() ! 248: #endif ! 249: ! 250: #ifndef YYPURE ! 251: #define YYLEX yylex(&yylval, &yylloc) ! 252: #endif ! 253: ! 254: /* If nonreentrant, generate the variables here */ ! 255: ! 256: #ifndef YYIMPURE ! 257: ! 258: int yychar; /* the lookahead symbol */ ! 259: YYSTYPE yylval; /* the semantic value of the */ ! 260: /* lookahead symbol */ ! 261: ! 262: YYLTYPE yylloc; /* location data for the lookahead */ ! 263: /* symbol */ ! 264: ! 265: int yydebug = 0; /* nonzero means print parse trace */ ! 266: ! 267: #endif /* YYIMPURE */ ! 268: ! 269: ! 270: /* YYMAXDEPTH indicates the initial size of the parser's stacks */ ! 271: ! 272: #ifndef YYMAXDEPTH ! 273: #define YYMAXDEPTH 200 ! 274: #endif ! 275: ! 276: /* YYMAXLIMIT is the maximum size the stacks can grow to ! 277: (effective only if the built-in stack extension method is used). */ ! 278: ! 279: #ifndef YYMAXLIMIT ! 280: #define YYMAXLIMIT 10000 ! 281: #endif ! 282: ! 283: ! 284: #line 87 "bison.simple" ! 285: int ! 286: yyparse() ! 287: { ! 288: register int yystate; ! 289: register int yyn; ! 290: register short *yyssp; ! 291: register YYSTYPE *yyvsp; ! 292: YYLTYPE *yylsp; ! 293: int yyerrstatus; /* number of tokens to shift before error messages enabled */ ! 294: int yychar1; /* lookahead token as an internal (translated) token number */ ! 295: ! 296: short yyssa[YYMAXDEPTH]; /* the state stack */ ! 297: YYSTYPE yyvsa[YYMAXDEPTH]; /* the semantic value stack */ ! 298: YYLTYPE yylsa[YYMAXDEPTH]; /* the location stack */ ! 299: ! 300: short *yyss = yyssa; /* refer to the stacks thru separate pointers */ ! 301: YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ ! 302: YYLTYPE *yyls = yylsa; ! 303: ! 304: int yymaxdepth = YYMAXDEPTH; ! 305: ! 306: #ifndef YYPURE ! 307: ! 308: int yychar; ! 309: YYSTYPE yylval; ! 310: YYLTYPE yylloc; ! 311: ! 312: extern int yydebug; ! 313: ! 314: #endif ! 315: ! 316: ! 317: YYSTYPE yyval; /* the variable used to return */ ! 318: /* semantic values from the action */ ! 319: /* routines */ ! 320: ! 321: int yylen; ! 322: ! 323: if (yydebug) ! 324: fprintf(stderr, "Starting parse\n"); ! 325: ! 326: yystate = 0; ! 327: yyerrstatus = 0; ! 328: yychar = YYEMPTY; /* Cause a token to be read. */ ! 329: ! 330: /* Initialize stack pointers. ! 331: Waste one element of value and location stack ! 332: so that they stay on the same level as the state stack. */ ! 333: ! 334: yyssp = yyss - 1; ! 335: yyvsp = yyvs; ! 336: yylsp = yyls; ! 337: ! 338: /* Push a new state, which is found in yystate . */ ! 339: /* In all cases, when you get here, the value and location stacks ! 340: have just been pushed. so pushing a state here evens the stacks. */ ! 341: yynewstate: ! 342: ! 343: *++yyssp = yystate; ! 344: ! 345: if (yyssp >= yyss + yymaxdepth - 1) ! 346: { ! 347: /* Give user a chance to reallocate the stack */ ! 348: /* Use copies of these so that the &'s don't force the real ones into memory. */ ! 349: YYSTYPE *yyvs1 = yyvs; ! 350: YYLTYPE *yyls1 = yyls; ! 351: short *yyss1 = yyss; ! 352: ! 353: /* Get the current used size of the three stacks, in elements. */ ! 354: int size = yyssp - yyss + 1; ! 355: ! 356: #ifdef yyoverflow ! 357: /* Each stack pointer address is followed by the size of ! 358: the data in use in that stack, in bytes. */ ! 359: yyoverflow("parser stack overflow", ! 360: &yyss1, size * sizeof (*yyssp), ! 361: &yyvs1, size * sizeof (*yyvsp), ! 362: &yyls1, size * sizeof (*yylsp), ! 363: &yymaxdepth); ! 364: ! 365: yyss = yyss1; yyvs = yyvs1; yyls = yyls1; ! 366: #else /* no yyoverflow */ ! 367: /* Extend the stack our own way. */ ! 368: if (yymaxdepth >= YYMAXLIMIT) ! 369: yyerror("parser stack overflow"); ! 370: yymaxdepth *= 2; ! 371: if (yymaxdepth > YYMAXLIMIT) ! 372: yymaxdepth = YYMAXLIMIT; ! 373: yyss = (short *) alloca (yymaxdepth * sizeof (*yyssp)); ! 374: bcopy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp)); ! 375: yyls = (YYLTYPE *) alloca (yymaxdepth * sizeof (*yylsp)); ! 376: bcopy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp)); ! 377: yyvs = (YYSTYPE *) alloca (yymaxdepth * sizeof (*yyvsp)); ! 378: bcopy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp)); ! 379: #endif /* no yyoverflow */ ! 380: ! 381: yyssp = yyss + size - 1; ! 382: yylsp = yyls + size - 1; ! 383: yyvsp = yyvs + size - 1; ! 384: ! 385: if (yydebug) ! 386: fprintf(stderr, "Stack size increased to %d\n", yymaxdepth); ! 387: ! 388: if (yyssp >= yyss + yymaxdepth - 1) ! 389: YYERROR; ! 390: } ! 391: ! 392: if (yydebug) ! 393: fprintf(stderr, "Entering state %d\n", yystate); ! 394: ! 395: /* Do appropriate processing given the current state. */ ! 396: /* Read a lookahead token if we need one and don't already have one. */ ! 397: yyresume: ! 398: ! 399: /* First try to decide what to do without reference to lookahead token. */ ! 400: ! 401: yyn = yypact[yystate]; ! 402: if (yyn == YYFLAG) ! 403: goto yydefault; ! 404: ! 405: /* Not known => get a lookahead token if don't already have one. */ ! 406: ! 407: /* yychar is either YYEMPTY or YYEOF ! 408: or a valid token in external form. */ ! 409: ! 410: if (yychar == YYEMPTY) ! 411: { ! 412: yychar = YYLEX; ! 413: } ! 414: ! 415: /* Convert token to internal form (in yychar1) for indexing tables with */ ! 416: ! 417: if (yychar <= 0) /* This means end of input. */ ! 418: { ! 419: yychar1 = 0; ! 420: yychar = YYEOF; /* Don't call YYLEX any more */ ! 421: ! 422: if (yydebug) ! 423: fprintf(stderr, "Now at end of input.\n"); ! 424: } ! 425: else ! 426: { ! 427: yychar1 = YYTRANSLATE(yychar); ! 428: ! 429: if (yydebug) ! 430: fprintf(stderr, "Parsing next token; it is %d (%s)\n", yychar, yytname[yychar1]); ! 431: } ! 432: ! 433: yyn += yychar1; ! 434: if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) ! 435: goto yydefault; ! 436: ! 437: yyn = yytable[yyn]; ! 438: ! 439: /* yyn is what to do for this token type in this state. ! 440: Negative => reduce, -yyn is rule number. ! 441: Positive => shift, yyn is new state. ! 442: New state is final state => don't bother to shift, ! 443: just return success. ! 444: 0, or most negative number => error. */ ! 445: ! 446: if (yyn < 0) ! 447: { ! 448: if (yyn == YYFLAG) ! 449: goto yyerrlab; ! 450: yyn = -yyn; ! 451: goto yyreduce; ! 452: } ! 453: else if (yyn == 0) ! 454: goto yyerrlab; ! 455: ! 456: if (yyn == YYFINAL) ! 457: YYACCEPT; ! 458: ! 459: /* Shift the lookahead token. */ ! 460: ! 461: if (yydebug) ! 462: fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); ! 463: ! 464: /* Discard the token being shifted unless it is eof. */ ! 465: if (yychar != YYEOF) ! 466: yychar = YYEMPTY; ! 467: ! 468: *++yyvsp = yylval; ! 469: *++yylsp = yylloc; ! 470: ! 471: /* count tokens shifted since error; after three, turn off error status. */ ! 472: if (yyerrstatus) yyerrstatus--; ! 473: ! 474: yystate = yyn; ! 475: goto yynewstate; ! 476: ! 477: /* Do the default action for the current state. */ ! 478: yydefault: ! 479: ! 480: yyn = yydefact[yystate]; ! 481: if (yyn == 0) ! 482: goto yyerrlab; ! 483: ! 484: /* Do a reduction. yyn is the number of a rule to reduce with. */ ! 485: yyreduce: ! 486: yylen = yyr2[yyn]; ! 487: yyval = yyvsp[1-yylen]; /* implement default value of the action */ ! 488: ! 489: if (yydebug) ! 490: { ! 491: if (yylen == 1) ! 492: fprintf (stderr, "Reducing 1 value via line %d, ", ! 493: yyrline[yyn]); ! 494: else ! 495: fprintf (stderr, "Reducing %d values via line %d, ", ! 496: yylen, yyrline[yyn]); ! 497: } ! 498: ! 499: ! 500: switch (yyn) { ! 501: ! 502: case 1: ! 503: #line 154 "cexp.y" ! 504: { expression_value = yyvsp[0].lval; ; ! 505: break;} ! 506: case 3: ! 507: #line 160 "cexp.y" ! 508: { yyval.lval = yyvsp[0].lval; ; ! 509: break;} ! 510: case 4: ! 511: #line 165 "cexp.y" ! 512: { yyval.lval = - yyvsp[0].lval; ; ! 513: break;} ! 514: case 5: ! 515: #line 167 "cexp.y" ! 516: { yyval.lval = ! yyvsp[0].lval; ; ! 517: break;} ! 518: case 6: ! 519: #line 169 "cexp.y" ! 520: { yyval.lval = ~ yyvsp[0].lval; ; ! 521: break;} ! 522: case 7: ! 523: #line 171 "cexp.y" ! 524: { yyval.lval = yyvsp[-1].lval; ; ! 525: break;} ! 526: case 8: ! 527: #line 176 "cexp.y" ! 528: { yyval.lval = yyvsp[-2].lval * yyvsp[0].lval; ; ! 529: break;} ! 530: case 9: ! 531: #line 178 "cexp.y" ! 532: { yyval.lval = yyvsp[-2].lval / yyvsp[0].lval; ; ! 533: break;} ! 534: case 10: ! 535: #line 180 "cexp.y" ! 536: { yyval.lval = yyvsp[-2].lval % yyvsp[0].lval; ; ! 537: break;} ! 538: case 11: ! 539: #line 182 "cexp.y" ! 540: { yyval.lval = yyvsp[-2].lval + yyvsp[0].lval; ; ! 541: break;} ! 542: case 12: ! 543: #line 184 "cexp.y" ! 544: { yyval.lval = yyvsp[-2].lval - yyvsp[0].lval; ; ! 545: break;} ! 546: case 13: ! 547: #line 186 "cexp.y" ! 548: { yyval.lval = yyvsp[-2].lval << yyvsp[0].lval; ; ! 549: break;} ! 550: case 14: ! 551: #line 188 "cexp.y" ! 552: { yyval.lval = yyvsp[-2].lval >> yyvsp[0].lval; ; ! 553: break;} ! 554: case 15: ! 555: #line 190 "cexp.y" ! 556: { yyval.lval = (yyvsp[-2].lval == yyvsp[0].lval); ; ! 557: break;} ! 558: case 16: ! 559: #line 192 "cexp.y" ! 560: { yyval.lval = (yyvsp[-2].lval != yyvsp[0].lval); ; ! 561: break;} ! 562: case 17: ! 563: #line 194 "cexp.y" ! 564: { yyval.lval = (yyvsp[-2].lval <= yyvsp[0].lval); ; ! 565: break;} ! 566: case 18: ! 567: #line 196 "cexp.y" ! 568: { yyval.lval = (yyvsp[-2].lval >= yyvsp[0].lval); ; ! 569: break;} ! 570: case 19: ! 571: #line 198 "cexp.y" ! 572: { yyval.lval = (yyvsp[-2].lval < yyvsp[0].lval); ; ! 573: break;} ! 574: case 20: ! 575: #line 200 "cexp.y" ! 576: { yyval.lval = (yyvsp[-2].lval > yyvsp[0].lval); ; ! 577: break;} ! 578: case 21: ! 579: #line 202 "cexp.y" ! 580: { yyval.lval = (yyvsp[-2].lval & yyvsp[0].lval); ; ! 581: break;} ! 582: case 22: ! 583: #line 204 "cexp.y" ! 584: { yyval.lval = (yyvsp[-2].lval ^ yyvsp[0].lval); ; ! 585: break;} ! 586: case 23: ! 587: #line 206 "cexp.y" ! 588: { yyval.lval = (yyvsp[-2].lval | yyvsp[0].lval); ; ! 589: break;} ! 590: case 24: ! 591: #line 208 "cexp.y" ! 592: { yyval.lval = (yyvsp[-2].lval && yyvsp[0].lval); ; ! 593: break;} ! 594: case 25: ! 595: #line 210 "cexp.y" ! 596: { yyval.lval = (yyvsp[-2].lval || yyvsp[0].lval); ; ! 597: break;} ! 598: case 26: ! 599: #line 212 "cexp.y" ! 600: { yyval.lval = yyvsp[-4].lval ? yyvsp[-2].lval : yyvsp[0].lval; ; ! 601: break;} ! 602: case 27: ! 603: #line 214 "cexp.y" ! 604: { yyval.lval = yylval.lval; ; ! 605: break;} ! 606: case 28: ! 607: #line 216 "cexp.y" ! 608: { yyval.lval = yylval.lval; ; ! 609: break;} ! 610: case 29: ! 611: #line 218 "cexp.y" ! 612: { yyval.lval = 0; ; ! 613: break;} ! 614: } ! 615: /* the action file gets copied in in place of this dollarsign */ ! 616: #line 303 "bison.simple" ! 617: ! 618: yyvsp -= yylen; ! 619: yylsp -= yylen; ! 620: yyssp -= yylen; ! 621: ! 622: if (yydebug) ! 623: { ! 624: short *ssp1 = yyss - 1; ! 625: fprintf (stderr, "state stack now", yyssp-yyss); ! 626: while (ssp1 != yyssp) ! 627: fprintf (stderr, " %d", *++ssp1); ! 628: fprintf (stderr, "\n"); ! 629: } ! 630: ! 631: *++yyvsp = yyval; ! 632: ! 633: yylsp++; ! 634: if (yylen == 0) ! 635: { ! 636: yylsp->first_line = yylloc.first_line; ! 637: yylsp->first_column = yylloc.first_column; ! 638: yylsp->last_line = (yylsp-1)->last_line; ! 639: yylsp->last_column = (yylsp-1)->last_column; ! 640: yylsp->text = 0; ! 641: } ! 642: else ! 643: { ! 644: yylsp->last_line = (yylsp+yylen-1)->last_line; ! 645: yylsp->last_column = (yylsp+yylen-1)->last_column; ! 646: } ! 647: ! 648: /* Now "shift" the result of the reduction. ! 649: Determine what state that goes to, ! 650: based on the state we popped back to ! 651: and the rule number reduced by. */ ! 652: ! 653: yyn = yyr1[yyn]; ! 654: ! 655: yystate = yypgoto[yyn - YYNTBASE] + *yyssp; ! 656: if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) ! 657: yystate = yytable[yystate]; ! 658: else ! 659: yystate = yydefgoto[yyn - YYNTBASE]; ! 660: ! 661: goto yynewstate; ! 662: ! 663: yyerrlab: /* here on detecting error */ ! 664: ! 665: if (! yyerrstatus) ! 666: /* If not already recovering from an error, report this error. */ ! 667: { ! 668: yyerror("parse error"); ! 669: } ! 670: ! 671: if (yyerrstatus == 3) ! 672: { ! 673: /* if just tried and failed to reuse lookahead token after an error, discard it. */ ! 674: ! 675: /* return failure if at end of input */ ! 676: if (yychar == YYEOF) ! 677: YYERROR; ! 678: ! 679: if (yydebug) ! 680: fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); ! 681: ! 682: yychar = YYEMPTY; ! 683: } ! 684: ! 685: /* Else will try to reuse lookahead token ! 686: after shifting the error token. */ ! 687: ! 688: yyerrstatus = 3; /* Each real token shifted decrements this */ ! 689: ! 690: goto yyerrhandle; ! 691: ! 692: yyerrdefault: /* current state does not do anything special for the error token. */ ! 693: ! 694: #if 0 ! 695: /* This is wrong; only states that explicitly want error tokens ! 696: should shift them. */ ! 697: yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ ! 698: if (yyn) goto yydefault; ! 699: #endif ! 700: ! 701: yyerrpop: /* pop the current state because it cannot handle the error token */ ! 702: ! 703: if (yyssp == yyss) YYERROR; ! 704: yyvsp--; ! 705: yylsp--; ! 706: yystate = *--yyssp; ! 707: ! 708: if (yydebug) ! 709: { ! 710: short *ssp1 = yyss - 1; ! 711: fprintf (stderr, "Error: state stack now", yyssp-yyss); ! 712: while (ssp1 != yyssp) ! 713: fprintf (stderr, " %d", *++ssp1); ! 714: fprintf (stderr, "\n"); ! 715: } ! 716: ! 717: yyerrhandle: ! 718: ! 719: yyn = yypact[yystate]; ! 720: if (yyn == YYFLAG) ! 721: goto yyerrdefault; ! 722: ! 723: yyn += YYTERROR; ! 724: if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) ! 725: goto yyerrdefault; ! 726: ! 727: yyn = yytable[yyn]; ! 728: if (yyn < 0) ! 729: { ! 730: if (yyn == YYFLAG) ! 731: goto yyerrpop; ! 732: yyn = -yyn; ! 733: goto yyreduce; ! 734: } ! 735: else if (yyn == 0) ! 736: goto yyerrpop; ! 737: ! 738: if (yyn == YYFINAL) ! 739: YYACCEPT; ! 740: ! 741: if (yydebug) ! 742: fprintf(stderr, "Shifting error token, "); ! 743: ! 744: *++yyvsp = yylval; ! 745: *++yylsp = yylloc; ! 746: ! 747: yystate = yyn; ! 748: goto yynewstate; ! 749: } ! 750: #line 220 "cexp.y" ! 751: ! 752: ! 753: /* During parsing of a C expression, the pointer to the next character ! 754: is in this variable. */ ! 755: ! 756: static char *lexptr; ! 757: ! 758: /* Take care of parsing a number (anything that starts with a digit). ! 759: Set yylval and return the token type; update lexptr. ! 760: LEN is the number of characters in it. */ ! 761: ! 762: /* maybe needs to actually deal with floating point numbers */ ! 763: ! 764: static int ! 765: parse_number (olen) ! 766: int olen; ! 767: { ! 768: register char *p = lexptr; ! 769: register long n = 0; ! 770: register int c; ! 771: register int base = 10; ! 772: register len = olen; ! 773: char *err_copy; ! 774: ! 775: extern double atof (); ! 776: ! 777: for (c = 0; c < len; c++) ! 778: if (p[c] == '.') { ! 779: /* It's a float since it contains a point. */ ! 780: yyerror ("floating point numbers not allowed in #if expressions"); ! 781: return ERROR; ! 782: ! 783: /* **************** ! 784: yylval.dval = atof (p); ! 785: lexptr += len; ! 786: return FLOAT; ! 787: **************** */ ! 788: } ! 789: ! 790: if (len >= 3 && (!strncmp (p, "0x", 2) || !strncmp (p, "0X", 2))) { ! 791: p += 2; ! 792: base = 16; ! 793: len -= 2; ! 794: } ! 795: else if (*p == '0') ! 796: base = 8; ! 797: ! 798: while (len-- > 0) { ! 799: c = *p++; ! 800: n *= base; ! 801: if (c >= '0' && c <= '9') ! 802: n += c - '0'; ! 803: else { ! 804: if (c >= 'A' && c <= 'Z') c += 'a' - 'A'; ! 805: if (base == 16 && c >= 'a' && c <= 'f') ! 806: n += c - 'a' + 10; ! 807: else if (len == 0 && c == 'l') ! 808: ; ! 809: else { ! 810: yyerror ("Invalid number in #if expression"); ! 811: return ERROR; ! 812: } ! 813: } ! 814: } ! 815: ! 816: lexptr = p; ! 817: yylval.lval = n; ! 818: return INT; ! 819: } ! 820: ! 821: struct token { ! 822: char *operator; ! 823: int token; ! 824: }; ! 825: ! 826: #define NULL 0 ! 827: ! 828: static struct token tokentab2[] = { ! 829: {"&&", AND}, ! 830: {"||", OR}, ! 831: {"<<", LSH}, ! 832: {">>", RSH}, ! 833: {"==", EQUAL}, ! 834: {"!=", NOTEQUAL}, ! 835: {"<=", LEQ}, ! 836: {">=", GEQ}, ! 837: {NULL, ERROR} ! 838: }; ! 839: ! 840: /* Read one token, getting characters through lexptr. */ ! 841: ! 842: static int ! 843: yylex () ! 844: { ! 845: register int c; ! 846: register int namelen; ! 847: register char *tokstart; ! 848: register struct token *toktab; ! 849: ! 850: retry: ! 851: ! 852: tokstart = lexptr; ! 853: c = *tokstart; ! 854: /* See if it is a special token of length 2. */ ! 855: for (toktab = tokentab2; toktab->operator != NULL; toktab++) ! 856: if (c == *toktab->operator && tokstart[1] == toktab->operator[1]) { ! 857: lexptr += 2; ! 858: return toktab->token; ! 859: } ! 860: ! 861: switch (c) { ! 862: case 0: ! 863: return 0; ! 864: ! 865: case ' ': ! 866: case '\t': ! 867: case '\n': ! 868: lexptr++; ! 869: goto retry; ! 870: ! 871: case '\'': ! 872: lexptr++; ! 873: c = *lexptr++; ! 874: if (c == '\\') ! 875: c = parse_escape (&lexptr); ! 876: yylval.lval = c; ! 877: c = *lexptr++; ! 878: if (c != '\'') { ! 879: yyerror ("Invalid character constant in #if"); ! 880: return ERROR; ! 881: } ! 882: ! 883: return CHAR; ! 884: ! 885: /* some of these chars are invalid in constant expressions; ! 886: maybe do something about them later */ ! 887: case '/': ! 888: case '+': ! 889: case '-': ! 890: case '*': ! 891: case '%': ! 892: case '|': ! 893: case '&': ! 894: case '^': ! 895: case '~': ! 896: case '!': ! 897: case '@': ! 898: case '<': ! 899: case '>': ! 900: case '(': ! 901: case ')': ! 902: case '[': ! 903: case ']': ! 904: case '.': ! 905: case '?': ! 906: case ':': ! 907: case '=': ! 908: case '{': ! 909: case '}': ! 910: case ',': ! 911: lexptr++; ! 912: return c; ! 913: ! 914: case '"': ! 915: yyerror ("double quoted strings not allowed in #if expressions"); ! 916: return ERROR; ! 917: } ! 918: if (c >= '0' && c <= '9') { ! 919: /* It's a number */ ! 920: for (namelen = 0; ! 921: c = tokstart[namelen], is_idchar[c] || c == '.'; ! 922: namelen++) ! 923: ; ! 924: return parse_number (namelen); ! 925: } ! 926: ! 927: if (!is_idstart[c]) { ! 928: yyerror ("Invalid token in expression"); ! 929: return ERROR; ! 930: } ! 931: ! 932: /* It is a name. See how long it is. */ ! 933: ! 934: for (namelen = 0; is_idchar[tokstart[namelen]]; namelen++) ! 935: ; ! 936: ! 937: lexptr += namelen; ! 938: return NAME; ! 939: } ! 940: ! 941: ! 942: /* Parse a C escape sequence. STRING_PTR points to a variable ! 943: containing a pointer to the string to parse. That pointer ! 944: is updated past the characters we use. The value of the ! 945: escape sequence is returned. ! 946: ! 947: A negative value means the sequence \ newline was seen, ! 948: which is supposed to be equivalent to nothing at all. ! 949: ! 950: If \ is followed by a null character, we return a negative ! 951: value and leave the string pointer pointing at the null character. ! 952: ! 953: If \ is followed by 000, we return 0 and leave the string pointer ! 954: after the zeros. A value of 0 does not mean end of string. */ ! 955: ! 956: static int ! 957: parse_escape (string_ptr) ! 958: char **string_ptr; ! 959: { ! 960: register int c = *(*string_ptr)++; ! 961: switch (c) ! 962: { ! 963: case 'a': ! 964: return '\a'; ! 965: case 'b': ! 966: return '\b'; ! 967: case 'e': ! 968: return 033; ! 969: case 'f': ! 970: return '\f'; ! 971: case 'n': ! 972: return '\n'; ! 973: case 'r': ! 974: return '\r'; ! 975: case 't': ! 976: return '\t'; ! 977: case 'v': ! 978: return '\v'; ! 979: case '\n': ! 980: return -2; ! 981: case 0: ! 982: (*string_ptr)--; ! 983: return 0; ! 984: case '^': ! 985: c = *(*string_ptr)++; ! 986: if (c == '\\') ! 987: c = parse_escape (string_ptr); ! 988: if (c == '?') ! 989: return 0177; ! 990: return (c & 0200) | (c & 037); ! 991: ! 992: case '0': ! 993: case '1': ! 994: case '2': ! 995: case '3': ! 996: case '4': ! 997: case '5': ! 998: case '6': ! 999: case '7': ! 1000: { ! 1001: register int i = c - '0'; ! 1002: register int count = 0; ! 1003: while (++count < 3) ! 1004: { ! 1005: if ((c = *(*string_ptr)++) >= '0' && c <= '7') ! 1006: { ! 1007: i *= 8; ! 1008: i += c - '0'; ! 1009: } ! 1010: else ! 1011: { ! 1012: (*string_ptr)--; ! 1013: break; ! 1014: } ! 1015: } ! 1016: return i; ! 1017: } ! 1018: default: ! 1019: return c; ! 1020: } ! 1021: } ! 1022: ! 1023: static ! 1024: yyerror (s) ! 1025: char *s; ! 1026: { ! 1027: error (s); ! 1028: longjmp (parse_return_error, 1); ! 1029: } ! 1030: ! 1031: /* This page contains the entry point to this file. */ ! 1032: ! 1033: /* Parse STRING as an expression, and complain if this fails ! 1034: to use up all of the contents of STRING. */ ! 1035: /* We do not support C comments. They should be removed before ! 1036: this function is called. */ ! 1037: ! 1038: int ! 1039: parse_c_expression (string) ! 1040: char *string; ! 1041: { ! 1042: lexptr = string; ! 1043: ! 1044: if (lexptr == 0 || *lexptr == 0) { ! 1045: error ("empty #if expression"); ! 1046: return 0; /* don't include the #if group */ ! 1047: } ! 1048: ! 1049: /* if there is some sort of scanning error, just return 0 and assume ! 1050: the parsing routine has printed an error message somewhere. ! 1051: there is surely a better thing to do than this. */ ! 1052: if (setjmp(parse_return_error)) ! 1053: return 0; ! 1054: ! 1055: if (yyparse ()) ! 1056: return 0; /* actually this is never reached ! 1057: the way things stand. */ ! 1058: if (*lexptr) ! 1059: error ("Junk after end of expression."); ! 1060: ! 1061: return expression_value; /* set by yyparse() */ ! 1062: } ! 1063: ! 1064: #ifdef TEST_EXP_READER ! 1065: /* main program, for testing purposes. */ ! 1066: main() ! 1067: { ! 1068: int n; ! 1069: char buf[1024]; ! 1070: extern int yydebug; ! 1071: /* ! 1072: yydebug = 1; ! 1073: */ ! 1074: initialize_random_junk (); ! 1075: ! 1076: for (;;) { ! 1077: printf("enter expression: "); ! 1078: n = 0; ! 1079: while ((buf[n] = getchar()) != '\n') ! 1080: n++; ! 1081: buf[n] = '\0'; ! 1082: printf("parser returned %d\n", parse_c_expression(buf)); ! 1083: } ! 1084: } ! 1085: ! 1086: /* table to tell if char can be part of a C identifier. */ ! 1087: char is_idchar[256]; ! 1088: /* table to tell if char can be first char of a c identifier. */ ! 1089: char is_idstart[256]; ! 1090: /* table to tell if c is horizontal space. isspace() thinks that ! 1091: newline is space; this is not a good idea for this program. */ ! 1092: char is_hor_space[256]; ! 1093: ! 1094: /* ! 1095: * initialize random junk in the hash table and maybe other places ! 1096: */ ! 1097: initialize_random_junk() ! 1098: { ! 1099: register int i; ! 1100: ! 1101: /* ! 1102: * Set up is_idchar and is_idstart tables. These should be ! 1103: * faster than saying (is_alpha(c) || c == '_'), etc. ! 1104: * Must do set up these things before calling any routines tthat ! 1105: * refer to them. ! 1106: */ ! 1107: for (i = 'a'; i <= 'z'; i++) { ! 1108: ++is_idchar[i - 'a' + 'A']; ! 1109: ++is_idchar[i]; ! 1110: ++is_idstart[i - 'a' + 'A']; ! 1111: ++is_idstart[i]; ! 1112: } ! 1113: for (i = '0'; i <= '9'; i++) ! 1114: ++is_idchar[i]; ! 1115: ++is_idchar['_']; ! 1116: ++is_idstart['_']; ! 1117: #ifdef DOLLARS_IN_IDENTIFIERS ! 1118: ++is_idchar['$']; ! 1119: ++is_idstart['$']; ! 1120: #endif ! 1121: ! 1122: /* horizontal space table */ ! 1123: ++is_hor_space[' ']; ! 1124: ++is_hor_space['\t']; ! 1125: } ! 1126: ! 1127: error (msg) ! 1128: { ! 1129: printf("error: %s\n", msg); ! 1130: } ! 1131: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.