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