Annotation of embedaddon/sqlite3/tool/lempar.c, revision 1.1.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>