Index: third_party/sqlite/src/tool/lempar.c |
diff --git a/third_party/sqlite/src/tool/lempar.c b/third_party/sqlite/src/tool/lempar.c |
index 312507e5f13d040afff652285c08ac469ae0c5c0..21ed9d79abe3fd9b5d61bc5d709c675146e02feb 100644 |
--- a/third_party/sqlite/src/tool/lempar.c |
+++ b/third_party/sqlite/src/tool/lempar.c |
@@ -87,10 +87,6 @@ |
%% |
/************* End control #defines *******************************************/ |
-/* The yyzerominor constant is used to initialize instances of |
-** YYMINORTYPE objects to zero. */ |
-static const YYMINORTYPE yyzerominor = { 0 }; |
- |
/* Define the yytestcase() macro to be a no-op if is not already defined |
** otherwise. |
** |
@@ -120,7 +116,7 @@ static const YYMINORTYPE yyzerominor = { 0 }; |
** |
** N between YY_MIN_REDUCE Reduce by rule N-YY_MIN_REDUCE |
** and YY_MAX_REDUCE |
- |
+** |
** N == YY_ERROR_ACTION A syntax error has occurred. |
** |
** N == YY_ACCEPT_ACTION The parser accepts its input. |
@@ -129,16 +125,20 @@ static const YYMINORTYPE yyzerominor = { 0 }; |
** slots in the yy_action[] table. |
** |
** The action table is constructed as a single large table named yy_action[]. |
-** Given state S and lookahead X, the action is computed as |
+** Given state S and lookahead X, the action is computed as either: |
** |
-** yy_action[ yy_shift_ofst[S] + X ] |
+** (A) N = yy_action[ yy_shift_ofst[S] + X ] |
+** (B) N = yy_default[S] |
** |
-** If the index value yy_shift_ofst[S]+X is out of range or if the value |
-** yy_lookahead[yy_shift_ofst[S]+X] is not equal to X or if yy_shift_ofst[S] |
-** is equal to YY_SHIFT_USE_DFLT, it means that the action is not in the table |
-** and that yy_default[S] should be used instead. |
+** The (A) formula is preferred. The B formula is used instead if: |
+** (1) The yy_shift_ofst[S]+X value is out of range, or |
+** (2) yy_lookahead[yy_shift_ofst[S]+X] is not equal to X, or |
+** (3) yy_shift_ofst[S] equal YY_SHIFT_USE_DFLT. |
+** (Implementation note: YY_SHIFT_USE_DFLT is chosen so that |
+** YY_SHIFT_USE_DFLT+X will be out of range for all possible lookaheads X. |
+** Hence only tests (1) and (2) need to be evaluated.) |
** |
-** The formula above is for computing the action when the lookahead is |
+** The formulas above are for computing the action when the lookahead is |
** a terminal symbol. If the lookahead is a non-terminal (as occurs after |
** a reduce action) then the yy_reduce_ofst[] array is used in place of |
** the yy_shift_ofst[] array and YY_REDUCE_USE_DFLT is used in place of |
@@ -207,15 +207,18 @@ typedef struct yyStackEntry yyStackEntry; |
/* The state of the parser is completely contained in an instance of |
** the following structure */ |
struct yyParser { |
- int yyidx; /* Index of top element in stack */ |
+ yyStackEntry *yytos; /* Pointer to top element of the stack */ |
#ifdef YYTRACKMAXSTACKDEPTH |
- int yyidxMax; /* Maximum value of yyidx */ |
+ int yyhwm; /* High-water mark of the stack */ |
#endif |
+#ifndef YYNOERRORRECOVERY |
int yyerrcnt; /* Shifts left before out of the error */ |
+#endif |
ParseARG_SDECL /* A place to hold %extra_argument */ |
#if YYSTACKDEPTH<=0 |
int yystksz; /* Current side of the stack */ |
yyStackEntry *yystack; /* The parser's stack */ |
+ yyStackEntry yystk0; /* First stack entry */ |
#else |
yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */ |
#endif |
@@ -273,24 +276,34 @@ static const char *const yyRuleName[] = { |
#if YYSTACKDEPTH<=0 |
/* |
-** Try to increase the size of the parser stack. |
+** Try to increase the size of the parser stack. Return the number |
+** of errors. Return 0 on success. |
*/ |
-static void yyGrowStack(yyParser *p){ |
+static int yyGrowStack(yyParser *p){ |
int newSize; |
+ int idx; |
yyStackEntry *pNew; |
newSize = p->yystksz*2 + 100; |
- pNew = realloc(p->yystack, newSize*sizeof(pNew[0])); |
+ idx = p->yytos ? (int)(p->yytos - p->yystack) : 0; |
+ if( p->yystack==&p->yystk0 ){ |
+ pNew = malloc(newSize*sizeof(pNew[0])); |
+ if( pNew ) pNew[0] = p->yystk0; |
+ }else{ |
+ pNew = realloc(p->yystack, newSize*sizeof(pNew[0])); |
+ } |
if( pNew ){ |
p->yystack = pNew; |
- p->yystksz = newSize; |
+ p->yytos = &p->yystack[idx]; |
#ifndef NDEBUG |
if( yyTraceFILE ){ |
- fprintf(yyTraceFILE,"%sStack grows to %d entries!\n", |
- yyTracePrompt, p->yystksz); |
+ fprintf(yyTraceFILE,"%sStack grows from %d to %d entries.\n", |
+ yyTracePrompt, p->yystksz, newSize); |
} |
#endif |
+ p->yystksz = newSize; |
} |
+ return pNew==0; |
} |
#endif |
@@ -303,6 +316,31 @@ static void yyGrowStack(yyParser *p){ |
# define YYMALLOCARGTYPE size_t |
#endif |
+/* Initialize a new parser that has already been allocated. |
+*/ |
+void ParseInit(void *yypParser){ |
+ yyParser *pParser = (yyParser*)yypParser; |
+#ifdef YYTRACKMAXSTACKDEPTH |
+ pParser->yyhwm = 0; |
+#endif |
+#if YYSTACKDEPTH<=0 |
+ pParser->yytos = NULL; |
+ pParser->yystack = NULL; |
+ pParser->yystksz = 0; |
+ if( yyGrowStack(pParser) ){ |
+ pParser->yystack = &pParser->yystk0; |
+ pParser->yystksz = 1; |
+ } |
+#endif |
+#ifndef YYNOERRORRECOVERY |
+ pParser->yyerrcnt = -1; |
+#endif |
+ pParser->yytos = pParser->yystack; |
+ pParser->yystack[0].stateno = 0; |
+ pParser->yystack[0].major = 0; |
+} |
+ |
+#ifndef Parse_ENGINEALWAYSONSTACK |
/* |
** This function allocates a new parser. |
** The only argument is a pointer to a function which works like |
@@ -318,19 +356,11 @@ static void yyGrowStack(yyParser *p){ |
void *ParseAlloc(void *(*mallocProc)(YYMALLOCARGTYPE)){ |
yyParser *pParser; |
pParser = (yyParser*)(*mallocProc)( (YYMALLOCARGTYPE)sizeof(yyParser) ); |
- if( pParser ){ |
- pParser->yyidx = -1; |
-#ifdef YYTRACKMAXSTACKDEPTH |
- pParser->yyidxMax = 0; |
-#endif |
-#if YYSTACKDEPTH<=0 |
- pParser->yystack = NULL; |
- pParser->yystksz = 0; |
- yyGrowStack(pParser); |
-#endif |
- } |
+ if( pParser ) ParseInit(pParser); |
return pParser; |
} |
+#endif /* Parse_ENGINEALWAYSONSTACK */ |
+ |
/* The following function deletes the "minor type" or semantic value |
** associated with a symbol. The symbol can be either a terminal |
@@ -371,8 +401,9 @@ static void yy_destructor( |
*/ |
static void yy_pop_parser_stack(yyParser *pParser){ |
yyStackEntry *yytos; |
- assert( pParser->yyidx>=0 ); |
- yytos = &pParser->yystack[pParser->yyidx--]; |
+ assert( pParser->yytos!=0 ); |
+ assert( pParser->yytos > pParser->yystack ); |
+ yytos = pParser->yytos--; |
#ifndef NDEBUG |
if( yyTraceFILE ){ |
fprintf(yyTraceFILE,"%sPopping %s\n", |
@@ -383,6 +414,18 @@ static void yy_pop_parser_stack(yyParser *pParser){ |
yy_destructor(pParser, yytos->major, &yytos->minor); |
} |
+/* |
+** Clear all secondary memory allocations from the parser |
+*/ |
+void ParseFinalize(void *p){ |
+ yyParser *pParser = (yyParser*)p; |
+ while( pParser->yytos>pParser->yystack ) yy_pop_parser_stack(pParser); |
+#if YYSTACKDEPTH<=0 |
+ if( pParser->yystack!=&pParser->yystk0 ) free(pParser->yystack); |
+#endif |
+} |
+ |
+#ifndef Parse_ENGINEALWAYSONSTACK |
/* |
** Deallocate and destroy a parser. Destructors are called for |
** all stack elements before shutting the parser down. |
@@ -395,16 +438,13 @@ void ParseFree( |
void *p, /* The parser to be deleted */ |
void (*freeProc)(void*) /* Function used to reclaim memory */ |
){ |
- yyParser *pParser = (yyParser*)p; |
#ifndef YYPARSEFREENEVERNULL |
- if( pParser==0 ) return; |
-#endif |
- while( pParser->yyidx>=0 ) yy_pop_parser_stack(pParser); |
-#if YYSTACKDEPTH<=0 |
- free(pParser->yystack); |
+ if( p==0 ) return; |
#endif |
- (*freeProc)((void*)pParser); |
+ ParseFinalize(p); |
+ (*freeProc)(p); |
} |
+#endif /* Parse_ENGINEALWAYSONSTACK */ |
/* |
** Return the peak depth of the stack for a parser. |
@@ -412,7 +452,7 @@ void ParseFree( |
#ifdef YYTRACKMAXSTACKDEPTH |
int ParseStackPeak(void *p){ |
yyParser *pParser = (yyParser*)p; |
- return pParser->yyidxMax; |
+ return pParser->yyhwm; |
} |
#endif |
@@ -420,61 +460,58 @@ int ParseStackPeak(void *p){ |
** Find the appropriate action for a parser given the terminal |
** look-ahead token iLookAhead. |
*/ |
-static int yy_find_shift_action( |
+static unsigned int yy_find_shift_action( |
yyParser *pParser, /* The parser */ |
YYCODETYPE iLookAhead /* The look-ahead token */ |
){ |
int i; |
- int stateno = pParser->yystack[pParser->yyidx].stateno; |
+ int stateno = pParser->yytos->stateno; |
if( stateno>=YY_MIN_REDUCE ) return stateno; |
assert( stateno <= YY_SHIFT_COUNT ); |
do{ |
i = yy_shift_ofst[stateno]; |
- if( i==YY_SHIFT_USE_DFLT ) return yy_default[stateno]; |
assert( iLookAhead!=YYNOCODE ); |
i += iLookAhead; |
if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ |
- if( iLookAhead>0 ){ |
#ifdef YYFALLBACK |
- YYCODETYPE iFallback; /* Fallback token */ |
- if( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0]) |
- && (iFallback = yyFallback[iLookAhead])!=0 ){ |
+ YYCODETYPE iFallback; /* Fallback token */ |
+ if( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0]) |
+ && (iFallback = yyFallback[iLookAhead])!=0 ){ |
#ifndef NDEBUG |
- if( yyTraceFILE ){ |
- fprintf(yyTraceFILE, "%sFALLBACK %s => %s\n", |
- yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]); |
- } |
-#endif |
- assert( yyFallback[iFallback]==0 ); /* Fallback loop must terminate */ |
- iLookAhead = iFallback; |
- continue; |
+ if( yyTraceFILE ){ |
+ fprintf(yyTraceFILE, "%sFALLBACK %s => %s\n", |
+ yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]); |
} |
#endif |
+ assert( yyFallback[iFallback]==0 ); /* Fallback loop must terminate */ |
+ iLookAhead = iFallback; |
+ continue; |
+ } |
+#endif |
#ifdef YYWILDCARD |
- { |
- int j = i - iLookAhead + YYWILDCARD; |
- if( |
+ { |
+ int j = i - iLookAhead + YYWILDCARD; |
+ if( |
#if YY_SHIFT_MIN+YYWILDCARD<0 |
- j>=0 && |
+ j>=0 && |
#endif |
#if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT |
- j<YY_ACTTAB_COUNT && |
+ j<YY_ACTTAB_COUNT && |
#endif |
- yy_lookahead[j]==YYWILDCARD |
- ){ |
+ yy_lookahead[j]==YYWILDCARD && iLookAhead>0 |
+ ){ |
#ifndef NDEBUG |
- if( yyTraceFILE ){ |
- fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n", |
- yyTracePrompt, yyTokenName[iLookAhead], |
- yyTokenName[YYWILDCARD]); |
- } |
-#endif /* NDEBUG */ |
- return yy_action[j]; |
+ if( yyTraceFILE ){ |
+ fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n", |
+ yyTracePrompt, yyTokenName[iLookAhead], |
+ yyTokenName[YYWILDCARD]); |
} |
+#endif /* NDEBUG */ |
+ return yy_action[j]; |
} |
-#endif /* YYWILDCARD */ |
} |
+#endif /* YYWILDCARD */ |
return yy_default[stateno]; |
}else{ |
return yy_action[i]; |
@@ -516,15 +553,14 @@ static int yy_find_reduce_action( |
/* |
** The following routine is called if the stack overflows. |
*/ |
-static void yyStackOverflow(yyParser *yypParser, YYMINORTYPE *yypMinor){ |
+static void yyStackOverflow(yyParser *yypParser){ |
ParseARG_FETCH; |
- yypParser->yyidx--; |
#ifndef NDEBUG |
if( yyTraceFILE ){ |
fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt); |
} |
#endif |
- while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser); |
+ while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); |
/* Here code is inserted which will execute if the parser |
** stack every overflows */ |
/******** Begin %stack_overflow code ******************************************/ |
@@ -541,11 +577,11 @@ static void yyTraceShift(yyParser *yypParser, int yyNewState){ |
if( yyTraceFILE ){ |
if( yyNewState<YYNSTATE ){ |
fprintf(yyTraceFILE,"%sShift '%s', go to state %d\n", |
- yyTracePrompt,yyTokenName[yypParser->yystack[yypParser->yyidx].major], |
+ yyTracePrompt,yyTokenName[yypParser->yytos->major], |
yyNewState); |
}else{ |
fprintf(yyTraceFILE,"%sShift '%s'\n", |
- yyTracePrompt,yyTokenName[yypParser->yystack[yypParser->yyidx].major]); |
+ yyTracePrompt,yyTokenName[yypParser->yytos->major]); |
} |
} |
} |
@@ -560,33 +596,38 @@ static void yy_shift( |
yyParser *yypParser, /* The parser to be shifted */ |
int yyNewState, /* The new state to shift in */ |
int yyMajor, /* The major token to shift in */ |
- YYMINORTYPE *yypMinor /* Pointer to the minor token to shift in */ |
+ ParseTOKENTYPE yyMinor /* The minor token to shift in */ |
){ |
yyStackEntry *yytos; |
- yypParser->yyidx++; |
+ yypParser->yytos++; |
#ifdef YYTRACKMAXSTACKDEPTH |
- if( yypParser->yyidx>yypParser->yyidxMax ){ |
- yypParser->yyidxMax = yypParser->yyidx; |
+ if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ |
+ yypParser->yyhwm++; |
+ assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack) ); |
} |
#endif |
#if YYSTACKDEPTH>0 |
- if( yypParser->yyidx>=YYSTACKDEPTH ){ |
- yyStackOverflow(yypParser, yypMinor); |
+ if( yypParser->yytos>=&yypParser->yystack[YYSTACKDEPTH] ){ |
+ yypParser->yytos--; |
+ yyStackOverflow(yypParser); |
return; |
} |
#else |
- if( yypParser->yyidx>=yypParser->yystksz ){ |
- yyGrowStack(yypParser); |
- if( yypParser->yyidx>=yypParser->yystksz ){ |
- yyStackOverflow(yypParser, yypMinor); |
+ if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz] ){ |
+ if( yyGrowStack(yypParser) ){ |
+ yypParser->yytos--; |
+ yyStackOverflow(yypParser); |
return; |
} |
} |
#endif |
- yytos = &yypParser->yystack[yypParser->yyidx]; |
+ if( yyNewState > YY_MAX_SHIFT ){ |
+ yyNewState += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE; |
+ } |
+ yytos = yypParser->yytos; |
yytos->stateno = (YYACTIONTYPE)yyNewState; |
yytos->major = (YYCODETYPE)yyMajor; |
- yytos->minor = *yypMinor; |
+ yytos->minor.yy0 = yyMinor; |
yyTraceShift(yypParser, yyNewState); |
} |
@@ -608,24 +649,47 @@ static void yy_accept(yyParser*); /* Forward Declaration */ |
*/ |
static void yy_reduce( |
yyParser *yypParser, /* The parser */ |
- int yyruleno /* Number of the rule by which to reduce */ |
+ unsigned int yyruleno /* Number of the rule by which to reduce */ |
){ |
int yygoto; /* The next state */ |
int yyact; /* The next action */ |
- YYMINORTYPE yygotominor; /* The LHS of the rule reduced */ |
yyStackEntry *yymsp; /* The top of the parser's stack */ |
int yysize; /* Amount to pop the stack */ |
ParseARG_FETCH; |
- yymsp = &yypParser->yystack[yypParser->yyidx]; |
+ yymsp = yypParser->yytos; |
#ifndef NDEBUG |
- if( yyTraceFILE && yyruleno>=0 |
- && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){ |
+ if( yyTraceFILE && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){ |
yysize = yyRuleInfo[yyruleno].nrhs; |
fprintf(yyTraceFILE, "%sReduce [%s], go to state %d.\n", yyTracePrompt, |
yyRuleName[yyruleno], yymsp[-yysize].stateno); |
} |
#endif /* NDEBUG */ |
- yygotominor = yyzerominor; |
+ |
+ /* Check that the stack is large enough to grow by a single entry |
+ ** if the RHS of the rule is empty. This ensures that there is room |
+ ** enough on the stack to push the LHS value */ |
+ if( yyRuleInfo[yyruleno].nrhs==0 ){ |
+#ifdef YYTRACKMAXSTACKDEPTH |
+ if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ |
+ yypParser->yyhwm++; |
+ assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack)); |
+ } |
+#endif |
+#if YYSTACKDEPTH>0 |
+ if( yypParser->yytos>=&yypParser->yystack[YYSTACKDEPTH-1] ){ |
+ yyStackOverflow(yypParser); |
+ return; |
+ } |
+#else |
+ if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz-1] ){ |
+ if( yyGrowStack(yypParser) ){ |
+ yyStackOverflow(yypParser); |
+ return; |
+ } |
+ yymsp = yypParser->yytos; |
+ } |
+#endif |
+ } |
switch( yyruleno ){ |
/* Beginning here are the reduction cases. A typical example |
@@ -640,29 +704,22 @@ static void yy_reduce( |
%% |
/********** End reduce actions ************************************************/ |
}; |
- assert( yyruleno>=0 && yyruleno<sizeof(yyRuleInfo)/sizeof(yyRuleInfo[0]) ); |
+ assert( yyruleno<sizeof(yyRuleInfo)/sizeof(yyRuleInfo[0]) ); |
yygoto = yyRuleInfo[yyruleno].lhs; |
yysize = yyRuleInfo[yyruleno].nrhs; |
- yypParser->yyidx -= yysize; |
yyact = yy_find_reduce_action(yymsp[-yysize].stateno,(YYCODETYPE)yygoto); |
if( yyact <= YY_MAX_SHIFTREDUCE ){ |
- if( yyact>YY_MAX_SHIFT ) yyact += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE; |
- /* If the reduce action popped at least |
- ** one element off the stack, then we can push the new element back |
- ** onto the stack here, and skip the stack overflow test in yy_shift(). |
- ** That gives a significant speed improvement. */ |
- if( yysize ){ |
- yypParser->yyidx++; |
- yymsp -= yysize-1; |
- yymsp->stateno = (YYACTIONTYPE)yyact; |
- yymsp->major = (YYCODETYPE)yygoto; |
- yymsp->minor = yygotominor; |
- yyTraceShift(yypParser, yyact); |
- }else{ |
- yy_shift(yypParser,yyact,yygoto,&yygotominor); |
+ if( yyact>YY_MAX_SHIFT ){ |
+ yyact += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE; |
} |
+ yymsp -= yysize-1; |
+ yypParser->yytos = yymsp; |
+ yymsp->stateno = (YYACTIONTYPE)yyact; |
+ yymsp->major = (YYCODETYPE)yygoto; |
+ yyTraceShift(yypParser, yyact); |
}else{ |
assert( yyact == YY_ACCEPT_ACTION ); |
+ yypParser->yytos -= yysize; |
yy_accept(yypParser); |
} |
} |
@@ -680,7 +737,7 @@ static void yy_parse_failed( |
fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt); |
} |
#endif |
- while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser); |
+ while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); |
/* Here code is inserted which will be executed whenever the |
** parser fails */ |
/************ Begin %parse_failure code ***************************************/ |
@@ -696,10 +753,10 @@ static void yy_parse_failed( |
static void yy_syntax_error( |
yyParser *yypParser, /* The parser */ |
int yymajor, /* The major type of the error token */ |
- YYMINORTYPE yyminor /* The minor type of the error token */ |
+ ParseTOKENTYPE yyminor /* The minor type of the error token */ |
){ |
ParseARG_FETCH; |
-#define TOKEN (yyminor.yy0) |
+#define TOKEN yyminor |
/************ Begin %syntax_error code ****************************************/ |
%% |
/************ End %syntax_error code ******************************************/ |
@@ -718,7 +775,10 @@ static void yy_accept( |
fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt); |
} |
#endif |
- while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser); |
+#ifndef YYNOERRORRECOVERY |
+ yypParser->yyerrcnt = -1; |
+#endif |
+ assert( yypParser->yytos==yypParser->yystack ); |
/* Here code is inserted which will be executed whenever the |
** parser accepts */ |
/*********** Begin %parse_accept code *****************************************/ |
@@ -753,7 +813,7 @@ void Parse( |
ParseARG_PDECL /* Optional %extra_argument parameter */ |
){ |
YYMINORTYPE yyminorunion; |
- int yyact; /* The parser action. */ |
+ unsigned int yyact; /* The parser action. */ |
#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) |
int yyendofinput; /* True if we are at the end of input */ |
#endif |
@@ -762,29 +822,8 @@ void Parse( |
#endif |
yyParser *yypParser; /* The parser */ |
- /* (re)initialize the parser, if necessary */ |
yypParser = (yyParser*)yyp; |
- if( yypParser->yyidx<0 ){ |
-#if YYSTACKDEPTH<=0 |
- if( yypParser->yystksz <=0 ){ |
- /*memset(&yyminorunion, 0, sizeof(yyminorunion));*/ |
- yyminorunion = yyzerominor; |
- yyStackOverflow(yypParser, &yyminorunion); |
- return; |
- } |
-#endif |
- yypParser->yyidx = 0; |
- yypParser->yyerrcnt = -1; |
- yypParser->yystack[0].stateno = 0; |
- yypParser->yystack[0].major = 0; |
-#ifndef NDEBUG |
- if( yyTraceFILE ){ |
- fprintf(yyTraceFILE,"%sInitialize. Empty stack. State 0\n", |
- yyTracePrompt); |
- } |
-#endif |
- } |
- yyminorunion.yy0 = yyminor; |
+ assert( yypParser->yytos!=0 ); |
#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) |
yyendofinput = (yymajor==0); |
#endif |
@@ -799,14 +838,16 @@ void Parse( |
do{ |
yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor); |
if( yyact <= YY_MAX_SHIFTREDUCE ){ |
- if( yyact > YY_MAX_SHIFT ) yyact += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE; |
- yy_shift(yypParser,yyact,yymajor,&yyminorunion); |
+ yy_shift(yypParser,yyact,yymajor,yyminor); |
+#ifndef YYNOERRORRECOVERY |
yypParser->yyerrcnt--; |
+#endif |
yymajor = YYNOCODE; |
}else if( yyact <= YY_MAX_REDUCE ){ |
yy_reduce(yypParser,yyact-YY_MIN_REDUCE); |
}else{ |
assert( yyact == YY_ERROR_ACTION ); |
+ yyminorunion.yy0 = yyminor; |
#ifdef YYERRORSYMBOL |
int yymx; |
#endif |
@@ -836,9 +877,9 @@ void Parse( |
** |
*/ |
if( yypParser->yyerrcnt<0 ){ |
- yy_syntax_error(yypParser,yymajor,yyminorunion); |
+ yy_syntax_error(yypParser,yymajor,yyminor); |
} |
- yymx = yypParser->yystack[yypParser->yyidx].major; |
+ yymx = yypParser->yytos->major; |
if( yymx==YYERRORSYMBOL || yyerrorhit ){ |
#ifndef NDEBUG |
if( yyTraceFILE ){ |
@@ -846,26 +887,26 @@ void Parse( |
yyTracePrompt,yyTokenName[yymajor]); |
} |
#endif |
- yy_destructor(yypParser, (YYCODETYPE)yymajor,&yyminorunion); |
+ yy_destructor(yypParser, (YYCODETYPE)yymajor, &yyminorunion); |
yymajor = YYNOCODE; |
}else{ |
- while( |
- yypParser->yyidx >= 0 && |
- yymx != YYERRORSYMBOL && |
- (yyact = yy_find_reduce_action( |
- yypParser->yystack[yypParser->yyidx].stateno, |
+ while( yypParser->yytos >= yypParser->yystack |
+ && yymx != YYERRORSYMBOL |
+ && (yyact = yy_find_reduce_action( |
+ yypParser->yytos->stateno, |
YYERRORSYMBOL)) >= YY_MIN_REDUCE |
){ |
yy_pop_parser_stack(yypParser); |
} |
- if( yypParser->yyidx < 0 || yymajor==0 ){ |
+ if( yypParser->yytos < yypParser->yystack || yymajor==0 ){ |
yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); |
yy_parse_failed(yypParser); |
+#ifndef YYNOERRORRECOVERY |
+ yypParser->yyerrcnt = -1; |
+#endif |
yymajor = YYNOCODE; |
}else if( yymx!=YYERRORSYMBOL ){ |
- YYMINORTYPE u2; |
- u2.YYERRSYMDT = 0; |
- yy_shift(yypParser,yyact,YYERRORSYMBOL,&u2); |
+ yy_shift(yypParser,yyact,YYERRORSYMBOL,yyminor); |
} |
} |
yypParser->yyerrcnt = 3; |
@@ -878,7 +919,7 @@ void Parse( |
** Applications can set this macro (for example inside %include) if |
** they intend to abandon the parse upon the first syntax error seen. |
*/ |
- yy_syntax_error(yypParser,yymajor,yyminorunion); |
+ yy_syntax_error(yypParser,yymajor, yyminor); |
yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); |
yymajor = YYNOCODE; |
@@ -893,24 +934,29 @@ void Parse( |
** three input tokens have been successfully shifted. |
*/ |
if( yypParser->yyerrcnt<=0 ){ |
- yy_syntax_error(yypParser,yymajor,yyminorunion); |
+ yy_syntax_error(yypParser,yymajor, yyminor); |
} |
yypParser->yyerrcnt = 3; |
yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); |
if( yyendofinput ){ |
yy_parse_failed(yypParser); |
+#ifndef YYNOERRORRECOVERY |
+ yypParser->yyerrcnt = -1; |
+#endif |
} |
yymajor = YYNOCODE; |
#endif |
} |
- }while( yymajor!=YYNOCODE && yypParser->yyidx>=0 ); |
+ }while( yymajor!=YYNOCODE && yypParser->yytos>yypParser->yystack ); |
#ifndef NDEBUG |
if( yyTraceFILE ){ |
- int i; |
+ yyStackEntry *i; |
+ char cDiv = '['; |
fprintf(yyTraceFILE,"%sReturn. Stack=",yyTracePrompt); |
- for(i=1; i<=yypParser->yyidx; i++) |
- fprintf(yyTraceFILE,"%c%s", i==1 ? '[' : ' ', |
- yyTokenName[yypParser->yystack[i].major]); |
+ for(i=&yypParser->yystack[1]; i<=yypParser->yytos; i++){ |
+ fprintf(yyTraceFILE,"%c%s", cDiv, yyTokenName[i->major]); |
+ cDiv = ' '; |
+ } |
fprintf(yyTraceFILE,"]\n"); |
} |
#endif |