|
|
1.1 ! root 1: ! 2: #include "gram.h" ! 3: #include "expr.pub" ! 4: #include "bpts.pub" ! 5: #include <ctype.h> ! 6: int LexIndex; ! 7: int LexGoal; ! 8: struct Expr *CurrentExpr; ! 9: char *LexString; ! 10: char *yyerr; /* yacc doesn't use this */ ! 11: long yyres; ! 12: char Token[128]; ! 13: int DotDot; ! 14: Expr *E_IConst(long), *E_DConst(double); ! 15: ! 16: typedef union { ! 17: char cc; ! 18: long ll; ! 19: char ss[32]; ! 20: struct Expr *ee; ! 21: double dd; ! 22: } YYSTYPE; ! 23: # define G_EXPR 257 ! 24: # define G_DOTEQ_CONEX 258 ! 25: # define G_DOLEQ_CONEX 259 ! 26: # define G_CONEX 260 ! 27: # define G_DOTDOT 261 ! 28: # define ICONST 262 ! 29: # define ID 263 ! 30: # define PCENT 264 ! 31: # define EQUAL 265 ! 32: # define SLASH 266 ! 33: # define DOLLAR 267 ! 34: # define SIZEOF 268 ! 35: # define TYPEOF 269 ! 36: # define QMARK 270 ! 37: # define SEMI 271 ! 38: # define UNOP 272 ! 39: # define STAR 273 ! 40: # define PLUS 274 ! 41: # define MINUS 275 ! 42: # define AMPER 276 ! 43: # define ARROW 277 ! 44: # define DOT 278 ! 45: # define LB 279 ! 46: # define LP 280 ! 47: # define COMMA 281 ! 48: # define ERROR 282 ! 49: # define RB 283 ! 50: # define RP 284 ! 51: # define PLUSPLUS 285 ! 52: # define MINUSMINUS 286 ! 53: # define EQUALEQUAL 287 ! 54: # define GREATER 288 ! 55: # define LESS 289 ! 56: # define BAR 290 ! 57: # define BARBAR 291 ! 58: # define AMPERAMPER 292 ! 59: # define HAT 293 ! 60: # define TILDE 294 ! 61: # define GREATEREQUAL 295 ! 62: # define LESSEQUAL 296 ! 63: # define FABS 297 ! 64: # define GREATERGREATER 298 ! 65: # define LESSLESS 299 ! 66: # define BANG 300 ! 67: # define BANGEQUAL 301 ! 68: # define DCONST 302 ! 69: # define LC 303 ! 70: # define RC 304 ! 71: # define DOTDOT 305 ! 72: #define yyclearin yychar = -1 ! 73: #define yyerrok yyerrflag = 0 ! 74: extern int yychar; ! 75: extern short yyerrflag; ! 76: #ifndef YYMAXDEPTH ! 77: #define YYMAXDEPTH 150 ! 78: #endif ! 79: YYSTYPE yylval, yyval; ! 80: # define YYERRCODE 256 ! 81: ! 82: ! 83: ! 84: #define LOOK (LexString[LexIndex ]) ! 85: #define TAKE (AddToken(), LexString[LexIndex++]) ! 86: #define MORE (LexString[LexIndex+1]) ! 87: #define yc (yylval.cc) ! 88: #define yd (yylval.dd) ! 89: #define yl (yylval.ll) ! 90: #define ys (yylval.ss) ! 91: #define ishex(x) (isdigit(x) || (x>='a'&&x<='f') || (x>='A'&&x<='F')) ! 92: #define isoct(x) ( x>='0' && x<='7' ) ! 93: int doyylex(); ! 94: int yyerror(char*); ! 95: ! 96: yylex() ! 97: { ! 98: int token = doyylex(); ! 99: ! 100: return token; ! 101: } ! 102: ! 103: void AddToken() ! 104: { ! 105: int l = strlen(Token); ! 106: ! 107: if( l < 64 ){ ! 108: Token[l] = LOOK; ! 109: Token[l+1] = '\0'; ! 110: } ! 111: } ! 112: ! 113: doyylex() ! 114: { ! 115: double atof(char*); ! 116: ! 117: if( LexIndex < 0 ){ ! 118: LexIndex = 0; ! 119: return LexGoal; ! 120: } ! 121: while( isspace(LOOK) ) TAKE; ! 122: Token[0] = '\0'; ! 123: if( isalpha(LOOK) || LOOK=='_' || LOOK=='$' ){ ! 124: TAKE; ! 125: while( isalnum(LOOK) || LOOK=='_' ) TAKE; ! 126: strcpy( ys, Token ); ! 127: if( !strcmp(ys,"sizeof") ) return SIZEOF; ! 128: if( !strcmp(ys,"typeof") ) return TYPEOF; ! 129: if( !strcmp(ys,"fabs") ) return FABS; ! 130: if( !strcmp(ys,"$") ) return DOLLAR; ! 131: return ID; ! 132: } ! 133: if( LOOK == '\'' ){ ! 134: TAKE; ! 135: if( LOOK == '\\' ){ ! 136: TAKE; ! 137: if( MORE != '\'' ) return 0; ! 138: char *trans = "bnftv", *late = "\b\n\f\t\v"; ! 139: yl = LOOK; ! 140: for( int i = 0; trans[i]; ++i ) ! 141: if( LOOK == trans[i] ) yl = late[i]; ! 142: TAKE; TAKE; return ICONST; ! 143: } ! 144: if( MORE != '\'' ) return 0; ! 145: yl = TAKE; ! 146: TAKE; ! 147: return ICONST; ! 148: } ! 149: if( LOOK=='0' && (MORE=='x' || MORE=='X') ){ ! 150: TAKE; TAKE; ! 151: if( !ishex(LOOK) ) return 0; ! 152: for( yl = 0; ishex(LOOK); TAKE ) ! 153: yl = (yl<<4) + (isalpha(LOOK) ? (LOOK|' ')+10-'a' : LOOK-'0'); ! 154: return ICONST; ! 155: } ! 156: if( LOOK=='0' ){ ! 157: for( TAKE, yl = 0; isoct(LOOK); TAKE ) yl = (yl<<3) + LOOK - '0'; ! 158: goto IorD; ! 159: } ! 160: if( isdigit(LOOK) ){ ! 161: for( yl = 0; isdigit(LOOK); TAKE ) yl = yl*10 + LOOK - '0'; ! 162: goto IorD; ! 163: } ! 164: if( LOOK == '.' && isdigit(MORE) ) goto Point; ! 165: #define EAT2(x) {TAKE; TAKE; return x;} ! 166: if( LOOK=='.' && MORE=='.' ) EAT2(DOTDOT) ! 167: if( LOOK=='-' && MORE=='>' ) EAT2(ARROW) ! 168: if( LOOK=='-' && MORE=='-' ) EAT2(MINUSMINUS) ! 169: if( LOOK=='+' && MORE=='+' ) EAT2(PLUSPLUS) ! 170: if( LOOK=='=' && MORE=='=' ) EAT2(EQUALEQUAL) ! 171: if( LOOK=='!' && MORE=='=' ) EAT2(BANGEQUAL) ! 172: if( LOOK==':' && MORE=='=' ) EAT2(EQUAL) ! 173: if( LOOK=='>' && MORE=='=' ) EAT2(GREATEREQUAL) ! 174: if( LOOK=='<' && MORE=='=' ) EAT2(LESSEQUAL) ! 175: if( LOOK=='&' && MORE=='&' ) EAT2(AMPERAMPER) ! 176: if( LOOK=='|' && MORE=='|' ) EAT2(BARBAR) ! 177: if( LOOK=='>' && MORE=='>' ) EAT2(GREATERGREATER) ! 178: if( LOOK=='<' && MORE=='<' ) EAT2(LESSLESS) ! 179: switch( TAKE ){ ! 180: case '>' : return GREATER; ! 181: case '<' : return LESS; ! 182: case '/' : return SLASH; ! 183: case '*' : return STAR; ! 184: case '+' : return PLUS; ! 185: case '-' : return MINUS; ! 186: case '.' : return DOT; ! 187: case '(' : return LP; ! 188: case ')' : return RP; ! 189: case '[' : return LB; ! 190: case ']' : return RB; ! 191: case '&' : return AMPER; ! 192: case ',' : return COMMA; ! 193: case '%' : return PCENT; ! 194: case '=' : return EQUAL; ! 195: case ';' : return SEMI; ! 196: case '|' : return BAR; ! 197: case '^' : return HAT; ! 198: case '~' : return TILDE; ! 199: case '!' : return BANG; ! 200: case '{' : return LC; ! 201: case '}' : return RC; ! 202: default : return 0; ! 203: } ! 204: IorD: ! 205: if( LOOK=='l' || LOOK=='L' ) return TAKE, ICONST; ! 206: if( LOOK=='.' && MORE=='.' ) return ICONST; ! 207: if( LOOK=='.' ) goto Point; ! 208: if( LOOK=='e' || LOOK=='E' ) goto Exp; ! 209: return ICONST; ! 210: Point: ! 211: for( TAKE; isdigit(LOOK); TAKE) {} ! 212: if( LOOK!='e' && LOOK!='E' ) goto Double; ! 213: Exp: ! 214: TAKE; ! 215: if( LOOK=='+' || LOOK=='-' ) TAKE; ! 216: if( !isdigit(LOOK) ) return 0; ! 217: while( isdigit(LOOK) ) TAKE; ! 218: Double: ! 219: yd = atof(Token); ! 220: return DCONST; ! 221: ! 222: } ! 223: short yyexca[] ={ ! 224: -1, 1, ! 225: 0, -1, ! 226: -2, 0, ! 227: }; ! 228: # define YYNPROD 62 ! 229: # define YYLAST 800 ! 230: short yyact[]={ ! 231: ! 232: 66, 50, 68, 128, 81, 72, 127, 42, 9, 67, ! 233: 69, 64, 54, 65, 48, 70, 10, 49, 35, 34, ! 234: 129, 126, 110, 56, 59, 58, 53, 51, 52, 55, ! 235: 93, 61, 60, 8, 62, 63, 7, 57, 66, 50, ! 236: 68, 47, 65, 48, 70, 1, 117, 67, 69, 64, ! 237: 54, 65, 48, 70, 0, 49, 0, 125, 0, 0, ! 238: 0, 56, 59, 58, 53, 51, 52, 55, 0, 61, ! 239: 60, 0, 62, 63, 0, 57, 66, 50, 68, 47, ! 240: 2, 4, 5, 6, 3, 67, 69, 64, 54, 65, ! 241: 48, 70, 0, 49, 0, 0, 120, 0, 0, 56, ! 242: 59, 58, 53, 51, 52, 55, 0, 61, 60, 0, ! 243: 62, 63, 0, 57, 66, 50, 68, 47, 0, 0, ! 244: 0, 0, 0, 67, 69, 64, 54, 65, 48, 70, ! 245: 0, 49, 0, 0, 0, 0, 0, 56, 59, 58, ! 246: 53, 51, 52, 55, 0, 61, 60, 0, 62, 63, ! 247: 0, 57, 0, 0, 116, 47, 66, 50, 68, 0, ! 248: 0, 0, 0, 82, 0, 67, 69, 64, 54, 65, ! 249: 48, 70, 0, 49, 0, 0, 0, 0, 0, 56, ! 250: 59, 58, 53, 51, 52, 55, 0, 61, 60, 0, ! 251: 62, 63, 0, 57, 66, 50, 68, 47, 0, 0, ! 252: 0, 46, 0, 67, 69, 64, 54, 65, 48, 70, ! 253: 0, 49, 0, 0, 0, 0, 0, 56, 59, 58, ! 254: 53, 51, 52, 55, 0, 61, 60, 0, 62, 63, ! 255: 0, 57, 66, 50, 68, 47, 0, 0, 0, 0, ! 256: 0, 67, 69, 64, 54, 65, 48, 70, 0, 0, ! 257: 0, 0, 0, 0, 0, 56, 59, 58, 53, 51, ! 258: 52, 55, 0, 61, 60, 0, 62, 63, 0, 57, ! 259: 66, 50, 68, 47, 0, 0, 0, 0, 0, 67, ! 260: 69, 64, 54, 65, 48, 70, 0, 49, 0, 0, ! 261: 0, 0, 0, 56, 59, 58, 53, 51, 52, 55, ! 262: 0, 61, 60, 0, 62, 63, 0, 57, 66, 50, ! 263: 68, 14, 13, 0, 0, 0, 12, 67, 69, 64, ! 264: 54, 65, 48, 70, 16, 15, 0, 0, 0, 17, ! 265: 0, 56, 59, 58, 53, 51, 52, 55, 0, 61, ! 266: 60, 0, 62, 63, 66, 57, 68, 0, 0, 0, ! 267: 0, 0, 0, 67, 69, 64, 54, 65, 48, 70, ! 268: 0, 0, 38, 0, 40, 0, 0, 56, 59, 58, ! 269: 53, 39, 52, 55, 0, 61, 60, 42, 62, 63, ! 270: 66, 57, 68, 0, 0, 0, 0, 0, 0, 67, ! 271: 69, 64, 54, 65, 48, 70, 0, 0, 0, 0, ! 272: 0, 0, 0, 56, 59, 58, 53, 0, 0, 55, ! 273: 0, 61, 60, 0, 62, 63, 66, 57, 68, 0, ! 274: 0, 0, 0, 0, 0, 67, 69, 64, 54, 65, ! 275: 48, 70, 0, 0, 0, 0, 0, 0, 0, 56, ! 276: 59, 58, 0, 0, 0, 55, 0, 61, 60, 0, ! 277: 62, 63, 66, 57, 68, 0, 0, 0, 0, 0, ! 278: 0, 67, 69, 64, 54, 65, 48, 70, 0, 0, ! 279: 0, 0, 0, 0, 0, 56, 59, 58, 0, 66, ! 280: 0, 68, 0, 61, 60, 0, 62, 63, 67, 57, ! 281: 23, 21, 65, 48, 70, 19, 26, 27, 0, 0, ! 282: 66, 24, 68, 29, 25, 0, 0, 0, 31, 67, ! 283: 69, 64, 118, 65, 48, 70, 0, 0, 0, 0, ! 284: 0, 0, 30, 0, 0, 32, 0, 0, 28, 0, ! 285: 22, 20, 23, 21, 62, 63, 0, 19, 26, 27, ! 286: 0, 0, 38, 24, 40, 29, 25, 0, 0, 0, ! 287: 31, 39, 41, 37, 0, 0, 0, 42, 0, 0, ! 288: 0, 0, 91, 0, 30, 0, 66, 32, 68, 0, ! 289: 28, 0, 22, 20, 0, 67, 69, 64, 0, 65, ! 290: 48, 70, 0, 0, 0, 0, 0, 0, 0, 56, ! 291: 59, 58, 0, 0, 0, 0, 0, 61, 60, 0, ! 292: 62, 63, 66, 57, 68, 0, 0, 0, 0, 0, ! 293: 0, 67, 69, 64, 0, 65, 48, 70, 0, 0, ! 294: 38, 0, 40, 0, 0, 0, 59, 58, 0, 39, ! 295: 41, 37, 0, 61, 60, 42, 62, 63, 66, 124, ! 296: 68, 0, 0, 0, 0, 0, 0, 67, 69, 64, ! 297: 0, 65, 48, 70, 38, 0, 40, 0, 0, 0, ! 298: 0, 123, 0, 39, 41, 37, 38, 0, 40, 42, ! 299: 18, 0, 0, 122, 0, 39, 41, 37, 38, 33, ! 300: 40, 42, 0, 0, 0, 36, 0, 39, 41, 37, ! 301: 0, 71, 0, 42, 0, 73, 74, 75, 76, 77, ! 302: 78, 79, 80, 0, 0, 0, 0, 0, 0, 0, ! 303: 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, ! 304: 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, ! 305: 104, 105, 106, 107, 108, 109, 0, 111, 112, 113, ! 306: 114, 115, 11, 119, 0, 0, 0, 0, 0, 0, ! 307: 0, 0, 121, 0, 0, 0, 0, 0, 43, 44, ! 308: 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 309: 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, ! 310: 85, 86, 87, 88, 89, 90, 0, 0, 0, 0, ! 311: 0, 0, 0, 0, 0, 0, 0, 0, 0, 130 }; ! 312: short yypact[]={ ! 313: ! 314: -177,-1000,-1000,-1000,-270,-251, 49, 270, 270,-246, ! 315: -247, 414,-1000,-1000,-1000, 49, 49, 49, -70,-1000, ! 316: 270,-275,-1000,-1000, 270, 270, 270, 270, 270, 270, ! 317: 270, 270,-276,-108, 49, 49,-1000, 49, 49, 49, ! 318: 49, 49, 49,-272,-272, 278,-1000, 270,-233, 270, ! 319: 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, ! 320: 270, 270, 270, 270, 270,-241, 270, 270, 270, 270, ! 321: 270,-150, 228,-235, 302,-235,-235,-235,-235,-235, ! 322: -188, 270,-1000, 402, 390, 98,-272,-272,-272, 98, ! 323: 356,-1000, 6,-1000, 44, 44, 80, 116, 152, 302, ! 324: 188, 338, 338, 236, 236, 236, 236, 374, 374, 215, ! 325: -1000,-235,-235,-235, 215,-226,-242,-278,-1000, -32, ! 326: -1000,-264,-1000,-1000,-1000,-1000,-1000,-1000, 270,-1000, ! 327: -32 }; ! 328: short yypgo[]={ ! 329: ! 330: 0, 670, 46, 742, 45, 36, 33 }; ! 331: short yyr1[]={ ! 332: ! 333: 0, 5, 4, 6, 4, 4, 4, 4, 1, 1, ! 334: 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ! 335: 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ! 336: 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ! 337: 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, ! 338: 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, ! 339: 2, 2 }; ! 340: short yyr2[]={ ! 341: ! 342: 0, 0, 4, 0, 4, 5, 5, 3, 1, 4, ! 343: 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, ! 344: 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, ! 345: 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, ! 346: 3, 3, 3, 4, 4, 3, 3, 4, 1, 1, ! 347: 1, 2, 2, 3, 3, 3, 3, 3, 4, 3, ! 348: 1, 3 }; ! 349: short yychk[]={ ! 350: ! 351: -1000, -4, 257, 261, 258, 259, 260, -5, -6, 278, ! 352: 267, -3, 267, 263, 262, 276, 275, 280, -1, 267, ! 353: 303, 263, 302, 262, 273, 276, 268, 269, 300, 275, ! 354: 294, 280, 297, -1, 265, 265, 271, 275, 264, 273, ! 355: 266, 274, 279, -3, -3, -3, 271, 305, 278, 281, ! 356: 265, 291, 292, 290, 276, 293, 287, 301, 289, 288, ! 357: 296, 295, 298, 299, 275, 277, 264, 273, 266, 274, ! 358: 279, -1, 280, -1, -1, -1, -1, -1, -1, -1, ! 359: -1, 280, 271, -3, -3, -3, -3, -3, -3, -3, ! 360: -3, 284, -1, 263, -1, -1, -1, -1, -1, -1, ! 361: -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! 362: 263, -1, -1, -1, -1, -1, 304, -2, 284, -1, ! 363: 284, -1, 271, 271, 283, 283, 263, 284, 281, 284, ! 364: -1 }; ! 365: short yydef[]={ ! 366: ! 367: 0, -2, 1, 3, 0, 0, 0, 0, 0, 0, ! 368: 0, 0, 48, 49, 50, 0, 0, 0, 0, 8, ! 369: 0, 10, 11, 12, 0, 0, 0, 0, 0, 0, ! 370: 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, ! 371: 0, 0, 0, 51, 52, 0, 2, 0, 0, 0, ! 372: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 373: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 374: 0, 0, 0, 13, 14, 15, 16, 17, 18, 19, ! 375: 0, 0, 4, 0, 0, 53, 54, 55, 56, 57, ! 376: 0, 59, 20, 21, 22, 23, 24, 25, 26, 27, ! 377: 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, ! 378: 38, 39, 40, 41, 42, 0, 0, 0, 45, 60, ! 379: 46, 0, 5, 6, 58, 43, 9, 44, 0, 47, ! 380: 61 }; ! 381: #ifndef lint ! 382: static char yaccpar_sccsid[] = "@(#)yaccpar 1.2 86/07/18 SMI"; /* from UCB 4.1 83/02/11 */ ! 383: #endif ! 384: ! 385: # ! 386: # define YYFLAG -1000 ! 387: # define YYERROR goto yyerrlab ! 388: # define YYACCEPT return(0) ! 389: # define YYABORT return(1) ! 390: ! 391: /* parser for yacc output */ ! 392: ! 393: #ifdef YYDEBUG ! 394: int yydebug = 0; /* 1 for debugging */ ! 395: #endif ! 396: YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */ ! 397: int yychar = -1; /* current input token number */ ! 398: int yynerrs = 0; /* number of errors */ ! 399: short yyerrflag = 0; /* error recovery flag */ ! 400: ! 401: yyparse() { ! 402: ! 403: short yys[YYMAXDEPTH]; ! 404: short yyj, yym; ! 405: register YYSTYPE *yypvt; ! 406: register short yystate, *yyps, yyn; ! 407: register YYSTYPE *yypv; ! 408: register short *yyxi; ! 409: ! 410: yystate = 0; ! 411: yychar = -1; ! 412: yynerrs = 0; ! 413: yyerrflag = 0; ! 414: yyps= &yys[-1]; ! 415: yypv= &yyv[-1]; ! 416: ! 417: yystack: /* put a state and value onto the stack */ ! 418: ! 419: #ifdef YYDEBUG ! 420: if( yydebug ) printf( "state %d, char 0%o\n", yystate, yychar ); ! 421: #endif ! 422: if( ++yyps>= &yys[YYMAXDEPTH] ) { yyerror( "yacc stack overflow" ); return(1); } ! 423: *yyps = yystate; ! 424: ++yypv; ! 425: *yypv = yyval; ! 426: ! 427: yynewstate: ! 428: ! 429: yyn = yypact[yystate]; ! 430: ! 431: if( yyn<= YYFLAG ) goto yydefault; /* simple state */ ! 432: ! 433: if( yychar<0 ) if( (yychar=yylex())<0 ) yychar=0; ! 434: if( (yyn += yychar)<0 || yyn >= YYLAST ) goto yydefault; ! 435: ! 436: if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */ ! 437: yychar = -1; ! 438: yyval = yylval; ! 439: yystate = yyn; ! 440: if( yyerrflag > 0 ) --yyerrflag; ! 441: goto yystack; ! 442: } ! 443: ! 444: yydefault: ! 445: /* default state action */ ! 446: ! 447: if( (yyn=yydef[yystate]) == -2 ) { ! 448: if( yychar<0 ) if( (yychar=yylex())<0 ) yychar = 0; ! 449: /* look through exception table */ ! 450: ! 451: for( yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate) ; yyxi += 2 ) ; /* VOID */ ! 452: ! 453: while( *(yyxi+=2) >= 0 ){ ! 454: if( *yyxi == yychar ) break; ! 455: } ! 456: if( (yyn = yyxi[1]) < 0 ) return(0); /* accept */ ! 457: } ! 458: ! 459: if( yyn == 0 ){ /* error */ ! 460: /* error ... attempt to resume parsing */ ! 461: ! 462: switch( yyerrflag ){ ! 463: ! 464: case 0: /* brand new error */ ! 465: ! 466: yyerror( "syntax error" ); ! 467: yyerrlab: ! 468: ++yynerrs; ! 469: ! 470: case 1: ! 471: case 2: /* incompletely recovered error ... try again */ ! 472: ! 473: yyerrflag = 3; ! 474: ! 475: /* find a state where "error" is a legal shift action */ ! 476: ! 477: while ( yyps >= yys ) { ! 478: yyn = yypact[*yyps] + YYERRCODE; ! 479: if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){ ! 480: yystate = yyact[yyn]; /* simulate a shift of "error" */ ! 481: goto yystack; ! 482: } ! 483: yyn = yypact[*yyps]; ! 484: ! 485: /* the current yyps has no shift onn "error", pop stack */ ! 486: ! 487: #ifdef YYDEBUG ! 488: if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] ); ! 489: #endif ! 490: --yyps; ! 491: --yypv; ! 492: } ! 493: ! 494: /* there is no state on the stack with an error shift ... abort */ ! 495: ! 496: yyabort: ! 497: return(1); ! 498: ! 499: ! 500: case 3: /* no shift yet; clobber input char */ ! 501: ! 502: #ifdef YYDEBUG ! 503: if( yydebug ) printf( "error recovery discards char %d\n", yychar ); ! 504: #endif ! 505: ! 506: if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */ ! 507: yychar = -1; ! 508: goto yynewstate; /* try again in the same state */ ! 509: ! 510: } ! 511: ! 512: } ! 513: ! 514: /* reduction by production yyn */ ! 515: ! 516: #ifdef YYDEBUG ! 517: if( yydebug ) printf("reduce %d\n",yyn); ! 518: #endif ! 519: yyps -= yyr2[yyn]; ! 520: yypvt = yypv; ! 521: yypv -= yyr2[yyn]; ! 522: yyval = yypv[1]; ! 523: yym=yyn; ! 524: /* consult goto table to find next state */ ! 525: yyn = yyr1[yyn]; ! 526: yyj = yypgo[yyn] + *yyps + 1; ! 527: if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]]; ! 528: switch(yym){ ! 529: ! 530: case 1: ! 531: { DotDot=0; } break; ! 532: case 2: ! 533: { yyres = (long) yypvt[-1].ee; } break; ! 534: case 3: ! 535: { DotDot=1; } break; ! 536: case 4: ! 537: { yyres = (long) yypvt[-1].ee; } break; ! 538: case 5: ! 539: { yyres = (long) yypvt[-1].ee; } break; ! 540: case 6: ! 541: { yyres = (long) yypvt[-1].ee; } break; ! 542: case 7: ! 543: { yyres = (long) yypvt[-1].ee; } break; ! 544: case 8: ! 545: { if( !CurrentExpr){ ! 546: yyerror("$ cannot be used here"); ! 547: YYACCEPT; ! 548: } ! 549: yyval.ee = CurrentExpr; ! 550: } break; ! 551: case 9: ! 552: { yyval.ee = E_Binary( yypvt[-2].ee, O_ENV, E_Id(yypvt[-0].ss) ); } break; ! 553: case 10: ! 554: { yyval.ee = E_Id( yypvt[-0].ss ); } break; ! 555: case 11: ! 556: { yyval.ee = E_DConst( yypvt[-0].dd ); } break; ! 557: case 12: ! 558: { yyval.ee = E_IConst( yypvt[-0].ll ); } break; ! 559: case 13: ! 560: { yyval.ee = E_Unary( O_DEREF, yypvt[-0].ee ); } break; ! 561: case 14: ! 562: { yyval.ee = E_Unary( O_REF, yypvt[-0].ee ); } break; ! 563: case 15: ! 564: { yyval.ee = E_Unary( O_SIZEOF, yypvt[-0].ee ); } break; ! 565: case 16: ! 566: { yyval.ee = E_Unary( O_TYPEOF, yypvt[-0].ee ); } break; ! 567: case 17: ! 568: { yyval.ee = E_Unary( O_LOGNOT, yypvt[-0].ee ); } break; ! 569: case 18: ! 570: { yyval.ee = E_Unary( O_MINUS, yypvt[-0].ee ); } break; ! 571: case 19: ! 572: { yyval.ee = E_Unary( O_1SCOMP, yypvt[-0].ee ); } break; ! 573: case 20: ! 574: { if( !DotDot ){ ! 575: yyerror(".. cannot be used here"); ! 576: YYACCEPT; ! 577: } ! 578: yyval.ee = E_Binary( yypvt[-2].ee, O_RANGE, yypvt[-0].ee );} break; ! 579: case 21: ! 580: { yyval.ee = E_Binary( yypvt[-2].ee, O_DOT, E_Id(yypvt[-0].ss)); } break; ! 581: case 22: ! 582: { yyval.ee = E_Binary( yypvt[-2].ee, O_COMMA, yypvt[-0].ee ); } break; ! 583: case 23: ! 584: { yyval.ee = E_Binary( yypvt[-2].ee, O_ASSIGN, yypvt[-0].ee ); } break; ! 585: case 24: ! 586: { yyval.ee = E_Binary( yypvt[-2].ee, O_LOGOR, yypvt[-0].ee ); } break; ! 587: case 25: ! 588: { yyval.ee = E_Binary( yypvt[-2].ee, O_LOGAND, yypvt[-0].ee ); } break; ! 589: case 26: ! 590: { yyval.ee = E_Binary( yypvt[-2].ee, O_BITOR, yypvt[-0].ee ); } break; ! 591: case 27: ! 592: { yyval.ee = E_Binary( yypvt[-2].ee, O_BITAND, yypvt[-0].ee ); } break; ! 593: case 28: ! 594: { yyval.ee = E_Binary( yypvt[-2].ee, O_BITXOR, yypvt[-0].ee ); } break; ! 595: case 29: ! 596: { yyval.ee = E_Binary( yypvt[-2].ee, O_EQ, yypvt[-0].ee ); } break; ! 597: case 30: ! 598: { yyval.ee = E_Binary( yypvt[-2].ee, O_NE, yypvt[-0].ee ); } break; ! 599: case 31: ! 600: { yyval.ee = E_Binary( yypvt[-2].ee, O_LT, yypvt[-0].ee ); } break; ! 601: case 32: ! 602: { yyval.ee = E_Binary( yypvt[-2].ee, O_GT, yypvt[-0].ee ); } break; ! 603: case 33: ! 604: { yyval.ee = E_Binary( yypvt[-2].ee, O_LE, yypvt[-0].ee ); } break; ! 605: case 34: ! 606: { yyval.ee = E_Binary( yypvt[-2].ee, O_GE, yypvt[-0].ee ); } break; ! 607: case 35: ! 608: { yyval.ee = E_Binary( yypvt[-2].ee, O_RSHIFT, yypvt[-0].ee ); } break; ! 609: case 36: ! 610: { yyval.ee = E_Binary( yypvt[-2].ee, O_LSHIFT, yypvt[-0].ee ); } break; ! 611: case 37: ! 612: { yyval.ee = E_Binary( yypvt[-2].ee, O_MINUS, yypvt[-0].ee ); } break; ! 613: case 38: ! 614: { yyval.ee = E_Binary( yypvt[-2].ee, O_ARROW, E_Id(yypvt[-0].ss)); } break; ! 615: case 39: ! 616: { yyval.ee = E_Binary( yypvt[-2].ee, O_MOD, yypvt[-0].ee ); } break; ! 617: case 40: ! 618: { yyval.ee = E_Binary( yypvt[-2].ee, O_MULT, yypvt[-0].ee ); } break; ! 619: case 41: ! 620: { yyval.ee = E_Binary( yypvt[-2].ee, O_DIV, yypvt[-0].ee ); } break; ! 621: case 42: ! 622: { yyval.ee = E_Binary( yypvt[-2].ee, O_PLUS, yypvt[-0].ee ); } break; ! 623: case 43: ! 624: { yyval.ee = E_Binary( yypvt[-3].ee, O_INDEX, yypvt[-1].ee );} break; ! 625: case 44: ! 626: { yyval.ee = E_Binary( E_Id(yypvt[-3].ss), O_CALL, yypvt[-1].ee ); } break; ! 627: case 45: ! 628: { yyval.ee = E_Binary( E_Id(yypvt[-2].ss), O_CALL, 0 ); } break; ! 629: case 46: ! 630: { yyval.ee = yypvt[-1].ee; } break; ! 631: case 47: ! 632: { yyval.ee = E_Unary( O_FABS, yypvt[-1].ee ); } break; ! 633: case 48: ! 634: { if( !CurrentExpr){ ! 635: yyerror("no current expression for $"); ! 636: YYACCEPT; ! 637: } ! 638: yyval.ee = CurrentExpr; ! 639: } break; ! 640: case 49: ! 641: { yyval.ee = E_Id( yypvt[-0].ss ); } break; ! 642: case 50: ! 643: { yyval.ee = E_IConst( yypvt[-0].ll ); } break; ! 644: case 51: ! 645: { yyval.ee = E_Unary( O_REF, yypvt[-0].ee ); } break; ! 646: case 52: ! 647: { yyval.ee = E_Unary( O_MINUS, yypvt[-0].ee ); } break; ! 648: case 53: ! 649: { yyval.ee = E_Binary( yypvt[-2].ee, O_MINUS, yypvt[-0].ee ); } break; ! 650: case 54: ! 651: { yyval.ee = E_Binary( yypvt[-2].ee, O_MOD, yypvt[-0].ee ); } break; ! 652: case 55: ! 653: { yyval.ee = E_Binary( yypvt[-2].ee, O_MULT, yypvt[-0].ee ); } break; ! 654: case 56: ! 655: { yyval.ee = E_Binary( yypvt[-2].ee, O_DIV, yypvt[-0].ee ); } break; ! 656: case 57: ! 657: { yyval.ee = E_Binary( yypvt[-2].ee, O_PLUS, yypvt[-0].ee ); } break; ! 658: case 58: ! 659: { yyval.ee = E_Binary( yypvt[-3].ee, O_INDEX, yypvt[-1].ee );} break; ! 660: case 59: ! 661: { yyval.ee = yypvt[-1].ee; } break; ! 662: case 60: ! 663: { yyval.ee = yypvt[-0].ee; } break; ! 664: case 61: ! 665: { yyval.ee = E_Binary( yypvt[-2].ee, O_COMMA, yypvt[-0].ee ); } break; ! 666: } ! 667: goto yystack; /* stack new state and value */ ! 668: ! 669: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.