1 /* 2 ** 2000-05-29 3 ** 4 ** The author disclaims copyright to this source code. In place of 5 ** a legal notice, here is a blessing: 6 ** 7 ** May you do good and not evil. 8 ** May you find forgiveness for yourself and forgive others. 9 ** May you share freely, never taking more than you give. 10 ** 11 ************************************************************************* 12 ** Driver template for the LEMON parser generator. 13 ** 14 ** The "lemon" program processes an LALR(1) input grammar file, then uses 15 ** this template to construct a parser. The "lemon" program inserts text 16 ** at each "%%" line. Also, any "P-a-r-s-e" identifer prefix (without the 17 ** interstitial "-" characters) contained in this template is changed into 18 ** the value of the %name directive from the grammar. Otherwise, the content 19 ** of this template is copied straight through into the generate parser 20 ** source file. 21 ** 22 ** The following is the concatenation of all %include directives from the 23 ** input grammar file: 24 */ 25 #include <stdio.h> 26 /************ Begin %include sections from the grammar ************************/ 27 %% 28 /**************** End of %include directives **********************************/ 29 /* These constants specify the various numeric values for terminal symbols 30 ** in a format understandable to "makeheaders". This section is blank unless 31 ** "lemon" is run with the "-m" command-line option. 32 ***************** Begin makeheaders token definitions *************************/ 33 %% 34 /**************** End makeheaders token definitions ***************************/ 35 36 /* The next sections is a series of control #defines. 37 ** various aspects of the generated parser. 38 ** YYCODETYPE is the data type used to store the integer codes 39 ** that represent terminal and non-terminal symbols. 40 ** "unsigned char" is used if there are fewer than 41 ** 256 symbols. Larger types otherwise. 42 ** YYNOCODE is a number of type YYCODETYPE that is not used for 43 ** any terminal or nonterminal symbol. 44 ** YYFALLBACK If defined, this indicates that one or more tokens 45 ** (also known as: "terminal symbols") have fall-back 46 ** values which should be used if the original symbol 47 ** would not parse. This permits keywords to sometimes 48 ** be used as identifiers, for example. 49 ** YYACTIONTYPE is the data type used for "action codes" - numbers 50 ** that indicate what to do in response to the next 51 ** token. 52 ** ParseTOKENTYPE is the data type used for minor type for terminal 53 ** symbols. Background: A "minor type" is a semantic 54 ** value associated with a terminal or non-terminal 55 ** symbols. For example, for an "ID" terminal symbol, 56 ** the minor type might be the name of the identifier. 57 ** Each non-terminal can have a different minor type. 58 ** Terminal symbols all have the same minor type, though. 59 ** This macros defines the minor type for terminal 60 ** symbols. 61 ** YYMINORTYPE is the data type used for all minor types. 62 ** This is typically a union of many types, one of 63 ** which is ParseTOKENTYPE. The entry in the union 64 ** for terminal symbols is called "yy0". 65 ** YYSTACKDEPTH is the maximum depth of the parser's stack. If 66 ** zero the stack is dynamically sized using realloc() 67 ** ParseARG_SDECL A static variable declaration for the %extra_argument 68 ** ParseARG_PDECL A parameter declaration for the %extra_argument 69 ** ParseARG_STORE Code to store %extra_argument into yypParser 70 ** ParseARG_FETCH Code to extract %extra_argument from yypParser 71 ** YYERRORSYMBOL is the code number of the error symbol. If not 72 ** defined, then do no error processing. 73 ** YYNSTATE the combined number of states. 74 ** YYNRULE the number of rules in the grammar 75 ** YY_MAX_SHIFT Maximum value for shift actions 76 ** YY_MIN_SHIFTREDUCE Minimum value for shift-reduce actions 77 ** YY_MAX_SHIFTREDUCE Maximum value for shift-reduce actions 78 ** YY_MIN_REDUCE Maximum value for reduce actions 79 ** YY_ERROR_ACTION The yy_action[] code for syntax error 80 ** YY_ACCEPT_ACTION The yy_action[] code for accept 81 ** YY_NO_ACTION The yy_action[] code for no-op 82 */ 83 #ifndef INTERFACE 84 # define INTERFACE 1 85 #endif 86 /************* Begin control #defines *****************************************/ 87 %% 88 /************* End control #defines *******************************************/ 89 90 /* Define the yytestcase() macro to be a no-op if is not already defined 91 ** otherwise. 92 ** 93 ** Applications can choose to define yytestcase() in the %include section 94 ** to a macro that can assist in verifying code coverage. For production 95 ** code the yytestcase() macro should be turned off. But it is useful 96 ** for testing. 97 */ 98 #ifndef yytestcase 99 # define yytestcase(X) 100 #endif 101 102 103 /* Next are the tables used to determine what action to take based on the 104 ** current state and lookahead token. These tables are used to implement 105 ** functions that take a state number and lookahead value and return an 106 ** action integer. 107 ** 108 ** Suppose the action integer is N. Then the action is determined as 109 ** follows 110 ** 111 ** 0 <= N <= YY_MAX_SHIFT Shift N. That is, push the lookahead 112 ** token onto the stack and goto state N. 113 ** 114 ** N between YY_MIN_SHIFTREDUCE Shift to an arbitrary state then 115 ** and YY_MAX_SHIFTREDUCE reduce by rule N-YY_MIN_SHIFTREDUCE. 116 ** 117 ** N between YY_MIN_REDUCE Reduce by rule N-YY_MIN_REDUCE 118 ** and YY_MAX_REDUCE 119 ** 120 ** N == YY_ERROR_ACTION A syntax error has occurred. 121 ** 122 ** N == YY_ACCEPT_ACTION The parser accepts its input. 123 ** 124 ** N == YY_NO_ACTION No such action. Denotes unused 125 ** slots in the yy_action[] table. 126 ** 127 ** The action table is constructed as a single large table named yy_action[]. 128 ** Given state S and lookahead X, the action is computed as either: 129 ** 130 ** (A) N = yy_action[ yy_shift_ofst[S] + X ] 131 ** (B) N = yy_default[S] 132 ** 133 ** The (A) formula is preferred. The B formula is used instead if: 134 ** (1) The yy_shift_ofst[S]+X value is out of range, or 135 ** (2) yy_lookahead[yy_shift_ofst[S]+X] is not equal to X, or 136 ** (3) yy_shift_ofst[S] equal YY_SHIFT_USE_DFLT. 137 ** (Implementation note: YY_SHIFT_USE_DFLT is chosen so that 138 ** YY_SHIFT_USE_DFLT+X will be out of range for all possible lookaheads X. 139 ** Hence only tests (1) and (2) need to be evaluated.) 140 ** 141 ** The formulas above are for computing the action when the lookahead is 142 ** a terminal symbol. If the lookahead is a non-terminal (as occurs after 143 ** a reduce action) then the yy_reduce_ofst[] array is used in place of 144 ** the yy_shift_ofst[] array and YY_REDUCE_USE_DFLT is used in place of 145 ** YY_SHIFT_USE_DFLT. 146 ** 147 ** The following are the tables generated in this section: 148 ** 149 ** yy_action[] A single table containing all actions. 150 ** yy_lookahead[] A table containing the lookahead for each entry in 151 ** yy_action. Used to detect hash collisions. 152 ** yy_shift_ofst[] For each state, the offset into yy_action for 153 ** shifting terminals. 154 ** yy_reduce_ofst[] For each state, the offset into yy_action for 155 ** shifting non-terminals after a reduce. 156 ** yy_default[] Default action for each state. 157 ** 158 *********** Begin parsing tables **********************************************/ 159 %% 160 /********** End of lemon-generated parsing tables *****************************/ 161 162 /* The next table maps tokens (terminal symbols) into fallback tokens. 163 ** If a construct like the following: 164 ** 165 ** %fallback ID X Y Z. 166 ** 167 ** appears in the grammar, then ID becomes a fallback token for X, Y, 168 ** and Z. Whenever one of the tokens X, Y, or Z is input to the parser 169 ** but it does not parse, the type of the token is changed to ID and 170 ** the parse is retried before an error is thrown. 171 ** 172 ** This feature can be used, for example, to cause some keywords in a language 173 ** to revert to identifiers if they keyword does not apply in the context where 174 ** it appears. 175 */ 176 #ifdef YYFALLBACK 177 static const YYCODETYPE yyFallback[] = { 178 %% 179 }; 180 #endif /* YYFALLBACK */ 181 182 /* The following structure represents a single element of the 183 ** parser's stack. Information stored includes: 184 ** 185 ** + The state number for the parser at this level of the stack. 186 ** 187 ** + The value of the token stored at this level of the stack. 188 ** (In other words, the "major" token.) 189 ** 190 ** + The semantic value stored at this level of the stack. This is 191 ** the information used by the action routines in the grammar. 192 ** It is sometimes called the "minor" token. 193 ** 194 ** After the "shift" half of a SHIFTREDUCE action, the stateno field 195 ** actually contains the reduce action for the second half of the 196 ** SHIFTREDUCE. 197 */ 198 struct yyStackEntry { 199 YYACTIONTYPE stateno; /* The state-number, or reduce action in SHIFTREDUCE */ 200 YYCODETYPE major; /* The major token value. This is the code 201 ** number for the token at this stack level */ 202 YYMINORTYPE minor; /* The user-supplied minor token value. This 203 ** is the value of the token */ 204 }; 205 typedef struct yyStackEntry yyStackEntry; 206 207 /* The state of the parser is completely contained in an instance of 208 ** the following structure */ 209 struct yyParser { 210 yyStackEntry *yytos; /* Pointer to top element of the stack */ 211 #ifdef YYTRACKMAXSTACKDEPTH 212 int yyhwm; /* High-water mark of the stack */ 213 #endif 214 #ifndef YYNOERRORRECOVERY 215 int yyerrcnt; /* Shifts left before out of the error */ 216 #endif 217 ParseARG_SDECL /* A place to hold %extra_argument */ 218 #if YYSTACKDEPTH<=0 219 int yystksz; /* Current side of the stack */ 220 yyStackEntry *yystack; /* The parser's stack */ 221 yyStackEntry yystk0; /* First stack entry */ 222 #else 223 yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */ 224 yyStackEntry *yystackEnd; /* Last entry in the stack */ 225 #endif 226 }; 227 typedef struct yyParser yyParser; 228 229 #ifndef NDEBUG 230 #include <stdio.h> 231 static FILE *yyTraceFILE = 0; 232 static char *yyTracePrompt = 0; 233 #endif /* NDEBUG */ 234 235 #ifndef NDEBUG 236 /* 237 ** Turn parser tracing on by giving a stream to which to write the trace 238 ** and a prompt to preface each trace message. Tracing is turned off 239 ** by making either argument NULL 240 ** 241 ** Inputs: 242 ** <ul> 243 ** <li> A FILE* to which trace output should be written. 244 ** If NULL, then tracing is turned off. 245 ** <li> A prefix string written at the beginning of every 246 ** line of trace output. If NULL, then tracing is 247 ** turned off. 248 ** </ul> 249 ** 250 ** Outputs: 251 ** None. 252 */ 253 void ParseTrace(FILE *TraceFILE, char *zTracePrompt){ 254 yyTraceFILE = TraceFILE; 255 yyTracePrompt = zTracePrompt; 256 if( yyTraceFILE==0 ) yyTracePrompt = 0; 257 else if( yyTracePrompt==0 ) yyTraceFILE = 0; 258 } 259 #endif /* NDEBUG */ 260 261 #ifndef NDEBUG 262 /* For tracing shifts, the names of all terminals and nonterminals 263 ** are required. The following table supplies these names */ 264 static const char *const yyTokenName[] = { 265 %% 266 }; 267 #endif /* NDEBUG */ 268 269 #ifndef NDEBUG 270 /* For tracing reduce actions, the names of all rules are required. 271 */ 272 static const char *const yyRuleName[] = { 273 %% 274 }; 275 #endif /* NDEBUG */ 276 277 278 #if YYSTACKDEPTH<=0 279 /* 280 ** Try to increase the size of the parser stack. Return the number 281 ** of errors. Return 0 on success. 282 */ 283 static int yyGrowStack(yyParser *p){ 284 int newSize; 285 int idx; 286 yyStackEntry *pNew; 287 288 newSize = p->yystksz*2 + 100; 289 idx = p->yytos ? (int)(p->yytos - p->yystack) : 0; 290 if( p->yystack==&p->yystk0 ){ 291 pNew = malloc(newSize*sizeof(pNew[0])); 292 if( pNew ) pNew[0] = p->yystk0; 293 }else{ 294 pNew = realloc(p->yystack, newSize*sizeof(pNew[0])); 295 } 296 if( pNew ){ 297 p->yystack = pNew; 298 p->yytos = &p->yystack[idx]; 299 #ifndef NDEBUG 300 if( yyTraceFILE ){ 301 fprintf(yyTraceFILE,"%sStack grows from %d to %d entries.\n", 302 yyTracePrompt, p->yystksz, newSize); 303 } 304 #endif 305 p->yystksz = newSize; 306 } 307 return pNew==0; 308 } 309 #endif 310 311 /* Datatype of the argument to the memory allocated passed as the 312 ** second argument to ParseAlloc() below. This can be changed by 313 ** putting an appropriate #define in the %include section of the input 314 ** grammar. 315 */ 316 #ifndef YYMALLOCARGTYPE 317 # define YYMALLOCARGTYPE size_t 318 #endif 319 320 /* Initialize a new parser that has already been allocated. 321 */ 322 void ParseInit(void *yypParser){ 323 yyParser *pParser = (yyParser*)yypParser; 324 #ifdef YYTRACKMAXSTACKDEPTH 325 pParser->yyhwm = 0; 326 #endif 327 #if YYSTACKDEPTH<=0 328 pParser->yytos = NULL; 329 pParser->yystack = NULL; 330 pParser->yystksz = 0; 331 if( yyGrowStack(pParser) ){ 332 pParser->yystack = &pParser->yystk0; 333 pParser->yystksz = 1; 334 } 335 #endif 336 #ifndef YYNOERRORRECOVERY 337 pParser->yyerrcnt = -1; 338 #endif 339 pParser->yytos = pParser->yystack; 340 pParser->yystack[0].stateno = 0; 341 pParser->yystack[0].major = 0; 342 pParser->yystackEnd = &pParser->yystack[YYSTACKDEPTH-1]; 343 } 344 345 #ifndef Parse_ENGINEALWAYSONSTACK 346 /* 347 ** This function allocates a new parser. 348 ** The only argument is a pointer to a function which works like 349 ** malloc. 350 ** 351 ** Inputs: 352 ** A pointer to the function used to allocate memory. 353 ** 354 ** Outputs: 355 ** A pointer to a parser. This pointer is used in subsequent calls 356 ** to Parse and ParseFree. 357 */ 358 void *ParseAlloc(void *(*mallocProc)(YYMALLOCARGTYPE)){ 359 yyParser *pParser; 360 pParser = (yyParser*)(*mallocProc)( (YYMALLOCARGTYPE)sizeof(yyParser) ); 361 if( pParser ) ParseInit(pParser); 362 return pParser; 363 } 364 #endif /* Parse_ENGINEALWAYSONSTACK */ 365 366 367 /* The following function deletes the "minor type" or semantic value 368 ** associated with a symbol. The symbol can be either a terminal 369 ** or nonterminal. "yymajor" is the symbol code, and "yypminor" is 370 ** a pointer to the value to be deleted. The code used to do the 371 ** deletions is derived from the %destructor and/or %token_destructor 372 ** directives of the input grammar. 373 */ 374 static void yy_destructor( 375 yyParser *yypParser, /* The parser */ 376 YYCODETYPE yymajor, /* Type code for object to destroy */ 377 YYMINORTYPE *yypminor /* The object to be destroyed */ 378 ){ 379 ParseARG_FETCH; 380 switch( yymajor ){ 381 /* Here is inserted the actions which take place when a 382 ** terminal or non-terminal is destroyed. This can happen 383 ** when the symbol is popped from the stack during a 384 ** reduce or during error processing or when a parser is 385 ** being destroyed before it is finished parsing. 386 ** 387 ** Note: during a reduce, the only symbols destroyed are those 388 ** which appear on the RHS of the rule, but which are *not* used 389 ** inside the C code. 390 */ 391 /********* Begin destructor definitions ***************************************/ 392 %% 393 /********* End destructor definitions *****************************************/ 394 default: break; /* If no destructor action specified: do nothing */ 395 } 396 } 397 398 /* 399 ** Pop the parser's stack once. 400 ** 401 ** If there is a destructor routine associated with the token which 402 ** is popped from the stack, then call it. 403 */ 404 static void yy_pop_parser_stack(yyParser *pParser){ 405 yyStackEntry *yytos; 406 assert( pParser->yytos!=0 ); 407 assert( pParser->yytos > pParser->yystack ); 408 yytos = pParser->yytos--; 409 #ifndef NDEBUG 410 if( yyTraceFILE ){ 411 fprintf(yyTraceFILE,"%sPopping %s\n", 412 yyTracePrompt, 413 yyTokenName[yytos->major]); 414 } 415 #endif 416 yy_destructor(pParser, yytos->major, &yytos->minor); 417 } 418 419 /* 420 ** Clear all secondary memory allocations from the parser 421 */ 422 void ParseFinalize(void *p){ 423 yyParser *pParser = (yyParser*)p; 424 while( pParser->yytos>pParser->yystack ) yy_pop_parser_stack(pParser); 425 #if YYSTACKDEPTH<=0 426 if( pParser->yystack!=&pParser->yystk0 ) free(pParser->yystack); 427 #endif 428 } 429 430 #ifndef Parse_ENGINEALWAYSONSTACK 431 /* 432 ** Deallocate and destroy a parser. Destructors are called for 433 ** all stack elements before shutting the parser down. 434 ** 435 ** If the YYPARSEFREENEVERNULL macro exists (for example because it 436 ** is defined in a %include section of the input grammar) then it is 437 ** assumed that the input pointer is never NULL. 438 */ 439 void ParseFree( 440 void *p, /* The parser to be deleted */ 441 void (*freeProc)(void*) /* Function used to reclaim memory */ 442 ){ 443 #ifndef YYPARSEFREENEVERNULL 444 if( p==0 ) return; 445 #endif 446 ParseFinalize(p); 447 (*freeProc)(p); 448 } 449 #endif /* Parse_ENGINEALWAYSONSTACK */ 450 451 /* 452 ** Return the peak depth of the stack for a parser. 453 */ 454 #ifdef YYTRACKMAXSTACKDEPTH 455 int ParseStackPeak(void *p){ 456 yyParser *pParser = (yyParser*)p; 457 return pParser->yyhwm; 458 } 459 #endif 460 461 /* 462 ** Find the appropriate action for a parser given the terminal 463 ** look-ahead token iLookAhead. 464 */ 465 static unsigned int yy_find_shift_action( 466 yyParser *pParser, /* The parser */ 467 YYCODETYPE iLookAhead /* The look-ahead token */ 468 ){ 469 int i; 470 int stateno = pParser->yytos->stateno; 471 472 if( stateno>=YY_MIN_REDUCE ) return stateno; 473 assert( stateno <= YY_SHIFT_COUNT ); 474 do{ 475 i = yy_shift_ofst[stateno]; 476 assert( iLookAhead!=YYNOCODE ); 477 i += iLookAhead; 478 if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ 479 #ifdef YYFALLBACK 480 YYCODETYPE iFallback; /* Fallback token */ 481 if( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0]) 482 && (iFallback = yyFallback[iLookAhead])!=0 ){ 483 #ifndef NDEBUG 484 if( yyTraceFILE ){ 485 fprintf(yyTraceFILE, "%sFALLBACK %s => %s\n", 486 yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]); 487 } 488 #endif 489 assert( yyFallback[iFallback]==0 ); /* Fallback loop must terminate */ 490 iLookAhead = iFallback; 491 continue; 492 } 493 #endif 494 #ifdef YYWILDCARD 495 { 496 int j = i - iLookAhead + YYWILDCARD; 497 if( 498 #if YY_SHIFT_MIN+YYWILDCARD<0 499 j>=0 && 500 #endif 501 #if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT 502 j<YY_ACTTAB_COUNT && 503 #endif 504 yy_lookahead[j]==YYWILDCARD && iLookAhead>0 505 ){ 506 #ifndef NDEBUG 507 if( yyTraceFILE ){ 508 fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n", 509 yyTracePrompt, yyTokenName[iLookAhead], 510 yyTokenName[YYWILDCARD]); 511 } 512 #endif /* NDEBUG */ 513 return yy_action[j]; 514 } 515 } 516 #endif /* YYWILDCARD */ 517 return yy_default[stateno]; 518 }else{ 519 return yy_action[i]; 520 } 521 }while(1); 522 } 523 524 /* 525 ** Find the appropriate action for a parser given the non-terminal 526 ** look-ahead token iLookAhead. 527 */ 528 static int yy_find_reduce_action( 529 int stateno, /* Current state number */ 530 YYCODETYPE iLookAhead /* The look-ahead token */ 531 ){ 532 int i; 533 #ifdef YYERRORSYMBOL 534 if( stateno>YY_REDUCE_COUNT ){ 535 return yy_default[stateno]; 536 } 537 #else 538 assert( stateno<=YY_REDUCE_COUNT ); 539 #endif 540 i = yy_reduce_ofst[stateno]; 541 assert( i!=YY_REDUCE_USE_DFLT ); 542 assert( iLookAhead!=YYNOCODE ); 543 i += iLookAhead; 544 #ifdef YYERRORSYMBOL 545 if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ 546 return yy_default[stateno]; 547 } 548 #else 549 assert( i>=0 && i<YY_ACTTAB_COUNT ); 550 assert( yy_lookahead[i]==iLookAhead ); 551 #endif 552 return yy_action[i]; 553 } 554 555 /* 556 ** The following routine is called if the stack overflows. 557 */ 558 static void yyStackOverflow(yyParser *yypParser){ 559 ParseARG_FETCH; 560 #ifndef NDEBUG 561 if( yyTraceFILE ){ 562 fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt); 563 } 564 #endif 565 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); 566 /* Here code is inserted which will execute if the parser 567 ** stack every overflows */ 568 /******** Begin %stack_overflow code ******************************************/ 569 %% 570 /******** End %stack_overflow code ********************************************/ 571 ParseARG_STORE; /* Suppress warning about unused %extra_argument var */ 572 } 573 574 /* 575 ** Print tracing information for a SHIFT action 576 */ 577 #ifndef NDEBUG 578 static void yyTraceShift(yyParser *yypParser, int yyNewState){ 579 if( yyTraceFILE ){ 580 if( yyNewState<YYNSTATE ){ 581 fprintf(yyTraceFILE,"%sShift '%s', go to state %d\n", 582 yyTracePrompt,yyTokenName[yypParser->yytos->major], 583 yyNewState); 584 }else{ 585 fprintf(yyTraceFILE,"%sShift '%s'\n", 586 yyTracePrompt,yyTokenName[yypParser->yytos->major]); 587 } 588 } 589 } 590 #else 591 # define yyTraceShift(X,Y) 592 #endif 593 594 /* 595 ** Perform a shift action. 596 */ 597 static void yy_shift( 598 yyParser *yypParser, /* The parser to be shifted */ 599 int yyNewState, /* The new state to shift in */ 600 int yyMajor, /* The major token to shift in */ 601 ParseTOKENTYPE yyMinor /* The minor token to shift in */ 602 ){ 603 yyStackEntry *yytos; 604 yypParser->yytos++; 605 #ifdef YYTRACKMAXSTACKDEPTH 606 if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ 607 yypParser->yyhwm++; 608 assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack) ); 609 } 610 #endif 611 #if YYSTACKDEPTH>0 612 if( yypParser->yytos>yypParser->yystackEnd ){ 613 yypParser->yytos--; 614 yyStackOverflow(yypParser); 615 return; 616 } 617 #else 618 if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz] ){ 619 if( yyGrowStack(yypParser) ){ 620 yypParser->yytos--; 621 yyStackOverflow(yypParser); 622 return; 623 } 624 } 625 #endif 626 if( yyNewState > YY_MAX_SHIFT ){ 627 yyNewState += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE; 628 } 629 yytos = yypParser->yytos; 630 yytos->stateno = (YYACTIONTYPE)yyNewState; 631 yytos->major = (YYCODETYPE)yyMajor; 632 yytos->minor.yy0 = yyMinor; 633 yyTraceShift(yypParser, yyNewState); 634 } 635 636 /* The following table contains information about every rule that 637 ** is used during the reduce. 638 */ 639 static const struct { 640 YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ 641 signed char nrhs; /* Negative of the number of RHS symbols in the rule */ 642 } yyRuleInfo[] = { 643 %% 644 }; 645 646 static void yy_accept(yyParser*); /* Forward Declaration */ 647 648 /* 649 ** Perform a reduce action and the shift that must immediately 650 ** follow the reduce. 651 */ 652 static void yy_reduce( 653 yyParser *yypParser, /* The parser */ 654 unsigned int yyruleno /* Number of the rule by which to reduce */ 655 ){ 656 int yygoto; /* The next state */ 657 int yyact; /* The next action */ 658 yyStackEntry *yymsp; /* The top of the parser's stack */ 659 int yysize; /* Amount to pop the stack */ 660 ParseARG_FETCH; 661 yymsp = yypParser->yytos; 662 #ifndef NDEBUG 663 if( yyTraceFILE && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){ 664 yysize = yyRuleInfo[yyruleno].nrhs; 665 fprintf(yyTraceFILE, "%sReduce [%s], go to state %d.\n", yyTracePrompt, 666 yyRuleName[yyruleno], yymsp[yysize].stateno); 667 } 668 #endif /* NDEBUG */ 669 670 /* Check that the stack is large enough to grow by a single entry 671 ** if the RHS of the rule is empty. This ensures that there is room 672 ** enough on the stack to push the LHS value */ 673 if( yyRuleInfo[yyruleno].nrhs==0 ){ 674 #ifdef YYTRACKMAXSTACKDEPTH 675 if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ 676 yypParser->yyhwm++; 677 assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack)); 678 } 679 #endif 680 #if YYSTACKDEPTH>0 681 if( yypParser->yytos>=yypParser->yystackEnd ){ 682 yyStackOverflow(yypParser); 683 return; 684 } 685 #else 686 if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz-1] ){ 687 if( yyGrowStack(yypParser) ){ 688 yyStackOverflow(yypParser); 689 return; 690 } 691 yymsp = yypParser->yytos; 692 } 693 #endif 694 } 695 696 switch( yyruleno ){ 697 /* Beginning here are the reduction cases. A typical example 698 ** follows: 699 ** case 0: 700 ** #line <lineno> <grammarfile> 701 ** { ... } // User supplied code 702 ** #line <lineno> <thisfile> 703 ** break; 704 */ 705 /********** Begin reduce actions **********************************************/ 706 %% 707 /********** End reduce actions ************************************************/ 708 }; 709 assert( yyruleno<sizeof(yyRuleInfo)/sizeof(yyRuleInfo[0]) ); 710 yygoto = yyRuleInfo[yyruleno].lhs; 711 yysize = yyRuleInfo[yyruleno].nrhs; 712 yyact = yy_find_reduce_action(yymsp[yysize].stateno,(YYCODETYPE)yygoto); 713 714 /* There are no SHIFTREDUCE actions on nonterminals because the table 715 ** generator has simplified them to pure REDUCE actions. */ 716 assert( !(yyact>YY_MAX_SHIFT && yyact<=YY_MAX_SHIFTREDUCE) ); 717 718 /* It is not possible for a REDUCE to be followed by an error */ 719 assert( yyact!=YY_ERROR_ACTION ); 720 721 if( yyact==YY_ACCEPT_ACTION ){ 722 yypParser->yytos += yysize; 723 yy_accept(yypParser); 724 }else{ 725 yymsp += yysize+1; 726 yypParser->yytos = yymsp; 727 yymsp->stateno = (YYACTIONTYPE)yyact; 728 yymsp->major = (YYCODETYPE)yygoto; 729 yyTraceShift(yypParser, yyact); 730 } 731 } 732 733 /* 734 ** The following code executes when the parse fails 735 */ 736 #ifndef YYNOERRORRECOVERY 737 static void yy_parse_failed( 738 yyParser *yypParser /* The parser */ 739 ){ 740 ParseARG_FETCH; 741 #ifndef NDEBUG 742 if( yyTraceFILE ){ 743 fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt); 744 } 745 #endif 746 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); 747 /* Here code is inserted which will be executed whenever the 748 ** parser fails */ 749 /************ Begin %parse_failure code ***************************************/ 750 %% 751 /************ End %parse_failure code *****************************************/ 752 ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ 753 } 754 #endif /* YYNOERRORRECOVERY */ 755 756 /* 757 ** The following code executes when a syntax error first occurs. 758 */ 759 static void yy_syntax_error( 760 yyParser *yypParser, /* The parser */ 761 int yymajor, /* The major type of the error token */ 762 ParseTOKENTYPE yyminor /* The minor type of the error token */ 763 ){ 764 ParseARG_FETCH; 765 #define TOKEN yyminor 766 /************ Begin %syntax_error code ****************************************/ 767 %% 768 /************ End %syntax_error code ******************************************/ 769 ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ 770 } 771 772 /* 773 ** The following is executed when the parser accepts 774 */ 775 static void yy_accept( 776 yyParser *yypParser /* The parser */ 777 ){ 778 ParseARG_FETCH; 779 #ifndef NDEBUG 780 if( yyTraceFILE ){ 781 fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt); 782 } 783 #endif 784 #ifndef YYNOERRORRECOVERY 785 yypParser->yyerrcnt = -1; 786 #endif 787 assert( yypParser->yytos==yypParser->yystack ); 788 /* Here code is inserted which will be executed whenever the 789 ** parser accepts */ 790 /*********** Begin %parse_accept code *****************************************/ 791 %% 792 /*********** End %parse_accept code *******************************************/ 793 ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ 794 } 795 796 /* The main parser program. 797 ** The first argument is a pointer to a structure obtained from 798 ** "ParseAlloc" which describes the current state of the parser. 799 ** The second argument is the major token number. The third is 800 ** the minor token. The fourth optional argument is whatever the 801 ** user wants (and specified in the grammar) and is available for 802 ** use by the action routines. 803 ** 804 ** Inputs: 805 ** <ul> 806 ** <li> A pointer to the parser (an opaque structure.) 807 ** <li> The major token number. 808 ** <li> The minor token number. 809 ** <li> An option argument of a grammar-specified type. 810 ** </ul> 811 ** 812 ** Outputs: 813 ** None. 814 */ 815 void Parse( 816 void *yyp, /* The parser */ 817 int yymajor, /* The major token code number */ 818 ParseTOKENTYPE yyminor /* The value for the token */ 819 ParseARG_PDECL /* Optional %extra_argument parameter */ 820 ){ 821 YYMINORTYPE yyminorunion; 822 unsigned int yyact; /* The parser action. */ 823 #if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) 824 int yyendofinput; /* True if we are at the end of input */ 825 #endif 826 #ifdef YYERRORSYMBOL 827 int yyerrorhit = 0; /* True if yymajor has invoked an error */ 828 #endif 829 yyParser *yypParser; /* The parser */ 830 831 yypParser = (yyParser*)yyp; 832 assert( yypParser->yytos!=0 ); 833 #if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) 834 yyendofinput = (yymajor==0); 835 #endif 836 ParseARG_STORE; 837 838 #ifndef NDEBUG 839 if( yyTraceFILE ){ 840 fprintf(yyTraceFILE,"%sInput '%s'\n",yyTracePrompt,yyTokenName[yymajor]); 841 } 842 #endif 843 844 do{ 845 yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor); 846 if( yyact <= YY_MAX_SHIFTREDUCE ){ 847 yy_shift(yypParser,yyact,yymajor,yyminor); 848 #ifndef YYNOERRORRECOVERY 849 yypParser->yyerrcnt--; 850 #endif 851 yymajor = YYNOCODE; 852 }else if( yyact <= YY_MAX_REDUCE ){ 853 yy_reduce(yypParser,yyact-YY_MIN_REDUCE); 854 }else{ 855 assert( yyact == YY_ERROR_ACTION ); 856 yyminorunion.yy0 = yyminor; 857 #ifdef YYERRORSYMBOL 858 int yymx; 859 #endif 860 #ifndef NDEBUG 861 if( yyTraceFILE ){ 862 fprintf(yyTraceFILE,"%sSyntax Error!\n",yyTracePrompt); 863 } 864 #endif 865 #ifdef YYERRORSYMBOL 866 /* A syntax error has occurred. 867 ** The response to an error depends upon whether or not the 868 ** grammar defines an error token "ERROR". 869 ** 870 ** This is what we do if the grammar does define ERROR: 871 ** 872 ** * Call the %syntax_error function. 873 ** 874 ** * Begin popping the stack until we enter a state where 875 ** it is legal to shift the error symbol, then shift 876 ** the error symbol. 877 ** 878 ** * Set the error count to three. 879 ** 880 ** * Begin accepting and shifting new tokens. No new error 881 ** processing will occur until three tokens have been 882 ** shifted successfully. 883 ** 884 */ 885 if( yypParser->yyerrcnt<0 ){ 886 yy_syntax_error(yypParser,yymajor,yyminor); 887 } 888 yymx = yypParser->yytos->major; 889 if( yymx==YYERRORSYMBOL || yyerrorhit ){ 890 #ifndef NDEBUG 891 if( yyTraceFILE ){ 892 fprintf(yyTraceFILE,"%sDiscard input token %s\n", 893 yyTracePrompt,yyTokenName[yymajor]); 894 } 895 #endif 896 yy_destructor(yypParser, (YYCODETYPE)yymajor, &yyminorunion); 897 yymajor = YYNOCODE; 898 }else{ 899 while( yypParser->yytos >= yypParser->yystack 900 && yymx != YYERRORSYMBOL 901 && (yyact = yy_find_reduce_action( 902 yypParser->yytos->stateno, 903 YYERRORSYMBOL)) >= YY_MIN_REDUCE 904 ){ 905 yy_pop_parser_stack(yypParser); 906 } 907 if( yypParser->yytos < yypParser->yystack || yymajor==0 ){ 908 yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); 909 yy_parse_failed(yypParser); 910 #ifndef YYNOERRORRECOVERY 911 yypParser->yyerrcnt = -1; 912 #endif 913 yymajor = YYNOCODE; 914 }else if( yymx!=YYERRORSYMBOL ){ 915 yy_shift(yypParser,yyact,YYERRORSYMBOL,yyminor); 916 } 917 } 918 yypParser->yyerrcnt = 3; 919 yyerrorhit = 1; 920 #elif defined(YYNOERRORRECOVERY) 921 /* If the YYNOERRORRECOVERY macro is defined, then do not attempt to 922 ** do any kind of error recovery. Instead, simply invoke the syntax 923 ** error routine and continue going as if nothing had happened. 924 ** 925 ** Applications can set this macro (for example inside %include) if 926 ** they intend to abandon the parse upon the first syntax error seen. 927 */ 928 yy_syntax_error(yypParser,yymajor, yyminor); 929 yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); 930 yymajor = YYNOCODE; 931 932 #else /* YYERRORSYMBOL is not defined */ 933 /* This is what we do if the grammar does not define ERROR: 934 ** 935 ** * Report an error message, and throw away the input token. 936 ** 937 ** * If the input token is $, then fail the parse. 938 ** 939 ** As before, subsequent error messages are suppressed until 940 ** three input tokens have been successfully shifted. 941 */ 942 if( yypParser->yyerrcnt<=0 ){ 943 yy_syntax_error(yypParser,yymajor, yyminor); 944 } 945 yypParser->yyerrcnt = 3; 946 yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); 947 if( yyendofinput ){ 948 yy_parse_failed(yypParser); 949 #ifndef YYNOERRORRECOVERY 950 yypParser->yyerrcnt = -1; 951 #endif 952 } 953 yymajor = YYNOCODE; 954 #endif 955 } 956 }while( yymajor!=YYNOCODE && yypParser->yytos>yypParser->yystack ); 957 #ifndef NDEBUG 958 if( yyTraceFILE ){ 959 yyStackEntry *i; 960 char cDiv = '['; 961 fprintf(yyTraceFILE,"%sReturn. Stack=",yyTracePrompt); 962 for(i=&yypParser->yystack[1]; i<=yypParser->yytos; i++){ 963 fprintf(yyTraceFILE,"%c%s", cDiv, yyTokenName[i->major]); 964 cDiv = ' '; 965 } 966 fprintf(yyTraceFILE,"]\n"); 967 } 968 #endif 969 return; 970 } 971