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 #endif 225 }; 226 typedef struct yyParser yyParser; 227 228 #ifndef NDEBUG 229 #include <stdio.h> 230 static FILE *yyTraceFILE = 0; 231 static char *yyTracePrompt = 0; 232 #endif /* NDEBUG */ 233 234 #ifndef NDEBUG 235 /* 236 ** Turn parser tracing on by giving a stream to which to write the trace 237 ** and a prompt to preface each trace message. Tracing is turned off 238 ** by making either argument NULL 239 ** 240 ** Inputs: 241 ** <ul> 242 ** <li> A FILE* to which trace output should be written. 243 ** If NULL, then tracing is turned off. 244 ** <li> A prefix string written at the beginning of every 245 ** line of trace output. If NULL, then tracing is 246 ** turned off. 247 ** </ul> 248 ** 249 ** Outputs: 250 ** None. 251 */ 252 void ParseTrace(FILE *TraceFILE, char *zTracePrompt){ 253 yyTraceFILE = TraceFILE; 254 yyTracePrompt = zTracePrompt; 255 if( yyTraceFILE==0 ) yyTracePrompt = 0; 256 else if( yyTracePrompt==0 ) yyTraceFILE = 0; 257 } 258 #endif /* NDEBUG */ 259 260 #ifndef NDEBUG 261 /* For tracing shifts, the names of all terminals and nonterminals 262 ** are required. The following table supplies these names */ 263 static const char *const yyTokenName[] = { 264 %% 265 }; 266 #endif /* NDEBUG */ 267 268 #ifndef NDEBUG 269 /* For tracing reduce actions, the names of all rules are required. 270 */ 271 static const char *const yyRuleName[] = { 272 %% 273 }; 274 #endif /* NDEBUG */ 275 276 277 #if YYSTACKDEPTH<=0 278 /* 279 ** Try to increase the size of the parser stack. Return the number 280 ** of errors. Return 0 on success. 281 */ 282 static int yyGrowStack(yyParser *p){ 283 int newSize; 284 int idx; 285 yyStackEntry *pNew; 286 287 newSize = p->yystksz*2 + 100; 288 idx = p->yytos ? (int)(p->yytos - p->yystack) : 0; 289 if( p->yystack==&p->yystk0 ){ 290 pNew = malloc(newSize*sizeof(pNew[0])); 291 if( pNew ) pNew[0] = p->yystk0; 292 }else{ 293 pNew = realloc(p->yystack, newSize*sizeof(pNew[0])); 294 } 295 if( pNew ){ 296 p->yystack = pNew; 297 p->yytos = &p->yystack[idx]; 298 #ifndef NDEBUG 299 if( yyTraceFILE ){ 300 fprintf(yyTraceFILE,"%sStack grows from %d to %d entries.\n", 301 yyTracePrompt, p->yystksz, newSize); 302 } 303 #endif 304 p->yystksz = newSize; 305 } 306 return pNew==0; 307 } 308 #endif 309 310 /* Datatype of the argument to the memory allocated passed as the 311 ** second argument to ParseAlloc() below. This can be changed by 312 ** putting an appropriate #define in the %include section of the input 313 ** grammar. 314 */ 315 #ifndef YYMALLOCARGTYPE 316 # define YYMALLOCARGTYPE size_t 317 #endif 318 319 /* 320 ** This function allocates a new parser. 321 ** The only argument is a pointer to a function which works like 322 ** malloc. 323 ** 324 ** Inputs: 325 ** A pointer to the function used to allocate memory. 326 ** 327 ** Outputs: 328 ** A pointer to a parser. This pointer is used in subsequent calls 329 ** to Parse and ParseFree. 330 */ 331 void *ParseAlloc(void *(*mallocProc)(YYMALLOCARGTYPE)){ 332 yyParser *pParser; 333 pParser = (yyParser*)(*mallocProc)( (YYMALLOCARGTYPE)sizeof(yyParser) ); 334 if( pParser ){ 335 #ifdef YYTRACKMAXSTACKDEPTH 336 pParser->yyhwm = 0; 337 #endif 338 #if YYSTACKDEPTH<=0 339 pParser->yytos = NULL; 340 pParser->yystack = NULL; 341 pParser->yystksz = 0; 342 if( yyGrowStack(pParser) ){ 343 pParser->yystack = &pParser->yystk0; 344 pParser->yystksz = 1; 345 } 346 #endif 347 #ifndef YYNOERRORRECOVERY 348 pParser->yyerrcnt = -1; 349 #endif 350 pParser->yytos = pParser->yystack; 351 pParser->yystack[0].stateno = 0; 352 pParser->yystack[0].major = 0; 353 } 354 return pParser; 355 } 356 357 /* The following function deletes the "minor type" or semantic value 358 ** associated with a symbol. The symbol can be either a terminal 359 ** or nonterminal. "yymajor" is the symbol code, and "yypminor" is 360 ** a pointer to the value to be deleted. The code used to do the 361 ** deletions is derived from the %destructor and/or %token_destructor 362 ** directives of the input grammar. 363 */ 364 static void yy_destructor( 365 yyParser *yypParser, /* The parser */ 366 YYCODETYPE yymajor, /* Type code for object to destroy */ 367 YYMINORTYPE *yypminor /* The object to be destroyed */ 368 ){ 369 ParseARG_FETCH; 370 switch( yymajor ){ 371 /* Here is inserted the actions which take place when a 372 ** terminal or non-terminal is destroyed. This can happen 373 ** when the symbol is popped from the stack during a 374 ** reduce or during error processing or when a parser is 375 ** being destroyed before it is finished parsing. 376 ** 377 ** Note: during a reduce, the only symbols destroyed are those 378 ** which appear on the RHS of the rule, but which are *not* used 379 ** inside the C code. 380 */ 381 /********* Begin destructor definitions ***************************************/ 382 %% 383 /********* End destructor definitions *****************************************/ 384 default: break; /* If no destructor action specified: do nothing */ 385 } 386 } 387 388 /* 389 ** Pop the parser's stack once. 390 ** 391 ** If there is a destructor routine associated with the token which 392 ** is popped from the stack, then call it. 393 */ 394 static void yy_pop_parser_stack(yyParser *pParser){ 395 yyStackEntry *yytos; 396 assert( pParser->yytos!=0 ); 397 assert( pParser->yytos > pParser->yystack ); 398 yytos = pParser->yytos--; 399 #ifndef NDEBUG 400 if( yyTraceFILE ){ 401 fprintf(yyTraceFILE,"%sPopping %s\n", 402 yyTracePrompt, 403 yyTokenName[yytos->major]); 404 } 405 #endif 406 yy_destructor(pParser, yytos->major, &yytos->minor); 407 } 408 409 /* 410 ** Deallocate and destroy a parser. Destructors are called for 411 ** all stack elements before shutting the parser down. 412 ** 413 ** If the YYPARSEFREENEVERNULL macro exists (for example because it 414 ** is defined in a %include section of the input grammar) then it is 415 ** assumed that the input pointer is never NULL. 416 */ 417 void ParseFree( 418 void *p, /* The parser to be deleted */ 419 void (*freeProc)(void*) /* Function used to reclaim memory */ 420 ){ 421 yyParser *pParser = (yyParser*)p; 422 #ifndef YYPARSEFREENEVERNULL 423 if( pParser==0 ) return; 424 #endif 425 while( pParser->yytos>pParser->yystack ) yy_pop_parser_stack(pParser); 426 #if YYSTACKDEPTH<=0 427 if( pParser->yystack!=&pParser->yystk0 ) free(pParser->yystack); 428 #endif 429 (*freeProc)((void*)pParser); 430 } 431 432 /* 433 ** Return the peak depth of the stack for a parser. 434 */ 435 #ifdef YYTRACKMAXSTACKDEPTH 436 int ParseStackPeak(void *p){ 437 yyParser *pParser = (yyParser*)p; 438 return pParser->yyhwm; 439 } 440 #endif 441 442 /* 443 ** Find the appropriate action for a parser given the terminal 444 ** look-ahead token iLookAhead. 445 */ 446 static unsigned int yy_find_shift_action( 447 yyParser *pParser, /* The parser */ 448 YYCODETYPE iLookAhead /* The look-ahead token */ 449 ){ 450 int i; 451 int stateno = pParser->yytos->stateno; 452 453 if( stateno>=YY_MIN_REDUCE ) return stateno; 454 assert( stateno <= YY_SHIFT_COUNT ); 455 do{ 456 i = yy_shift_ofst[stateno]; 457 assert( iLookAhead!=YYNOCODE ); 458 i += iLookAhead; 459 if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ 460 #ifdef YYFALLBACK 461 YYCODETYPE iFallback; /* Fallback token */ 462 if( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0]) 463 && (iFallback = yyFallback[iLookAhead])!=0 ){ 464 #ifndef NDEBUG 465 if( yyTraceFILE ){ 466 fprintf(yyTraceFILE, "%sFALLBACK %s => %s\n", 467 yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]); 468 } 469 #endif 470 assert( yyFallback[iFallback]==0 ); /* Fallback loop must terminate */ 471 iLookAhead = iFallback; 472 continue; 473 } 474 #endif 475 #ifdef YYWILDCARD 476 { 477 int j = i - iLookAhead + YYWILDCARD; 478 if( 479 #if YY_SHIFT_MIN+YYWILDCARD<0 480 j>=0 && 481 #endif 482 #if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT 483 j<YY_ACTTAB_COUNT && 484 #endif 485 yy_lookahead[j]==YYWILDCARD && iLookAhead>0 486 ){ 487 #ifndef NDEBUG 488 if( yyTraceFILE ){ 489 fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n", 490 yyTracePrompt, yyTokenName[iLookAhead], 491 yyTokenName[YYWILDCARD]); 492 } 493 #endif /* NDEBUG */ 494 return yy_action[j]; 495 } 496 } 497 #endif /* YYWILDCARD */ 498 return yy_default[stateno]; 499 }else{ 500 return yy_action[i]; 501 } 502 }while(1); 503 } 504 505 /* 506 ** Find the appropriate action for a parser given the non-terminal 507 ** look-ahead token iLookAhead. 508 */ 509 static int yy_find_reduce_action( 510 int stateno, /* Current state number */ 511 YYCODETYPE iLookAhead /* The look-ahead token */ 512 ){ 513 int i; 514 #ifdef YYERRORSYMBOL 515 if( stateno>YY_REDUCE_COUNT ){ 516 return yy_default[stateno]; 517 } 518 #else 519 assert( stateno<=YY_REDUCE_COUNT ); 520 #endif 521 i = yy_reduce_ofst[stateno]; 522 assert( i!=YY_REDUCE_USE_DFLT ); 523 assert( iLookAhead!=YYNOCODE ); 524 i += iLookAhead; 525 #ifdef YYERRORSYMBOL 526 if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ 527 return yy_default[stateno]; 528 } 529 #else 530 assert( i>=0 && i<YY_ACTTAB_COUNT ); 531 assert( yy_lookahead[i]==iLookAhead ); 532 #endif 533 return yy_action[i]; 534 } 535 536 /* 537 ** The following routine is called if the stack overflows. 538 */ 539 static void yyStackOverflow(yyParser *yypParser){ 540 ParseARG_FETCH; 541 yypParser->yytos--; 542 #ifndef NDEBUG 543 if( yyTraceFILE ){ 544 fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt); 545 } 546 #endif 547 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); 548 /* Here code is inserted which will execute if the parser 549 ** stack every overflows */ 550 /******** Begin %stack_overflow code ******************************************/ 551 %% 552 /******** End %stack_overflow code ********************************************/ 553 ParseARG_STORE; /* Suppress warning about unused %extra_argument var */ 554 } 555 556 /* 557 ** Print tracing information for a SHIFT action 558 */ 559 #ifndef NDEBUG 560 static void yyTraceShift(yyParser *yypParser, int yyNewState){ 561 if( yyTraceFILE ){ 562 if( yyNewState<YYNSTATE ){ 563 fprintf(yyTraceFILE,"%sShift '%s', go to state %d\n", 564 yyTracePrompt,yyTokenName[yypParser->yytos->major], 565 yyNewState); 566 }else{ 567 fprintf(yyTraceFILE,"%sShift '%s'\n", 568 yyTracePrompt,yyTokenName[yypParser->yytos->major]); 569 } 570 } 571 } 572 #else 573 # define yyTraceShift(X,Y) 574 #endif 575 576 /* 577 ** Perform a shift action. 578 */ 579 static void yy_shift( 580 yyParser *yypParser, /* The parser to be shifted */ 581 int yyNewState, /* The new state to shift in */ 582 int yyMajor, /* The major token to shift in */ 583 ParseTOKENTYPE yyMinor /* The minor token to shift in */ 584 ){ 585 yyStackEntry *yytos; 586 yypParser->yytos++; 587 #ifdef YYTRACKMAXSTACKDEPTH 588 if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ 589 yypParser->yyhwm++; 590 assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack) ); 591 } 592 #endif 593 #if YYSTACKDEPTH>0 594 if( yypParser->yytos>=&yypParser->yystack[YYSTACKDEPTH] ){ 595 yyStackOverflow(yypParser); 596 return; 597 } 598 #else 599 if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz] ){ 600 if( yyGrowStack(yypParser) ){ 601 yyStackOverflow(yypParser); 602 return; 603 } 604 } 605 #endif 606 if( yyNewState > YY_MAX_SHIFT ){ 607 yyNewState += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE; 608 } 609 yytos = yypParser->yytos; 610 yytos->stateno = (YYACTIONTYPE)yyNewState; 611 yytos->major = (YYCODETYPE)yyMajor; 612 yytos->minor.yy0 = yyMinor; 613 yyTraceShift(yypParser, yyNewState); 614 } 615 616 /* The following table contains information about every rule that 617 ** is used during the reduce. 618 */ 619 static const struct { 620 YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ 621 unsigned char nrhs; /* Number of right-hand side symbols in the rule */ 622 } yyRuleInfo[] = { 623 %% 624 }; 625 626 static void yy_accept(yyParser*); /* Forward Declaration */ 627 628 /* 629 ** Perform a reduce action and the shift that must immediately 630 ** follow the reduce. 631 */ 632 static void yy_reduce( 633 yyParser *yypParser, /* The parser */ 634 unsigned int yyruleno /* Number of the rule by which to reduce */ 635 ){ 636 int yygoto; /* The next state */ 637 int yyact; /* The next action */ 638 yyStackEntry *yymsp; /* The top of the parser's stack */ 639 int yysize; /* Amount to pop the stack */ 640 ParseARG_FETCH; 641 yymsp = yypParser->yytos; 642 #ifndef NDEBUG 643 if( yyTraceFILE && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){ 644 yysize = yyRuleInfo[yyruleno].nrhs; 645 fprintf(yyTraceFILE, "%sReduce [%s], go to state %d.\n", yyTracePrompt, 646 yyRuleName[yyruleno], yymsp[-yysize].stateno); 647 } 648 #endif /* NDEBUG */ 649 650 /* Check that the stack is large enough to grow by a single entry 651 ** if the RHS of the rule is empty. This ensures that there is room 652 ** enough on the stack to push the LHS value */ 653 if( yyRuleInfo[yyruleno].nrhs==0 ){ 654 #ifdef YYTRACKMAXSTACKDEPTH 655 if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ 656 yypParser->yyhwm++; 657 assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack)); 658 } 659 #endif 660 #if YYSTACKDEPTH>0 661 if( yypParser->yytos>=&yypParser->yystack[YYSTACKDEPTH-1] ){ 662 yyStackOverflow(yypParser); 663 return; 664 } 665 #else 666 if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz-1] ){ 667 if( yyGrowStack(yypParser) ){ 668 yyStackOverflow(yypParser); 669 return; 670 } 671 yymsp = yypParser->yytos; 672 } 673 #endif 674 } 675 676 switch( yyruleno ){ 677 /* Beginning here are the reduction cases. A typical example 678 ** follows: 679 ** case 0: 680 ** #line <lineno> <grammarfile> 681 ** { ... } // User supplied code 682 ** #line <lineno> <thisfile> 683 ** break; 684 */ 685 /********** Begin reduce actions **********************************************/ 686 %% 687 /********** End reduce actions ************************************************/ 688 }; 689 assert( yyruleno<sizeof(yyRuleInfo)/sizeof(yyRuleInfo[0]) ); 690 yygoto = yyRuleInfo[yyruleno].lhs; 691 yysize = yyRuleInfo[yyruleno].nrhs; 692 yyact = yy_find_reduce_action(yymsp[-yysize].stateno,(YYCODETYPE)yygoto); 693 if( yyact <= YY_MAX_SHIFTREDUCE ){ 694 if( yyact>YY_MAX_SHIFT ){ 695 yyact += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE; 696 } 697 yymsp -= yysize-1; 698 yypParser->yytos = yymsp; 699 yymsp->stateno = (YYACTIONTYPE)yyact; 700 yymsp->major = (YYCODETYPE)yygoto; 701 yyTraceShift(yypParser, yyact); 702 }else{ 703 assert( yyact == YY_ACCEPT_ACTION ); 704 yypParser->yytos -= yysize; 705 yy_accept(yypParser); 706 } 707 } 708 709 /* 710 ** The following code executes when the parse fails 711 */ 712 #ifndef YYNOERRORRECOVERY 713 static void yy_parse_failed( 714 yyParser *yypParser /* The parser */ 715 ){ 716 ParseARG_FETCH; 717 #ifndef NDEBUG 718 if( yyTraceFILE ){ 719 fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt); 720 } 721 #endif 722 while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); 723 /* Here code is inserted which will be executed whenever the 724 ** parser fails */ 725 /************ Begin %parse_failure code ***************************************/ 726 %% 727 /************ End %parse_failure code *****************************************/ 728 ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ 729 } 730 #endif /* YYNOERRORRECOVERY */ 731 732 /* 733 ** The following code executes when a syntax error first occurs. 734 */ 735 static void yy_syntax_error( 736 yyParser *yypParser, /* The parser */ 737 int yymajor, /* The major type of the error token */ 738 ParseTOKENTYPE yyminor /* The minor type of the error token */ 739 ){ 740 ParseARG_FETCH; 741 #define TOKEN yyminor 742 /************ Begin %syntax_error code ****************************************/ 743 %% 744 /************ End %syntax_error code ******************************************/ 745 ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ 746 } 747 748 /* 749 ** The following is executed when the parser accepts 750 */ 751 static void yy_accept( 752 yyParser *yypParser /* The parser */ 753 ){ 754 ParseARG_FETCH; 755 #ifndef NDEBUG 756 if( yyTraceFILE ){ 757 fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt); 758 } 759 #endif 760 #ifndef YYNOERRORRECOVERY 761 yypParser->yyerrcnt = -1; 762 #endif 763 assert( yypParser->yytos==yypParser->yystack ); 764 /* Here code is inserted which will be executed whenever the 765 ** parser accepts */ 766 /*********** Begin %parse_accept code *****************************************/ 767 %% 768 /*********** End %parse_accept code *******************************************/ 769 ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ 770 } 771 772 /* The main parser program. 773 ** The first argument is a pointer to a structure obtained from 774 ** "ParseAlloc" which describes the current state of the parser. 775 ** The second argument is the major token number. The third is 776 ** the minor token. The fourth optional argument is whatever the 777 ** user wants (and specified in the grammar) and is available for 778 ** use by the action routines. 779 ** 780 ** Inputs: 781 ** <ul> 782 ** <li> A pointer to the parser (an opaque structure.) 783 ** <li> The major token number. 784 ** <li> The minor token number. 785 ** <li> An option argument of a grammar-specified type. 786 ** </ul> 787 ** 788 ** Outputs: 789 ** None. 790 */ 791 void Parse( 792 void *yyp, /* The parser */ 793 int yymajor, /* The major token code number */ 794 ParseTOKENTYPE yyminor /* The value for the token */ 795 ParseARG_PDECL /* Optional %extra_argument parameter */ 796 ){ 797 YYMINORTYPE yyminorunion; 798 unsigned int yyact; /* The parser action. */ 799 #if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) 800 int yyendofinput; /* True if we are at the end of input */ 801 #endif 802 #ifdef YYERRORSYMBOL 803 int yyerrorhit = 0; /* True if yymajor has invoked an error */ 804 #endif 805 yyParser *yypParser; /* The parser */ 806 807 yypParser = (yyParser*)yyp; 808 assert( yypParser->yytos!=0 ); 809 #if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) 810 yyendofinput = (yymajor==0); 811 #endif 812 ParseARG_STORE; 813 814 #ifndef NDEBUG 815 if( yyTraceFILE ){ 816 fprintf(yyTraceFILE,"%sInput '%s'\n",yyTracePrompt,yyTokenName[yymajor]); 817 } 818 #endif 819 820 do{ 821 yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor); 822 if( yyact <= YY_MAX_SHIFTREDUCE ){ 823 yy_shift(yypParser,yyact,yymajor,yyminor); 824 #ifndef YYNOERRORRECOVERY 825 yypParser->yyerrcnt--; 826 #endif 827 yymajor = YYNOCODE; 828 }else if( yyact <= YY_MAX_REDUCE ){ 829 yy_reduce(yypParser,yyact-YY_MIN_REDUCE); 830 }else{ 831 assert( yyact == YY_ERROR_ACTION ); 832 yyminorunion.yy0 = yyminor; 833 #ifdef YYERRORSYMBOL 834 int yymx; 835 #endif 836 #ifndef NDEBUG 837 if( yyTraceFILE ){ 838 fprintf(yyTraceFILE,"%sSyntax Error!\n",yyTracePrompt); 839 } 840 #endif 841 #ifdef YYERRORSYMBOL 842 /* A syntax error has occurred. 843 ** The response to an error depends upon whether or not the 844 ** grammar defines an error token "ERROR". 845 ** 846 ** This is what we do if the grammar does define ERROR: 847 ** 848 ** * Call the %syntax_error function. 849 ** 850 ** * Begin popping the stack until we enter a state where 851 ** it is legal to shift the error symbol, then shift 852 ** the error symbol. 853 ** 854 ** * Set the error count to three. 855 ** 856 ** * Begin accepting and shifting new tokens. No new error 857 ** processing will occur until three tokens have been 858 ** shifted successfully. 859 ** 860 */ 861 if( yypParser->yyerrcnt<0 ){ 862 yy_syntax_error(yypParser,yymajor,yyminor); 863 } 864 yymx = yypParser->yytos->major; 865 if( yymx==YYERRORSYMBOL || yyerrorhit ){ 866 #ifndef NDEBUG 867 if( yyTraceFILE ){ 868 fprintf(yyTraceFILE,"%sDiscard input token %s\n", 869 yyTracePrompt,yyTokenName[yymajor]); 870 } 871 #endif 872 yy_destructor(yypParser, (YYCODETYPE)yymajor, &yyminorunion); 873 yymajor = YYNOCODE; 874 }else{ 875 while( yypParser->yytos >= yypParser->yystack 876 && yymx != YYERRORSYMBOL 877 && (yyact = yy_find_reduce_action( 878 yypParser->yytos->stateno, 879 YYERRORSYMBOL)) >= YY_MIN_REDUCE 880 ){ 881 yy_pop_parser_stack(yypParser); 882 } 883 if( yypParser->yytos < yypParser->yystack || yymajor==0 ){ 884 yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); 885 yy_parse_failed(yypParser); 886 #ifndef YYNOERRORRECOVERY 887 yypParser->yyerrcnt = -1; 888 #endif 889 yymajor = YYNOCODE; 890 }else if( yymx!=YYERRORSYMBOL ){ 891 yy_shift(yypParser,yyact,YYERRORSYMBOL,yyminor); 892 } 893 } 894 yypParser->yyerrcnt = 3; 895 yyerrorhit = 1; 896 #elif defined(YYNOERRORRECOVERY) 897 /* If the YYNOERRORRECOVERY macro is defined, then do not attempt to 898 ** do any kind of error recovery. Instead, simply invoke the syntax 899 ** error routine and continue going as if nothing had happened. 900 ** 901 ** Applications can set this macro (for example inside %include) if 902 ** they intend to abandon the parse upon the first syntax error seen. 903 */ 904 yy_syntax_error(yypParser,yymajor, yyminor); 905 yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); 906 yymajor = YYNOCODE; 907 908 #else /* YYERRORSYMBOL is not defined */ 909 /* This is what we do if the grammar does not define ERROR: 910 ** 911 ** * Report an error message, and throw away the input token. 912 ** 913 ** * If the input token is $, then fail the parse. 914 ** 915 ** As before, subsequent error messages are suppressed until 916 ** three input tokens have been successfully shifted. 917 */ 918 if( yypParser->yyerrcnt<=0 ){ 919 yy_syntax_error(yypParser,yymajor, yyminor); 920 } 921 yypParser->yyerrcnt = 3; 922 yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); 923 if( yyendofinput ){ 924 yy_parse_failed(yypParser); 925 #ifndef YYNOERRORRECOVERY 926 yypParser->yyerrcnt = -1; 927 #endif 928 } 929 yymajor = YYNOCODE; 930 #endif 931 } 932 }while( yymajor!=YYNOCODE && yypParser->yytos>yypParser->yystack ); 933 #ifndef NDEBUG 934 if( yyTraceFILE ){ 935 yyStackEntry *i; 936 char cDiv = '['; 937 fprintf(yyTraceFILE,"%sReturn. Stack=",yyTracePrompt); 938 for(i=&yypParser->yystack[1]; i<=yypParser->yytos; i++){ 939 fprintf(yyTraceFILE,"%c%s", cDiv, yyTokenName[i->major]); 940 cDiv = ' '; 941 } 942 fprintf(yyTraceFILE,"]\n"); 943 } 944 #endif 945 return; 946 } 947