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