Annotation of embedaddon/sqlite3/tool/lempar.c, revision 1.1
1.1 ! misho 1: /* Driver template for the LEMON parser generator.
! 2: ** The author disclaims copyright to this source code.
! 3: */
! 4: /* First off, code is included that follows the "include" declaration
! 5: ** in the input grammar 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. If
! 48: ** zero the stack is dynamically sized using realloc()
! 49: ** ParseARG_SDECL A static variable declaration for the %extra_argument
! 50: ** ParseARG_PDECL A parameter declaration for the %extra_argument
! 51: ** ParseARG_STORE Code to store %extra_argument into yypParser
! 52: ** ParseARG_FETCH Code to extract %extra_argument from yypParser
! 53: ** YYNSTATE the combined number of states.
! 54: ** YYNRULE the number of rules in the grammar
! 55: ** YYERRORSYMBOL is the code number of the error symbol. If not
! 56: ** defined, then do no error processing.
! 57: */
! 58: %%
! 59: #define YY_NO_ACTION (YYNSTATE+YYNRULE+2)
! 60: #define YY_ACCEPT_ACTION (YYNSTATE+YYNRULE+1)
! 61: #define YY_ERROR_ACTION (YYNSTATE+YYNRULE)
! 62:
! 63: /* The yyzerominor constant is used to initialize instances of
! 64: ** YYMINORTYPE objects to zero. */
! 65: static const YYMINORTYPE yyzerominor = { 0 };
! 66:
! 67: /* Define the yytestcase() macro to be a no-op if is not already defined
! 68: ** otherwise.
! 69: **
! 70: ** Applications can choose to define yytestcase() in the %include section
! 71: ** to a macro that can assist in verifying code coverage. For production
! 72: ** code the yytestcase() macro should be turned off. But it is useful
! 73: ** for testing.
! 74: */
! 75: #ifndef yytestcase
! 76: # define yytestcase(X)
! 77: #endif
! 78:
! 79:
! 80: /* Next are the tables used to determine what action to take based on the
! 81: ** current state and lookahead token. These tables are used to implement
! 82: ** functions that take a state number and lookahead value and return an
! 83: ** action integer.
! 84: **
! 85: ** Suppose the action integer is N. Then the action is determined as
! 86: ** follows
! 87: **
! 88: ** 0 <= N < YYNSTATE Shift N. That is, push the lookahead
! 89: ** token onto the stack and goto state N.
! 90: **
! 91: ** YYNSTATE <= N < YYNSTATE+YYNRULE Reduce by rule N-YYNSTATE.
! 92: **
! 93: ** N == YYNSTATE+YYNRULE A syntax error has occurred.
! 94: **
! 95: ** N == YYNSTATE+YYNRULE+1 The parser accepts its input.
! 96: **
! 97: ** N == YYNSTATE+YYNRULE+2 No such action. Denotes unused
! 98: ** slots in the yy_action[] table.
! 99: **
! 100: ** The action table is constructed as a single large table named yy_action[].
! 101: ** Given state S and lookahead X, the action is computed as
! 102: **
! 103: ** yy_action[ yy_shift_ofst[S] + X ]
! 104: **
! 105: ** If the index value yy_shift_ofst[S]+X is out of range or if the value
! 106: ** yy_lookahead[yy_shift_ofst[S]+X] is not equal to X or if yy_shift_ofst[S]
! 107: ** is equal to YY_SHIFT_USE_DFLT, it means that the action is not in the table
! 108: ** and that yy_default[S] should be used instead.
! 109: **
! 110: ** The formula above is for computing the action when the lookahead is
! 111: ** a terminal symbol. If the lookahead is a non-terminal (as occurs after
! 112: ** a reduce action) then the yy_reduce_ofst[] array is used in place of
! 113: ** the yy_shift_ofst[] array and YY_REDUCE_USE_DFLT is used in place of
! 114: ** YY_SHIFT_USE_DFLT.
! 115: **
! 116: ** The following are the tables generated in this section:
! 117: **
! 118: ** yy_action[] A single table containing all actions.
! 119: ** yy_lookahead[] A table containing the lookahead for each entry in
! 120: ** yy_action. Used to detect hash collisions.
! 121: ** yy_shift_ofst[] For each state, the offset into yy_action for
! 122: ** shifting terminals.
! 123: ** yy_reduce_ofst[] For each state, the offset into yy_action for
! 124: ** shifting non-terminals after a reduce.
! 125: ** yy_default[] Default action for each state.
! 126: */
! 127: %%
! 128:
! 129: /* The next table maps tokens into fallback tokens. If a construct
! 130: ** like the following:
! 131: **
! 132: ** %fallback ID X Y Z.
! 133: **
! 134: ** appears in the grammar, then ID becomes a fallback token for X, Y,
! 135: ** and Z. Whenever one of the tokens X, Y, or Z is input to the parser
! 136: ** but it does not parse, the type of the token is changed to ID and
! 137: ** the parse is retried before an error is thrown.
! 138: */
! 139: #ifdef YYFALLBACK
! 140: static const YYCODETYPE yyFallback[] = {
! 141: %%
! 142: };
! 143: #endif /* YYFALLBACK */
! 144:
! 145: /* The following structure represents a single element of the
! 146: ** parser's stack. Information stored includes:
! 147: **
! 148: ** + The state number for the parser at this level of the stack.
! 149: **
! 150: ** + The value of the token stored at this level of the stack.
! 151: ** (In other words, the "major" token.)
! 152: **
! 153: ** + The semantic value stored at this level of the stack. This is
! 154: ** the information used by the action routines in the grammar.
! 155: ** It is sometimes called the "minor" token.
! 156: */
! 157: struct yyStackEntry {
! 158: YYACTIONTYPE stateno; /* The state-number */
! 159: YYCODETYPE major; /* The major token value. This is the code
! 160: ** number for the token at this stack level */
! 161: YYMINORTYPE minor; /* The user-supplied minor token value. This
! 162: ** is the value of the token */
! 163: };
! 164: typedef struct yyStackEntry yyStackEntry;
! 165:
! 166: /* The state of the parser is completely contained in an instance of
! 167: ** the following structure */
! 168: struct yyParser {
! 169: int yyidx; /* Index of top element in stack */
! 170: #ifdef YYTRACKMAXSTACKDEPTH
! 171: int yyidxMax; /* Maximum value of yyidx */
! 172: #endif
! 173: int yyerrcnt; /* Shifts left before out of the error */
! 174: ParseARG_SDECL /* A place to hold %extra_argument */
! 175: #if YYSTACKDEPTH<=0
! 176: int yystksz; /* Current side of the stack */
! 177: yyStackEntry *yystack; /* The parser's stack */
! 178: #else
! 179: yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */
! 180: #endif
! 181: };
! 182: typedef struct yyParser yyParser;
! 183:
! 184: #ifndef NDEBUG
! 185: #include <stdio.h>
! 186: static FILE *yyTraceFILE = 0;
! 187: static char *yyTracePrompt = 0;
! 188: #endif /* NDEBUG */
! 189:
! 190: #ifndef NDEBUG
! 191: /*
! 192: ** Turn parser tracing on by giving a stream to which to write the trace
! 193: ** and a prompt to preface each trace message. Tracing is turned off
! 194: ** by making either argument NULL
! 195: **
! 196: ** Inputs:
! 197: ** <ul>
! 198: ** <li> A FILE* to which trace output should be written.
! 199: ** If NULL, then tracing is turned off.
! 200: ** <li> A prefix string written at the beginning of every
! 201: ** line of trace output. If NULL, then tracing is
! 202: ** turned off.
! 203: ** </ul>
! 204: **
! 205: ** Outputs:
! 206: ** None.
! 207: */
! 208: void ParseTrace(FILE *TraceFILE, char *zTracePrompt){
! 209: yyTraceFILE = TraceFILE;
! 210: yyTracePrompt = zTracePrompt;
! 211: if( yyTraceFILE==0 ) yyTracePrompt = 0;
! 212: else if( yyTracePrompt==0 ) yyTraceFILE = 0;
! 213: }
! 214: #endif /* NDEBUG */
! 215:
! 216: #ifndef NDEBUG
! 217: /* For tracing shifts, the names of all terminals and nonterminals
! 218: ** are required. The following table supplies these names */
! 219: static const char *const yyTokenName[] = {
! 220: %%
! 221: };
! 222: #endif /* NDEBUG */
! 223:
! 224: #ifndef NDEBUG
! 225: /* For tracing reduce actions, the names of all rules are required.
! 226: */
! 227: static const char *const yyRuleName[] = {
! 228: %%
! 229: };
! 230: #endif /* NDEBUG */
! 231:
! 232:
! 233: #if YYSTACKDEPTH<=0
! 234: /*
! 235: ** Try to increase the size of the parser stack.
! 236: */
! 237: static void yyGrowStack(yyParser *p){
! 238: int newSize;
! 239: yyStackEntry *pNew;
! 240:
! 241: newSize = p->yystksz*2 + 100;
! 242: pNew = realloc(p->yystack, newSize*sizeof(pNew[0]));
! 243: if( pNew ){
! 244: p->yystack = pNew;
! 245: p->yystksz = newSize;
! 246: #ifndef NDEBUG
! 247: if( yyTraceFILE ){
! 248: fprintf(yyTraceFILE,"%sStack grows to %d entries!\n",
! 249: yyTracePrompt, p->yystksz);
! 250: }
! 251: #endif
! 252: }
! 253: }
! 254: #endif
! 255:
! 256: /*
! 257: ** This function allocates a new parser.
! 258: ** The only argument is a pointer to a function which works like
! 259: ** malloc.
! 260: **
! 261: ** Inputs:
! 262: ** A pointer to the function used to allocate memory.
! 263: **
! 264: ** Outputs:
! 265: ** A pointer to a parser. This pointer is used in subsequent calls
! 266: ** to Parse and ParseFree.
! 267: */
! 268: void *ParseAlloc(void *(*mallocProc)(size_t)){
! 269: yyParser *pParser;
! 270: pParser = (yyParser*)(*mallocProc)( (size_t)sizeof(yyParser) );
! 271: if( pParser ){
! 272: pParser->yyidx = -1;
! 273: #ifdef YYTRACKMAXSTACKDEPTH
! 274: pParser->yyidxMax = 0;
! 275: #endif
! 276: #if YYSTACKDEPTH<=0
! 277: pParser->yystack = NULL;
! 278: pParser->yystksz = 0;
! 279: yyGrowStack(pParser);
! 280: #endif
! 281: }
! 282: return pParser;
! 283: }
! 284:
! 285: /* The following function deletes the value associated with a
! 286: ** symbol. The symbol can be either a terminal or nonterminal.
! 287: ** "yymajor" is the symbol code, and "yypminor" is a pointer to
! 288: ** the value.
! 289: */
! 290: static void yy_destructor(
! 291: yyParser *yypParser, /* The parser */
! 292: YYCODETYPE yymajor, /* Type code for object to destroy */
! 293: YYMINORTYPE *yypminor /* The object to be destroyed */
! 294: ){
! 295: ParseARG_FETCH;
! 296: switch( yymajor ){
! 297: /* Here is inserted the actions which take place when a
! 298: ** terminal or non-terminal is destroyed. This can happen
! 299: ** when the symbol is popped from the stack during a
! 300: ** reduce or during error processing or when a parser is
! 301: ** being destroyed before it is finished parsing.
! 302: **
! 303: ** Note: during a reduce, the only symbols destroyed are those
! 304: ** which appear on the RHS of the rule, but which are not used
! 305: ** inside the C code.
! 306: */
! 307: %%
! 308: default: break; /* If no destructor action specified: do nothing */
! 309: }
! 310: }
! 311:
! 312: /*
! 313: ** Pop the parser's stack once.
! 314: **
! 315: ** If there is a destructor routine associated with the token which
! 316: ** is popped from the stack, then call it.
! 317: **
! 318: ** Return the major token number for the symbol popped.
! 319: */
! 320: static int yy_pop_parser_stack(yyParser *pParser){
! 321: YYCODETYPE yymajor;
! 322: yyStackEntry *yytos = &pParser->yystack[pParser->yyidx];
! 323:
! 324: if( pParser->yyidx<0 ) return 0;
! 325: #ifndef NDEBUG
! 326: if( yyTraceFILE && pParser->yyidx>=0 ){
! 327: fprintf(yyTraceFILE,"%sPopping %s\n",
! 328: yyTracePrompt,
! 329: yyTokenName[yytos->major]);
! 330: }
! 331: #endif
! 332: yymajor = yytos->major;
! 333: yy_destructor(pParser, yymajor, &yytos->minor);
! 334: pParser->yyidx--;
! 335: return yymajor;
! 336: }
! 337:
! 338: /*
! 339: ** Deallocate and destroy a parser. Destructors are all called for
! 340: ** all stack elements before shutting the parser down.
! 341: **
! 342: ** Inputs:
! 343: ** <ul>
! 344: ** <li> A pointer to the parser. This should be a pointer
! 345: ** obtained from ParseAlloc.
! 346: ** <li> A pointer to a function used to reclaim memory obtained
! 347: ** from malloc.
! 348: ** </ul>
! 349: */
! 350: void ParseFree(
! 351: void *p, /* The parser to be deleted */
! 352: void (*freeProc)(void*) /* Function used to reclaim memory */
! 353: ){
! 354: yyParser *pParser = (yyParser*)p;
! 355: if( pParser==0 ) return;
! 356: while( pParser->yyidx>=0 ) yy_pop_parser_stack(pParser);
! 357: #if YYSTACKDEPTH<=0
! 358: free(pParser->yystack);
! 359: #endif
! 360: (*freeProc)((void*)pParser);
! 361: }
! 362:
! 363: /*
! 364: ** Return the peak depth of the stack for a parser.
! 365: */
! 366: #ifdef YYTRACKMAXSTACKDEPTH
! 367: int ParseStackPeak(void *p){
! 368: yyParser *pParser = (yyParser*)p;
! 369: return pParser->yyidxMax;
! 370: }
! 371: #endif
! 372:
! 373: /*
! 374: ** Find the appropriate action for a parser given the terminal
! 375: ** look-ahead token iLookAhead.
! 376: **
! 377: ** If the look-ahead token is YYNOCODE, then check to see if the action is
! 378: ** independent of the look-ahead. If it is, return the action, otherwise
! 379: ** return YY_NO_ACTION.
! 380: */
! 381: static int yy_find_shift_action(
! 382: yyParser *pParser, /* The parser */
! 383: YYCODETYPE iLookAhead /* The look-ahead token */
! 384: ){
! 385: int i;
! 386: int stateno = pParser->yystack[pParser->yyidx].stateno;
! 387:
! 388: if( stateno>YY_SHIFT_COUNT
! 389: || (i = yy_shift_ofst[stateno])==YY_SHIFT_USE_DFLT ){
! 390: return yy_default[stateno];
! 391: }
! 392: assert( iLookAhead!=YYNOCODE );
! 393: i += iLookAhead;
! 394: if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){
! 395: if( iLookAhead>0 ){
! 396: #ifdef YYFALLBACK
! 397: YYCODETYPE iFallback; /* Fallback token */
! 398: if( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0])
! 399: && (iFallback = yyFallback[iLookAhead])!=0 ){
! 400: #ifndef NDEBUG
! 401: if( yyTraceFILE ){
! 402: fprintf(yyTraceFILE, "%sFALLBACK %s => %s\n",
! 403: yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]);
! 404: }
! 405: #endif
! 406: return yy_find_shift_action(pParser, iFallback);
! 407: }
! 408: #endif
! 409: #ifdef YYWILDCARD
! 410: {
! 411: int j = i - iLookAhead + YYWILDCARD;
! 412: if(
! 413: #if YY_SHIFT_MIN+YYWILDCARD<0
! 414: j>=0 &&
! 415: #endif
! 416: #if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT
! 417: j<YY_ACTTAB_COUNT &&
! 418: #endif
! 419: yy_lookahead[j]==YYWILDCARD
! 420: ){
! 421: #ifndef NDEBUG
! 422: if( yyTraceFILE ){
! 423: fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n",
! 424: yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[YYWILDCARD]);
! 425: }
! 426: #endif /* NDEBUG */
! 427: return yy_action[j];
! 428: }
! 429: }
! 430: #endif /* YYWILDCARD */
! 431: }
! 432: return yy_default[stateno];
! 433: }else{
! 434: return yy_action[i];
! 435: }
! 436: }
! 437:
! 438: /*
! 439: ** Find the appropriate action for a parser given the non-terminal
! 440: ** look-ahead token iLookAhead.
! 441: **
! 442: ** If the look-ahead token is YYNOCODE, then check to see if the action is
! 443: ** independent of the look-ahead. If it is, return the action, otherwise
! 444: ** return YY_NO_ACTION.
! 445: */
! 446: static int yy_find_reduce_action(
! 447: int stateno, /* Current state number */
! 448: YYCODETYPE iLookAhead /* The look-ahead token */
! 449: ){
! 450: int i;
! 451: #ifdef YYERRORSYMBOL
! 452: if( stateno>YY_REDUCE_COUNT ){
! 453: return yy_default[stateno];
! 454: }
! 455: #else
! 456: assert( stateno<=YY_REDUCE_COUNT );
! 457: #endif
! 458: i = yy_reduce_ofst[stateno];
! 459: assert( i!=YY_REDUCE_USE_DFLT );
! 460: assert( iLookAhead!=YYNOCODE );
! 461: i += iLookAhead;
! 462: #ifdef YYERRORSYMBOL
! 463: if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){
! 464: return yy_default[stateno];
! 465: }
! 466: #else
! 467: assert( i>=0 && i<YY_ACTTAB_COUNT );
! 468: assert( yy_lookahead[i]==iLookAhead );
! 469: #endif
! 470: return yy_action[i];
! 471: }
! 472:
! 473: /*
! 474: ** The following routine is called if the stack overflows.
! 475: */
! 476: static void yyStackOverflow(yyParser *yypParser, YYMINORTYPE *yypMinor){
! 477: ParseARG_FETCH;
! 478: yypParser->yyidx--;
! 479: #ifndef NDEBUG
! 480: if( yyTraceFILE ){
! 481: fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt);
! 482: }
! 483: #endif
! 484: while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser);
! 485: /* Here code is inserted which will execute if the parser
! 486: ** stack every overflows */
! 487: %%
! 488: ParseARG_STORE; /* Suppress warning about unused %extra_argument var */
! 489: }
! 490:
! 491: /*
! 492: ** Perform a shift action.
! 493: */
! 494: static void yy_shift(
! 495: yyParser *yypParser, /* The parser to be shifted */
! 496: int yyNewState, /* The new state to shift in */
! 497: int yyMajor, /* The major token to shift in */
! 498: YYMINORTYPE *yypMinor /* Pointer to the minor token to shift in */
! 499: ){
! 500: yyStackEntry *yytos;
! 501: yypParser->yyidx++;
! 502: #ifdef YYTRACKMAXSTACKDEPTH
! 503: if( yypParser->yyidx>yypParser->yyidxMax ){
! 504: yypParser->yyidxMax = yypParser->yyidx;
! 505: }
! 506: #endif
! 507: #if YYSTACKDEPTH>0
! 508: if( yypParser->yyidx>=YYSTACKDEPTH ){
! 509: yyStackOverflow(yypParser, yypMinor);
! 510: return;
! 511: }
! 512: #else
! 513: if( yypParser->yyidx>=yypParser->yystksz ){
! 514: yyGrowStack(yypParser);
! 515: if( yypParser->yyidx>=yypParser->yystksz ){
! 516: yyStackOverflow(yypParser, yypMinor);
! 517: return;
! 518: }
! 519: }
! 520: #endif
! 521: yytos = &yypParser->yystack[yypParser->yyidx];
! 522: yytos->stateno = (YYACTIONTYPE)yyNewState;
! 523: yytos->major = (YYCODETYPE)yyMajor;
! 524: yytos->minor = *yypMinor;
! 525: #ifndef NDEBUG
! 526: if( yyTraceFILE && yypParser->yyidx>0 ){
! 527: int i;
! 528: fprintf(yyTraceFILE,"%sShift %d\n",yyTracePrompt,yyNewState);
! 529: fprintf(yyTraceFILE,"%sStack:",yyTracePrompt);
! 530: for(i=1; i<=yypParser->yyidx; i++)
! 531: fprintf(yyTraceFILE," %s",yyTokenName[yypParser->yystack[i].major]);
! 532: fprintf(yyTraceFILE,"\n");
! 533: }
! 534: #endif
! 535: }
! 536:
! 537: /* The following table contains information about every rule that
! 538: ** is used during the reduce.
! 539: */
! 540: static const struct {
! 541: YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */
! 542: unsigned char nrhs; /* Number of right-hand side symbols in the rule */
! 543: } yyRuleInfo[] = {
! 544: %%
! 545: };
! 546:
! 547: static void yy_accept(yyParser*); /* Forward Declaration */
! 548:
! 549: /*
! 550: ** Perform a reduce action and the shift that must immediately
! 551: ** follow the reduce.
! 552: */
! 553: static void yy_reduce(
! 554: yyParser *yypParser, /* The parser */
! 555: int yyruleno /* Number of the rule by which to reduce */
! 556: ){
! 557: int yygoto; /* The next state */
! 558: int yyact; /* The next action */
! 559: YYMINORTYPE yygotominor; /* The LHS of the rule reduced */
! 560: yyStackEntry *yymsp; /* The top of the parser's stack */
! 561: int yysize; /* Amount to pop the stack */
! 562: ParseARG_FETCH;
! 563: yymsp = &yypParser->yystack[yypParser->yyidx];
! 564: #ifndef NDEBUG
! 565: if( yyTraceFILE && yyruleno>=0
! 566: && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){
! 567: fprintf(yyTraceFILE, "%sReduce [%s].\n", yyTracePrompt,
! 568: yyRuleName[yyruleno]);
! 569: }
! 570: #endif /* NDEBUG */
! 571:
! 572: /* Silence complaints from purify about yygotominor being uninitialized
! 573: ** in some cases when it is copied into the stack after the following
! 574: ** switch. yygotominor is uninitialized when a rule reduces that does
! 575: ** not set the value of its left-hand side nonterminal. Leaving the
! 576: ** value of the nonterminal uninitialized is utterly harmless as long
! 577: ** as the value is never used. So really the only thing this code
! 578: ** accomplishes is to quieten purify.
! 579: **
! 580: ** 2007-01-16: The wireshark project (www.wireshark.org) reports that
! 581: ** without this code, their parser segfaults. I'm not sure what there
! 582: ** parser is doing to make this happen. This is the second bug report
! 583: ** from wireshark this week. Clearly they are stressing Lemon in ways
! 584: ** that it has not been previously stressed... (SQLite ticket #2172)
! 585: */
! 586: /*memset(&yygotominor, 0, sizeof(yygotominor));*/
! 587: yygotominor = yyzerominor;
! 588:
! 589:
! 590: switch( yyruleno ){
! 591: /* Beginning here are the reduction cases. A typical example
! 592: ** follows:
! 593: ** case 0:
! 594: ** #line <lineno> <grammarfile>
! 595: ** { ... } // User supplied code
! 596: ** #line <lineno> <thisfile>
! 597: ** break;
! 598: */
! 599: %%
! 600: };
! 601: yygoto = yyRuleInfo[yyruleno].lhs;
! 602: yysize = yyRuleInfo[yyruleno].nrhs;
! 603: yypParser->yyidx -= yysize;
! 604: yyact = yy_find_reduce_action(yymsp[-yysize].stateno,(YYCODETYPE)yygoto);
! 605: if( yyact < YYNSTATE ){
! 606: #ifdef NDEBUG
! 607: /* If we are not debugging and the reduce action popped at least
! 608: ** one element off the stack, then we can push the new element back
! 609: ** onto the stack here, and skip the stack overflow test in yy_shift().
! 610: ** That gives a significant speed improvement. */
! 611: if( yysize ){
! 612: yypParser->yyidx++;
! 613: yymsp -= yysize-1;
! 614: yymsp->stateno = (YYACTIONTYPE)yyact;
! 615: yymsp->major = (YYCODETYPE)yygoto;
! 616: yymsp->minor = yygotominor;
! 617: }else
! 618: #endif
! 619: {
! 620: yy_shift(yypParser,yyact,yygoto,&yygotominor);
! 621: }
! 622: }else{
! 623: assert( yyact == YYNSTATE + YYNRULE + 1 );
! 624: yy_accept(yypParser);
! 625: }
! 626: }
! 627:
! 628: /*
! 629: ** The following code executes when the parse fails
! 630: */
! 631: #ifndef YYNOERRORRECOVERY
! 632: static void yy_parse_failed(
! 633: yyParser *yypParser /* The parser */
! 634: ){
! 635: ParseARG_FETCH;
! 636: #ifndef NDEBUG
! 637: if( yyTraceFILE ){
! 638: fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt);
! 639: }
! 640: #endif
! 641: while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser);
! 642: /* Here code is inserted which will be executed whenever the
! 643: ** parser fails */
! 644: %%
! 645: ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */
! 646: }
! 647: #endif /* YYNOERRORRECOVERY */
! 648:
! 649: /*
! 650: ** The following code executes when a syntax error first occurs.
! 651: */
! 652: static void yy_syntax_error(
! 653: yyParser *yypParser, /* The parser */
! 654: int yymajor, /* The major type of the error token */
! 655: YYMINORTYPE yyminor /* The minor type of the error token */
! 656: ){
! 657: ParseARG_FETCH;
! 658: #define TOKEN (yyminor.yy0)
! 659: %%
! 660: ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */
! 661: }
! 662:
! 663: /*
! 664: ** The following is executed when the parser accepts
! 665: */
! 666: static void yy_accept(
! 667: yyParser *yypParser /* The parser */
! 668: ){
! 669: ParseARG_FETCH;
! 670: #ifndef NDEBUG
! 671: if( yyTraceFILE ){
! 672: fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt);
! 673: }
! 674: #endif
! 675: while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser);
! 676: /* Here code is inserted which will be executed whenever the
! 677: ** parser accepts */
! 678: %%
! 679: ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */
! 680: }
! 681:
! 682: /* The main parser program.
! 683: ** The first argument is a pointer to a structure obtained from
! 684: ** "ParseAlloc" which describes the current state of the parser.
! 685: ** The second argument is the major token number. The third is
! 686: ** the minor token. The fourth optional argument is whatever the
! 687: ** user wants (and specified in the grammar) and is available for
! 688: ** use by the action routines.
! 689: **
! 690: ** Inputs:
! 691: ** <ul>
! 692: ** <li> A pointer to the parser (an opaque structure.)
! 693: ** <li> The major token number.
! 694: ** <li> The minor token number.
! 695: ** <li> An option argument of a grammar-specified type.
! 696: ** </ul>
! 697: **
! 698: ** Outputs:
! 699: ** None.
! 700: */
! 701: void Parse(
! 702: void *yyp, /* The parser */
! 703: int yymajor, /* The major token code number */
! 704: ParseTOKENTYPE yyminor /* The value for the token */
! 705: ParseARG_PDECL /* Optional %extra_argument parameter */
! 706: ){
! 707: YYMINORTYPE yyminorunion;
! 708: int yyact; /* The parser action. */
! 709: int yyendofinput; /* True if we are at the end of input */
! 710: #ifdef YYERRORSYMBOL
! 711: int yyerrorhit = 0; /* True if yymajor has invoked an error */
! 712: #endif
! 713: yyParser *yypParser; /* The parser */
! 714:
! 715: /* (re)initialize the parser, if necessary */
! 716: yypParser = (yyParser*)yyp;
! 717: if( yypParser->yyidx<0 ){
! 718: #if YYSTACKDEPTH<=0
! 719: if( yypParser->yystksz <=0 ){
! 720: /*memset(&yyminorunion, 0, sizeof(yyminorunion));*/
! 721: yyminorunion = yyzerominor;
! 722: yyStackOverflow(yypParser, &yyminorunion);
! 723: return;
! 724: }
! 725: #endif
! 726: yypParser->yyidx = 0;
! 727: yypParser->yyerrcnt = -1;
! 728: yypParser->yystack[0].stateno = 0;
! 729: yypParser->yystack[0].major = 0;
! 730: }
! 731: yyminorunion.yy0 = yyminor;
! 732: yyendofinput = (yymajor==0);
! 733: ParseARG_STORE;
! 734:
! 735: #ifndef NDEBUG
! 736: if( yyTraceFILE ){
! 737: fprintf(yyTraceFILE,"%sInput %s\n",yyTracePrompt,yyTokenName[yymajor]);
! 738: }
! 739: #endif
! 740:
! 741: do{
! 742: yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor);
! 743: if( yyact<YYNSTATE ){
! 744: assert( !yyendofinput ); /* Impossible to shift the $ token */
! 745: yy_shift(yypParser,yyact,yymajor,&yyminorunion);
! 746: yypParser->yyerrcnt--;
! 747: yymajor = YYNOCODE;
! 748: }else if( yyact < YYNSTATE + YYNRULE ){
! 749: yy_reduce(yypParser,yyact-YYNSTATE);
! 750: }else{
! 751: assert( yyact == YY_ERROR_ACTION );
! 752: #ifdef YYERRORSYMBOL
! 753: int yymx;
! 754: #endif
! 755: #ifndef NDEBUG
! 756: if( yyTraceFILE ){
! 757: fprintf(yyTraceFILE,"%sSyntax Error!\n",yyTracePrompt);
! 758: }
! 759: #endif
! 760: #ifdef YYERRORSYMBOL
! 761: /* A syntax error has occurred.
! 762: ** The response to an error depends upon whether or not the
! 763: ** grammar defines an error token "ERROR".
! 764: **
! 765: ** This is what we do if the grammar does define ERROR:
! 766: **
! 767: ** * Call the %syntax_error function.
! 768: **
! 769: ** * Begin popping the stack until we enter a state where
! 770: ** it is legal to shift the error symbol, then shift
! 771: ** the error symbol.
! 772: **
! 773: ** * Set the error count to three.
! 774: **
! 775: ** * Begin accepting and shifting new tokens. No new error
! 776: ** processing will occur until three tokens have been
! 777: ** shifted successfully.
! 778: **
! 779: */
! 780: if( yypParser->yyerrcnt<0 ){
! 781: yy_syntax_error(yypParser,yymajor,yyminorunion);
! 782: }
! 783: yymx = yypParser->yystack[yypParser->yyidx].major;
! 784: if( yymx==YYERRORSYMBOL || yyerrorhit ){
! 785: #ifndef NDEBUG
! 786: if( yyTraceFILE ){
! 787: fprintf(yyTraceFILE,"%sDiscard input token %s\n",
! 788: yyTracePrompt,yyTokenName[yymajor]);
! 789: }
! 790: #endif
! 791: yy_destructor(yypParser, (YYCODETYPE)yymajor,&yyminorunion);
! 792: yymajor = YYNOCODE;
! 793: }else{
! 794: while(
! 795: yypParser->yyidx >= 0 &&
! 796: yymx != YYERRORSYMBOL &&
! 797: (yyact = yy_find_reduce_action(
! 798: yypParser->yystack[yypParser->yyidx].stateno,
! 799: YYERRORSYMBOL)) >= YYNSTATE
! 800: ){
! 801: yy_pop_parser_stack(yypParser);
! 802: }
! 803: if( yypParser->yyidx < 0 || yymajor==0 ){
! 804: yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
! 805: yy_parse_failed(yypParser);
! 806: yymajor = YYNOCODE;
! 807: }else if( yymx!=YYERRORSYMBOL ){
! 808: YYMINORTYPE u2;
! 809: u2.YYERRSYMDT = 0;
! 810: yy_shift(yypParser,yyact,YYERRORSYMBOL,&u2);
! 811: }
! 812: }
! 813: yypParser->yyerrcnt = 3;
! 814: yyerrorhit = 1;
! 815: #elif defined(YYNOERRORRECOVERY)
! 816: /* If the YYNOERRORRECOVERY macro is defined, then do not attempt to
! 817: ** do any kind of error recovery. Instead, simply invoke the syntax
! 818: ** error routine and continue going as if nothing had happened.
! 819: **
! 820: ** Applications can set this macro (for example inside %include) if
! 821: ** they intend to abandon the parse upon the first syntax error seen.
! 822: */
! 823: yy_syntax_error(yypParser,yymajor,yyminorunion);
! 824: yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
! 825: yymajor = YYNOCODE;
! 826:
! 827: #else /* YYERRORSYMBOL is not defined */
! 828: /* This is what we do if the grammar does not define ERROR:
! 829: **
! 830: ** * Report an error message, and throw away the input token.
! 831: **
! 832: ** * If the input token is $, then fail the parse.
! 833: **
! 834: ** As before, subsequent error messages are suppressed until
! 835: ** three input tokens have been successfully shifted.
! 836: */
! 837: if( yypParser->yyerrcnt<=0 ){
! 838: yy_syntax_error(yypParser,yymajor,yyminorunion);
! 839: }
! 840: yypParser->yyerrcnt = 3;
! 841: yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
! 842: if( yyendofinput ){
! 843: yy_parse_failed(yypParser);
! 844: }
! 845: yymajor = YYNOCODE;
! 846: #endif
! 847: }
! 848: }while( yymajor!=YYNOCODE && yypParser->yyidx>=0 );
! 849: return;
! 850: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>