1 /* Driver template for the LEMON parser generator. 2 ** The author disclaims copyright to this source code. 3 */ 4 /* First off, code is include which follows the "include" declaration 5 ** in the input file. */ 6 #include <stdio.h> 7 %% 8 /* Next is all token values, in a form suitable for use by makeheaders. 9 ** This section will be null unless lemon is run with the -m switch. 10 */ 11 /* 12 ** These constants (all generated automatically by the parser generator) 13 ** specify the various kinds of tokens (terminals) that the parser 14 ** understands. 15 ** 16 ** Each symbol here is a terminal symbol in the grammar. 17 */ 18 %% 19 /* Make sure the INTERFACE macro is defined. 20 */ 21 #ifndef INTERFACE 22 # define INTERFACE 1 23 #endif 24 /* The next thing included is series of defines which control 25 ** various aspects of the generated parser. 26 ** YYCODETYPE is the data type used for storing terminal 27 ** and nonterminal numbers. "unsigned char" is 28 ** used if there are fewer than 250 terminals 29 ** and nonterminals. "int" is used otherwise. 30 ** YYNOCODE is a number of type YYCODETYPE which corresponds 31 ** to no legal terminal or nonterminal number. This 32 ** number is used to fill in empty slots of the hash 33 ** table. 34 ** YYFALLBACK If defined, this indicates that one or more tokens 35 ** have fall-back values which should be used if the 36 ** original value of the token will not parse. 37 ** YYACTIONTYPE is the data type used for storing terminal 38 ** and nonterminal numbers. "unsigned char" is 39 ** used if there are fewer than 250 rules and 40 ** states combined. "int" is used otherwise. 41 ** ParseTOKENTYPE is the data type used for minor tokens given 42 ** directly to the parser from the tokenizer. 43 ** YYMINORTYPE is the data type used for all minor tokens. 44 ** This is typically a union of many types, one of 45 ** which is ParseTOKENTYPE. The entry in the union 46 ** for base tokens is called "yy0". 47 ** YYSTACKDEPTH is the maximum depth of the parser's stack. 48 ** ParseARG_SDECL A static variable declaration for the %extra_argument 49 ** ParseARG_PDECL A parameter declaration for the %extra_argument 50 ** ParseARG_STORE Code to store %extra_argument into yypParser 51 ** ParseARG_FETCH Code to extract %extra_argument from yypParser 52 ** YYNSTATE the combined number of states. 53 ** YYNRULE the number of rules in the grammar 54 ** YYERRORSYMBOL is the code number of the error symbol. If not 55 ** defined, then do no error processing. 56 */ 57 %% 58 #define YY_NO_ACTION (YYNSTATE+YYNRULE+2) 59 #define YY_ACCEPT_ACTION (YYNSTATE+YYNRULE+1) 60 #define YY_ERROR_ACTION (YYNSTATE+YYNRULE) 61 62 /* Next are that tables used to determine what action to take based on the 63 ** current state and lookahead token. These tables are used to implement 64 ** functions that take a state number and lookahead value and return an 65 ** action integer. 66 ** 67 ** Suppose the action integer is N. Then the action is determined as 68 ** follows 69 ** 70 ** 0 <= N < YYNSTATE Shift N. That is, push the lookahead 71 ** token onto the stack and goto state N. 72 ** 73 ** YYNSTATE <= N < YYNSTATE+YYNRULE Reduce by rule N-YYNSTATE. 74 ** 75 ** N == YYNSTATE+YYNRULE A syntax error has occurred. 76 ** 77 ** N == YYNSTATE+YYNRULE+1 The parser accepts its input. 78 ** 79 ** N == YYNSTATE+YYNRULE+2 No such action. Denotes unused 80 ** slots in the yy_action[] table. 81 ** 82 ** The action table is constructed as a single large table named yy_action[]. 83 ** Given state S and lookahead X, the action is computed as 84 ** 85 ** yy_action[ yy_shift_ofst[S] + X ] 86 ** 87 ** If the index value yy_shift_ofst[S]+X is out of range or if the value 88 ** yy_lookahead[yy_shift_ofst[S]+X] is not equal to X or if yy_shift_ofst[S] 89 ** is equal to YY_SHIFT_USE_DFLT, it means that the action is not in the table 90 ** and that yy_default[S] should be used instead. 91 ** 92 ** The formula above is for computing the action when the lookahead is 93 ** a terminal symbol. If the lookahead is a non-terminal (as occurs after 94 ** a reduce action) then the yy_reduce_ofst[] array is used in place of 95 ** the yy_shift_ofst[] array and YY_REDUCE_USE_DFLT is used in place of 96 ** YY_SHIFT_USE_DFLT. 97 ** 98 ** The following are the tables generated in this section: 99 ** 100 ** yy_action[] A single table containing all actions. 101 ** yy_lookahead[] A table containing the lookahead for each entry in 102 ** yy_action. Used to detect hash collisions. 103 ** yy_shift_ofst[] For each state, the offset into yy_action for 104 ** shifting terminals. 105 ** yy_reduce_ofst[] For each state, the offset into yy_action for 106 ** shifting non-terminals after a reduce. 107 ** yy_default[] Default action for each state. 108 */ 109 %% 110 #define YY_SZ_ACTTAB (sizeof(yy_action)/sizeof(yy_action[0])) 111 112 /* The next table maps tokens into fallback tokens. If a construct 113 ** like the following: 114 ** 115 ** %fallback ID X Y Z. 116 ** 117 ** appears in the grammer, then ID becomes a fallback token for X, Y, 118 ** and Z. Whenever one of the tokens X, Y, or Z is input to the parser 119 ** but it does not parse, the type of the token is changed to ID and 120 ** the parse is retried before an error is thrown. 121 */ 122 #ifdef YYFALLBACK 123 static const YYCODETYPE yyFallback[] = { 124 %% 125 }; 126 #endif /* YYFALLBACK */ 127 128 /* The following structure represents a single element of the 129 ** parser's stack. Information stored includes: 130 ** 131 ** + The state number for the parser at this level of the stack. 132 ** 133 ** + The value of the token stored at this level of the stack. 134 ** (In other words, the "major" token.) 135 ** 136 ** + The semantic value stored at this level of the stack. This is 137 ** the information used by the action routines in the grammar. 138 ** It is sometimes called the "minor" token. 139 */ 140 struct yyStackEntry { 141 int stateno; /* The state-number */ 142 int major; /* The major token value. This is the code 143 ** number for the token at this stack level */ 144 YYMINORTYPE minor; /* The user-supplied minor token value. This 145 ** is the value of the token */ 146 }; 147 typedef struct yyStackEntry yyStackEntry; 148 149 /* The state of the parser is completely contained in an instance of 150 ** the following structure */ 151 struct yyParser { 152 int yyidx; /* Index of top element in stack */ 153 int yyerrcnt; /* Shifts left before out of the error */ 154 ParseARG_SDECL /* A place to hold %extra_argument */ 155 yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */ 156 }; 157 typedef struct yyParser yyParser; 158 159 #ifndef NDEBUG 160 #include <stdio.h> 161 static FILE *yyTraceFILE = 0; 162 static char *yyTracePrompt = 0; 163 #endif /* NDEBUG */ 164 165 #ifndef NDEBUG 166 /* 167 ** Turn parser tracing on by giving a stream to which to write the trace 168 ** and a prompt to preface each trace message. Tracing is turned off 169 ** by making either argument NULL 170 ** 171 ** Inputs: 172 ** <ul> 173 ** <li> A FILE* to which trace output should be written. 174 ** If NULL, then tracing is turned off. 175 ** <li> A prefix string written at the beginning of every 176 ** line of trace output. If NULL, then tracing is 177 ** turned off. 178 ** </ul> 179 ** 180 ** Outputs: 181 ** None. 182 */ 183 void ParseTrace(FILE *TraceFILE, char *zTracePrompt){ 184 yyTraceFILE = TraceFILE; 185 yyTracePrompt = zTracePrompt; 186 if( yyTraceFILE==0 ) yyTracePrompt = 0; 187 else if( yyTracePrompt==0 ) yyTraceFILE = 0; 188 } 189 #endif /* NDEBUG */ 190 191 #ifndef NDEBUG 192 /* For tracing shifts, the names of all terminals and nonterminals 193 ** are required. The following table supplies these names */ 194 static const char *yyTokenName[] = { 195 %% 196 }; 197 #endif /* NDEBUG */ 198 199 #ifndef NDEBUG 200 /* For tracing reduce actions, the names of all rules are required. 201 */ 202 static const char *yyRuleName[] = { 203 %% 204 }; 205 #endif /* NDEBUG */ 206 207 /* 208 ** This function returns the symbolic name associated with a token 209 ** value. 210 */ 211 const char *ParseTokenName(int tokenType){ 212 #ifndef NDEBUG 213 if( tokenType>0 && tokenType<(sizeof(yyTokenName)/sizeof(yyTokenName[0])) ){ 214 return yyTokenName[tokenType]; 215 }else{ 216 return "Unknown"; 217 } 218 #else 219 return ""; 220 #endif 221 } 222 223 /* 224 ** This function allocates a new parser. 225 ** The only argument is a pointer to a function which works like 226 ** malloc. 227 ** 228 ** Inputs: 229 ** A pointer to the function used to allocate memory. 230 ** 231 ** Outputs: 232 ** A pointer to a parser. This pointer is used in subsequent calls 233 ** to Parse and ParseFree. 234 */ 235 void *ParseAlloc(void *(*mallocProc)(size_t)){ 236 yyParser *pParser; 237 pParser = (yyParser*)(*mallocProc)( (size_t)sizeof(yyParser) ); 238 if( pParser ){ 239 pParser->yyidx = -1; 240 } 241 return pParser; 242 } 243 244 /* The following function deletes the value associated with a 245 ** symbol. The symbol can be either a terminal or nonterminal. 246 ** "yymajor" is the symbol code, and "yypminor" is a pointer to 247 ** the value. 248 */ 249 static void yy_destructor(YYCODETYPE yymajor, YYMINORTYPE *yypminor){ 250 switch( yymajor ){ 251 /* Here is inserted the actions which take place when a 252 ** terminal or non-terminal is destroyed. This can happen 253 ** when the symbol is popped from the stack during a 254 ** reduce or during error processing or when a parser is 255 ** being destroyed before it is finished parsing. 256 ** 257 ** Note: during a reduce, the only symbols destroyed are those 258 ** which appear on the RHS of the rule, but which are not used 259 ** inside the C code. 260 */ 261 %% 262 default: break; /* If no destructor action specified: do nothing */ 263 } 264 } 265 266 /* 267 ** Pop the parser's stack once. 268 ** 269 ** If there is a destructor routine associated with the token which 270 ** is popped from the stack, then call it. 271 ** 272 ** Return the major token number for the symbol popped. 273 */ 274 static int yy_pop_parser_stack(yyParser *pParser){ 275 YYCODETYPE yymajor; 276 yyStackEntry *yytos = &pParser->yystack[pParser->yyidx]; 277 278 if( pParser->yyidx<0 ) return 0; 279 #ifndef NDEBUG 280 if( yyTraceFILE && pParser->yyidx>=0 ){ 281 fprintf(yyTraceFILE,"%sPopping %s\n", 282 yyTracePrompt, 283 yyTokenName[yytos->major]); 284 } 285 #endif 286 yymajor = yytos->major; 287 yy_destructor( yymajor, &yytos->minor); 288 pParser->yyidx--; 289 return yymajor; 290 } 291 292 /* 293 ** Deallocate and destroy a parser. Destructors are all called for 294 ** all stack elements before shutting the parser down. 295 ** 296 ** Inputs: 297 ** <ul> 298 ** <li> A pointer to the parser. This should be a pointer 299 ** obtained from ParseAlloc. 300 ** <li> A pointer to a function used to reclaim memory obtained 301 ** from malloc. 302 ** </ul> 303 */ 304 void ParseFree( 305 void *p, /* The parser to be deleted */ 306 void (*freeProc)(void*) /* Function used to reclaim memory */ 307 ){ 308 yyParser *pParser = (yyParser*)p; 309 if( pParser==0 ) return; 310 while( pParser->yyidx>=0 ) yy_pop_parser_stack(pParser); 311 (*freeProc)((void*)pParser); 312 } 313 314 /* 315 ** Find the appropriate action for a parser given the terminal 316 ** look-ahead token iLookAhead. 317 ** 318 ** If the look-ahead token is YYNOCODE, then check to see if the action is 319 ** independent of the look-ahead. If it is, return the action, otherwise 320 ** return YY_NO_ACTION. 321 */ 322 static int yy_find_shift_action( 323 yyParser *pParser, /* The parser */ 324 int iLookAhead /* The look-ahead token */ 325 ){ 326 int i; 327 int stateno = pParser->yystack[pParser->yyidx].stateno; 328 329 /* if( pParser->yyidx<0 ) return YY_NO_ACTION; */ 330 i = yy_shift_ofst[stateno]; 331 if( i==YY_SHIFT_USE_DFLT ){ 332 return yy_default[stateno]; 333 } 334 if( iLookAhead==YYNOCODE ){ 335 return YY_NO_ACTION; 336 } 337 i += iLookAhead; 338 if( i<0 || i>=YY_SZ_ACTTAB || yy_lookahead[i]!=iLookAhead ){ 339 #ifdef YYFALLBACK 340 int iFallback; /* Fallback token */ 341 if( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0]) 342 && (iFallback = yyFallback[iLookAhead])!=0 ){ 343 #ifndef NDEBUG 344 if( yyTraceFILE ){ 345 fprintf(yyTraceFILE, "%sFALLBACK %s => %s\n", 346 yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]); 347 } 348 #endif 349 return yy_find_shift_action(pParser, iFallback); 350 } 351 #endif 352 return yy_default[stateno]; 353 }else{ 354 return yy_action[i]; 355 } 356 } 357 358 /* 359 ** Find the appropriate action for a parser given the non-terminal 360 ** look-ahead token iLookAhead. 361 ** 362 ** If the look-ahead token is YYNOCODE, then check to see if the action is 363 ** independent of the look-ahead. If it is, return the action, otherwise 364 ** return YY_NO_ACTION. 365 */ 366 static int yy_find_reduce_action( 367 yyParser *pParser, /* The parser */ 368 int iLookAhead /* The look-ahead token */ 369 ){ 370 int i; 371 int stateno = pParser->yystack[pParser->yyidx].stateno; 372 373 i = yy_reduce_ofst[stateno]; 374 if( i==YY_REDUCE_USE_DFLT ){ 375 return yy_default[stateno]; 376 } 377 if( iLookAhead==YYNOCODE ){ 378 return YY_NO_ACTION; 379 } 380 i += iLookAhead; 381 if( i<0 || i>=YY_SZ_ACTTAB || yy_lookahead[i]!=iLookAhead ){ 382 return yy_default[stateno]; 383 }else{ 384 return yy_action[i]; 385 } 386 } 387 388 /* 389 ** Perform a shift action. 390 */ 391 static void yy_shift( 392 yyParser *yypParser, /* The parser to be shifted */ 393 int yyNewState, /* The new state to shift in */ 394 int yyMajor, /* The major token to shift in */ 395 YYMINORTYPE *yypMinor /* Pointer ot the minor token to shift in */ 396 ){ 397 yyStackEntry *yytos; 398 yypParser->yyidx++; 399 if( yypParser->yyidx>=YYSTACKDEPTH ){ 400 ParseARG_FETCH; 401 yypParser->yyidx--; 402 #ifndef NDEBUG 403 if( yyTraceFILE ){ 404 fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt); 405 } 406 #endif 407 while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser); 408 /* Here code is inserted which will execute if the parser 409 ** stack every overflows */ 410 %% 411 ParseARG_STORE; /* Suppress warning about unused %extra_argument var */ 412 return; 413 } 414 yytos = &yypParser->yystack[yypParser->yyidx]; 415 yytos->stateno = yyNewState; 416 yytos->major = yyMajor; 417 yytos->minor = *yypMinor; 418 #ifndef NDEBUG 419 if( yyTraceFILE && yypParser->yyidx>0 ){ 420 int i; 421 fprintf(yyTraceFILE,"%sShift %d\n",yyTracePrompt,yyNewState); 422 fprintf(yyTraceFILE,"%sStack:",yyTracePrompt); 423 for(i=1; i<=yypParser->yyidx; i++) 424 fprintf(yyTraceFILE," %s",yyTokenName[yypParser->yystack[i].major]); 425 fprintf(yyTraceFILE,"\n"); 426 } 427 #endif 428 } 429 430 /* The following table contains information about every rule that 431 ** is used during the reduce. 432 */ 433 static struct { 434 YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ 435 unsigned char nrhs; /* Number of right-hand side symbols in the rule */ 436 } yyRuleInfo[] = { 437 %% 438 }; 439 440 static void yy_accept(yyParser*); /* Forward Declaration */ 441 442 /* 443 ** Perform a reduce action and the shift that must immediately 444 ** follow the reduce. 445 */ 446 static void yy_reduce( 447 yyParser *yypParser, /* The parser */ 448 int yyruleno /* Number of the rule by which to reduce */ 449 ){ 450 int yygoto; /* The next state */ 451 int yyact; /* The next action */ 452 YYMINORTYPE yygotominor; /* The LHS of the rule reduced */ 453 yyStackEntry *yymsp; /* The top of the parser's stack */ 454 int yysize; /* Amount to pop the stack */ 455 ParseARG_FETCH; 456 yymsp = &yypParser->yystack[yypParser->yyidx]; 457 #ifndef NDEBUG 458 if( yyTraceFILE && yyruleno>=0 459 && yyruleno<sizeof(yyRuleName)/sizeof(yyRuleName[0]) ){ 460 fprintf(yyTraceFILE, "%sReduce [%s].\n", yyTracePrompt, 461 yyRuleName[yyruleno]); 462 } 463 #endif /* NDEBUG */ 464 465 switch( yyruleno ){ 466 /* Beginning here are the reduction cases. A typical example 467 ** follows: 468 ** case 0: 469 ** #line <lineno> <grammarfile> 470 ** { ... } // User supplied code 471 ** #line <lineno> <thisfile> 472 ** break; 473 */ 474 %% 475 }; 476 yygoto = yyRuleInfo[yyruleno].lhs; 477 yysize = yyRuleInfo[yyruleno].nrhs; 478 yypParser->yyidx -= yysize; 479 yyact = yy_find_reduce_action(yypParser,yygoto); 480 if( yyact < YYNSTATE ){ 481 yy_shift(yypParser,yyact,yygoto,&yygotominor); 482 }else if( yyact == YYNSTATE + YYNRULE + 1 ){ 483 yy_accept(yypParser); 484 } 485 } 486 487 /* 488 ** The following code executes when the parse fails 489 */ 490 static void yy_parse_failed( 491 yyParser *yypParser /* The parser */ 492 ){ 493 ParseARG_FETCH; 494 #ifndef NDEBUG 495 if( yyTraceFILE ){ 496 fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt); 497 } 498 #endif 499 while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser); 500 /* Here code is inserted which will be executed whenever the 501 ** parser fails */ 502 %% 503 ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ 504 } 505 506 /* 507 ** The following code executes when a syntax error first occurs. 508 */ 509 static void yy_syntax_error( 510 yyParser *yypParser, /* The parser */ 511 int yymajor, /* The major type of the error token */ 512 YYMINORTYPE yyminor /* The minor type of the error token */ 513 ){ 514 ParseARG_FETCH; 515 #define TOKEN (yyminor.yy0) 516 %% 517 ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ 518 } 519 520 /* 521 ** The following is executed when the parser accepts 522 */ 523 static void yy_accept( 524 yyParser *yypParser /* The parser */ 525 ){ 526 ParseARG_FETCH; 527 #ifndef NDEBUG 528 if( yyTraceFILE ){ 529 fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt); 530 } 531 #endif 532 while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser); 533 /* Here code is inserted which will be executed whenever the 534 ** parser accepts */ 535 %% 536 ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ 537 } 538 539 /* The main parser program. 540 ** The first argument is a pointer to a structure obtained from 541 ** "ParseAlloc" which describes the current state of the parser. 542 ** The second argument is the major token number. The third is 543 ** the minor token. The fourth optional argument is whatever the 544 ** user wants (and specified in the grammar) and is available for 545 ** use by the action routines. 546 ** 547 ** Inputs: 548 ** <ul> 549 ** <li> A pointer to the parser (an opaque structure.) 550 ** <li> The major token number. 551 ** <li> The minor token number. 552 ** <li> An option argument of a grammar-specified type. 553 ** </ul> 554 ** 555 ** Outputs: 556 ** None. 557 */ 558 void Parse( 559 void *yyp, /* The parser */ 560 int yymajor, /* The major token code number */ 561 ParseTOKENTYPE yyminor /* The value for the token */ 562 ParseARG_PDECL /* Optional %extra_argument parameter */ 563 ){ 564 YYMINORTYPE yyminorunion; 565 int yyact; /* The parser action. */ 566 int yyendofinput; /* True if we are at the end of input */ 567 int yyerrorhit = 0; /* True if yymajor has invoked an error */ 568 yyParser *yypParser; /* The parser */ 569 570 /* (re)initialize the parser, if necessary */ 571 yypParser = (yyParser*)yyp; 572 if( yypParser->yyidx<0 ){ 573 if( yymajor==0 ) return; 574 yypParser->yyidx = 0; 575 yypParser->yyerrcnt = -1; 576 yypParser->yystack[0].stateno = 0; 577 yypParser->yystack[0].major = 0; 578 } 579 yyminorunion.yy0 = yyminor; 580 yyendofinput = (yymajor==0); 581 ParseARG_STORE; 582 583 #ifndef NDEBUG 584 if( yyTraceFILE ){ 585 fprintf(yyTraceFILE,"%sInput %s\n",yyTracePrompt,yyTokenName[yymajor]); 586 } 587 #endif 588 589 do{ 590 yyact = yy_find_shift_action(yypParser,yymajor); 591 if( yyact<YYNSTATE ){ 592 yy_shift(yypParser,yyact,yymajor,&yyminorunion); 593 yypParser->yyerrcnt--; 594 if( yyendofinput && yypParser->yyidx>=0 ){ 595 yymajor = 0; 596 }else{ 597 yymajor = YYNOCODE; 598 } 599 }else if( yyact < YYNSTATE + YYNRULE ){ 600 yy_reduce(yypParser,yyact-YYNSTATE); 601 }else if( yyact == YY_ERROR_ACTION ){ 602 int yymx; 603 #ifndef NDEBUG 604 if( yyTraceFILE ){ 605 fprintf(yyTraceFILE,"%sSyntax Error!\n",yyTracePrompt); 606 } 607 #endif 608 #ifdef YYERRORSYMBOL 609 /* A syntax error has occurred. 610 ** The response to an error depends upon whether or not the 611 ** grammar defines an error token "ERROR". 612 ** 613 ** This is what we do if the grammar does define ERROR: 614 ** 615 ** * Call the %syntax_error function. 616 ** 617 ** * Begin popping the stack until we enter a state where 618 ** it is legal to shift the error symbol, then shift 619 ** the error symbol. 620 ** 621 ** * Set the error count to three. 622 ** 623 ** * Begin accepting and shifting new tokens. No new error 624 ** processing will occur until three tokens have been 625 ** shifted successfully. 626 ** 627 */ 628 if( yypParser->yyerrcnt<0 ){ 629 yy_syntax_error(yypParser,yymajor,yyminorunion); 630 } 631 yymx = yypParser->yystack[yypParser->yyidx].major; 632 if( yymx==YYERRORSYMBOL || yyerrorhit ){ 633 #ifndef NDEBUG 634 if( yyTraceFILE ){ 635 fprintf(yyTraceFILE,"%sDiscard input token %s\n", 636 yyTracePrompt,yyTokenName[yymajor]); 637 } 638 #endif 639 yy_destructor(yymajor,&yyminorunion); 640 yymajor = YYNOCODE; 641 }else{ 642 while( 643 yypParser->yyidx >= 0 && 644 yymx != YYERRORSYMBOL && 645 (yyact = yy_find_shift_action(yypParser,YYERRORSYMBOL)) >= YYNSTATE 646 ){ 647 yy_pop_parser_stack(yypParser); 648 } 649 if( yypParser->yyidx < 0 || yymajor==0 ){ 650 yy_destructor(yymajor,&yyminorunion); 651 yy_parse_failed(yypParser); 652 yymajor = YYNOCODE; 653 }else if( yymx!=YYERRORSYMBOL ){ 654 YYMINORTYPE u2; 655 u2.YYERRSYMDT = 0; 656 yy_shift(yypParser,yyact,YYERRORSYMBOL,&u2); 657 } 658 } 659 yypParser->yyerrcnt = 3; 660 yyerrorhit = 1; 661 #else /* YYERRORSYMBOL is not defined */ 662 /* This is what we do if the grammar does not define ERROR: 663 ** 664 ** * Report an error message, and throw away the input token. 665 ** 666 ** * If the input token is $, then fail the parse. 667 ** 668 ** As before, subsequent error messages are suppressed until 669 ** three input tokens have been successfully shifted. 670 */ 671 if( yypParser->yyerrcnt<=0 ){ 672 yy_syntax_error(yypParser,yymajor,yyminorunion); 673 } 674 yypParser->yyerrcnt = 3; 675 yy_destructor(yymajor,&yyminorunion); 676 if( yyendofinput ){ 677 yy_parse_failed(yypParser); 678 } 679 yymajor = YYNOCODE; 680 #endif 681 }else{ 682 yy_accept(yypParser); 683 yymajor = YYNOCODE; 684 } 685 }while( yymajor!=YYNOCODE && yypParser->yyidx>=0 ); 686 return; 687 } 688