Annotation of embedaddon/lighttpd/src/lempar.c, revision 1.1.1.2
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 include which follows the "include" declaration
5: ** in the input file. */
1.1.1.2 ! misho 6: #include "first.h"
1.1 misho 7: #include <stdio.h>
8: %%
9: /* Next is all token values, in a form suitable for use by makeheaders.
10: ** This section will be null unless lemon is run with the -m switch.
11: */
12: /*
13: ** These constants (all generated automatically by the parser generator)
14: ** specify the various kinds of tokens (terminals) that the parser
15: ** understands.
16: **
17: ** Each symbol here is a terminal symbol in the grammar.
18: */
19: %%
20: /* Make sure the INTERFACE macro is defined.
21: */
22: #ifndef INTERFACE
23: # define INTERFACE 1
24: #endif
25: /* The next thing included is series of defines which control
26: ** various aspects of the generated parser.
27: ** YYCODETYPE is the data type used for storing terminal
28: ** and nonterminal numbers. "unsigned char" is
29: ** used if there are fewer than 250 terminals
30: ** and nonterminals. "int" is used otherwise.
31: ** YYNOCODE is a number of type YYCODETYPE which corresponds
32: ** to no legal terminal or nonterminal number. This
33: ** number is used to fill in empty slots of the hash
34: ** table.
35: ** YYFALLBACK If defined, this indicates that one or more tokens
36: ** have fall-back values which should be used if the
37: ** original value of the token will not parse.
38: ** YYACTIONTYPE is the data type used for storing terminal
39: ** and nonterminal numbers. "unsigned char" is
40: ** used if there are fewer than 250 rules and
41: ** states combined. "int" is used otherwise.
42: ** ParseTOKENTYPE is the data type used for minor tokens given
43: ** directly to the parser from the tokenizer.
44: ** YYMINORTYPE is the data type used for all minor tokens.
45: ** This is typically a union of many types, one of
46: ** which is ParseTOKENTYPE. The entry in the union
47: ** for base tokens is called "yy0".
48: ** YYSTACKDEPTH is the maximum depth of the parser's stack.
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: /* Next are that tables used to determine what action to take based on the
64: ** current state and lookahead token. These tables are used to implement
65: ** functions that take a state number and lookahead value and return an
66: ** action integer.
67: **
68: ** Suppose the action integer is N. Then the action is determined as
69: ** follows
70: **
71: ** 0 <= N < YYNSTATE Shift N. That is, push the lookahead
72: ** token onto the stack and goto state N.
73: **
74: ** YYNSTATE <= N < YYNSTATE+YYNRULE Reduce by rule N-YYNSTATE.
75: **
76: ** N == YYNSTATE+YYNRULE A syntax error has occurred.
77: **
78: ** N == YYNSTATE+YYNRULE+1 The parser accepts its input.
79: **
80: ** N == YYNSTATE+YYNRULE+2 No such action. Denotes unused
81: ** slots in the yy_action[] table.
82: **
83: ** The action table is constructed as a single large table named yy_action[].
84: ** Given state S and lookahead X, the action is computed as
85: **
86: ** yy_action[ yy_shift_ofst[S] + X ]
87: **
88: ** If the index value yy_shift_ofst[S]+X is out of range or if the value
89: ** yy_lookahead[yy_shift_ofst[S]+X] is not equal to X or if yy_shift_ofst[S]
90: ** is equal to YY_SHIFT_USE_DFLT, it means that the action is not in the table
91: ** and that yy_default[S] should be used instead.
92: **
93: ** The formula above is for computing the action when the lookahead is
94: ** a terminal symbol. If the lookahead is a non-terminal (as occurs after
95: ** a reduce action) then the yy_reduce_ofst[] array is used in place of
96: ** the yy_shift_ofst[] array and YY_REDUCE_USE_DFLT is used in place of
97: ** YY_SHIFT_USE_DFLT.
98: **
99: ** The following are the tables generated in this section:
100: **
101: ** yy_action[] A single table containing all actions.
102: ** yy_lookahead[] A table containing the lookahead for each entry in
103: ** yy_action. Used to detect hash collisions.
104: ** yy_shift_ofst[] For each state, the offset into yy_action for
105: ** shifting terminals.
106: ** yy_reduce_ofst[] For each state, the offset into yy_action for
107: ** shifting non-terminals after a reduce.
108: ** yy_default[] Default action for each state.
109: */
110: %%
111: #define YY_SZ_ACTTAB (sizeof(yy_action)/sizeof(yy_action[0]))
112:
113: /* The next table maps tokens into fallback tokens. If a construct
114: ** like the following:
115: **
116: ** %fallback ID X Y Z.
117: **
118: ** appears in the grammer, then ID becomes a fallback token for X, Y,
119: ** and Z. Whenever one of the tokens X, Y, or Z is input to the parser
120: ** but it does not parse, the type of the token is changed to ID and
121: ** the parse is retried before an error is thrown.
122: */
123: #ifdef YYFALLBACK
124: static const YYCODETYPE yyFallback[] = {
125: %%
126: };
127: #endif /* YYFALLBACK */
128:
129: /* The following structure represents a single element of the
130: ** parser's stack. Information stored includes:
131: **
132: ** + The state number for the parser at this level of the stack.
133: **
134: ** + The value of the token stored at this level of the stack.
135: ** (In other words, the "major" token.)
136: **
137: ** + The semantic value stored at this level of the stack. This is
138: ** the information used by the action routines in the grammar.
139: ** It is sometimes called the "minor" token.
140: */
141: struct yyStackEntry {
142: int stateno; /* The state-number */
143: int major; /* The major token value. This is the code
144: ** number for the token at this stack level */
145: YYMINORTYPE minor; /* The user-supplied minor token value. This
146: ** is the value of the token */
147: };
148: typedef struct yyStackEntry yyStackEntry;
149:
150: /* The state of the parser is completely contained in an instance of
151: ** the following structure */
152: struct yyParser {
153: int yyidx; /* Index of top element in stack */
154: int yyerrcnt; /* Shifts left before out of the error */
155: ParseARG_SDECL /* A place to hold %extra_argument */
156: yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */
157: };
158: typedef struct yyParser yyParser;
159:
160: #ifndef NDEBUG
161: #include <stdio.h>
162: static FILE *yyTraceFILE = NULL;
163: static char *yyTracePrompt = NULL;
164: #endif /* NDEBUG */
165:
166: #ifndef NDEBUG
167: /*
168: ** Turn parser tracing on by giving a stream to which to write the trace
169: ** and a prompt to preface each trace message. Tracing is turned off
170: ** by making either argument NULL
171: **
172: ** Inputs:
173: ** <ul>
174: ** <li> A FILE* to which trace output should be written.
175: ** If NULL, then tracing is turned off.
176: ** <li> A prefix string written at the beginning of every
177: ** line of trace output. If NULL, then tracing is
178: ** turned off.
179: ** </ul>
180: **
181: ** Outputs:
182: ** None.
183: */
184: #if 0
185: void ParseTrace(FILE *TraceFILE, char *zTracePrompt){
186: yyTraceFILE = TraceFILE;
187: yyTracePrompt = zTracePrompt;
188: if( yyTraceFILE==0 ) yyTracePrompt = 0;
189: else if( yyTracePrompt==0 ) yyTraceFILE = 0;
190: }
191: #endif
192: #endif /* NDEBUG */
193:
194: #ifndef NDEBUG
195: /* For tracing shifts, the names of all terminals and nonterminals
196: ** are required. The following table supplies these names */
197: static const char *yyTokenName[] = {
198: %%
199: };
200: #endif /* NDEBUG */
201:
202: #ifndef NDEBUG
203: /* For tracing reduce actions, the names of all rules are required.
204: */
205: static const char *yyRuleName[] = {
206: %%
207: };
208: #endif /* NDEBUG */
209:
210: /*
211: ** This function returns the symbolic name associated with a token
212: ** value.
213: */
214: #if 0
215: const char *ParseTokenName(int tokenType){
216: #ifndef NDEBUG
217: if( tokenType>0 && (size_t)tokenType<(sizeof(yyTokenName)/sizeof(yyTokenName[0])) ){
218: return yyTokenName[tokenType];
219: }else{
220: return "Unknown";
221: }
222: #else
223: return "";
224: #endif
225: }
226: #endif
227:
228: /*
229: ** This function allocates a new parser.
230: ** The only argument is a pointer to a function which works like
231: ** malloc.
232: **
233: ** Inputs:
234: ** A pointer to the function used to allocate memory.
235: **
236: ** Outputs:
237: ** A pointer to a parser. This pointer is used in subsequent calls
238: ** to Parse and ParseFree.
239: */
240: void *ParseAlloc(void *(*mallocProc)(size_t)){
241: yyParser *pParser;
242: pParser = (yyParser*)(*mallocProc)( (size_t)sizeof(yyParser) );
243: if( pParser ){
244: pParser->yyidx = -1;
245: }
246: return pParser;
247: }
248:
249: /* The following function deletes the value associated with a
250: ** symbol. The symbol can be either a terminal or nonterminal.
251: ** "yymajor" is the symbol code, and "yypminor" is a pointer to
252: ** the value.
253: */
254: static void yy_destructor(YYCODETYPE yymajor, YYMINORTYPE *yypminor){
255: switch( yymajor ){
256: /* Here is inserted the actions which take place when a
257: ** terminal or non-terminal is destroyed. This can happen
258: ** when the symbol is popped from the stack during a
259: ** reduce or during error processing or when a parser is
260: ** being destroyed before it is finished parsing.
261: **
262: ** Note: during a reduce, the only symbols destroyed are those
263: ** which appear on the RHS of the rule, but which are not used
264: ** inside the C code.
265: */
266: %%
267: default: break; /* If no destructor action specified: do nothing */
268: }
269: }
270:
271: /*
272: ** Pop the parser's stack once.
273: **
274: ** If there is a destructor routine associated with the token which
275: ** is popped from the stack, then call it.
276: **
277: ** Return the major token number for the symbol popped.
278: */
279: static int yy_pop_parser_stack(yyParser *pParser){
280: YYCODETYPE yymajor;
1.1.1.2 ! misho 281: yyStackEntry *yytos;
1.1 misho 282:
283: if( pParser->yyidx<0 ) return 0;
1.1.1.2 ! misho 284: yytos = &pParser->yystack[pParser->yyidx];
1.1 misho 285: #ifndef NDEBUG
286: if( yyTraceFILE && pParser->yyidx>=0 ){
287: fprintf(yyTraceFILE,"%sPopping %s\n",
288: yyTracePrompt,
289: yyTokenName[yytos->major]);
290: }
291: #endif
292: yymajor = yytos->major;
293: yy_destructor( yymajor, &yytos->minor);
294: pParser->yyidx--;
295: return yymajor;
296: }
297:
298: /*
299: ** Deallocate and destroy a parser. Destructors are all called for
300: ** all stack elements before shutting the parser down.
301: **
302: ** Inputs:
303: ** <ul>
304: ** <li> A pointer to the parser. This should be a pointer
305: ** obtained from ParseAlloc.
306: ** <li> A pointer to a function used to reclaim memory obtained
307: ** from malloc.
308: ** </ul>
309: */
310: void ParseFree(
311: void *p, /* The parser to be deleted */
312: void (*freeProc)(void*) /* Function used to reclaim memory */
313: ){
314: yyParser *pParser = (yyParser*)p;
315: if( pParser==NULL ) return;
316: while( pParser->yyidx>=0 ) yy_pop_parser_stack(pParser);
317: (*freeProc)((void*)pParser);
318: }
319:
320: /*
321: ** Find the appropriate action for a parser given the terminal
322: ** look-ahead token iLookAhead.
323: **
324: ** If the look-ahead token is YYNOCODE, then check to see if the action is
325: ** independent of the look-ahead. If it is, return the action, otherwise
326: ** return YY_NO_ACTION.
327: */
328: static int yy_find_shift_action(
329: yyParser *pParser, /* The parser */
330: int iLookAhead /* The look-ahead token */
331: ){
332: int i;
333: int stateno = pParser->yystack[pParser->yyidx].stateno;
334:
335: /* if( pParser->yyidx<0 ) return YY_NO_ACTION; */
336: i = yy_shift_ofst[stateno];
337: if( i==YY_SHIFT_USE_DFLT ){
338: return yy_default[stateno];
339: }
340: if( iLookAhead==YYNOCODE ){
341: return YY_NO_ACTION;
342: }
343: i += iLookAhead;
344: if( i<0 || (size_t)i>=YY_SZ_ACTTAB || yy_lookahead[i]!=iLookAhead ){
345: #ifdef YYFALLBACK
346: int iFallback; /* Fallback token */
347: if( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0])
348: && (iFallback = yyFallback[iLookAhead])!=0 ){
349: #ifndef NDEBUG
350: if( yyTraceFILE ){
351: fprintf(yyTraceFILE, "%sFALLBACK %s => %s\n",
352: yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]);
353: }
354: #endif
355: return yy_find_shift_action(pParser, iFallback);
356: }
357: #endif
358: return yy_default[stateno];
359: }else{
360: return yy_action[i];
361: }
362: }
363:
364: /*
365: ** Find the appropriate action for a parser given the non-terminal
366: ** look-ahead token iLookAhead.
367: **
368: ** If the look-ahead token is YYNOCODE, then check to see if the action is
369: ** independent of the look-ahead. If it is, return the action, otherwise
370: ** return YY_NO_ACTION.
371: */
372: static int yy_find_reduce_action(
373: yyParser *pParser, /* The parser */
374: int iLookAhead /* The look-ahead token */
375: ){
376: int i;
377: int stateno = pParser->yystack[pParser->yyidx].stateno;
378:
379: i = yy_reduce_ofst[stateno];
380: if( i==YY_REDUCE_USE_DFLT ){
381: return yy_default[stateno];
382: }
383: if( iLookAhead==YYNOCODE ){
384: return YY_NO_ACTION;
385: }
386: i += iLookAhead;
387: if( i<0 || (size_t)i>=YY_SZ_ACTTAB || yy_lookahead[i]!=iLookAhead ){
388: return yy_default[stateno];
389: }else{
390: return yy_action[i];
391: }
392: }
393:
394: /*
395: ** Perform a shift action.
396: */
397: static void yy_shift(
398: yyParser *yypParser, /* The parser to be shifted */
399: int yyNewState, /* The new state to shift in */
400: int yyMajor, /* The major token to shift in */
401: YYMINORTYPE *yypMinor /* Pointer ot the minor token to shift in */
402: ){
403: yyStackEntry *yytos;
404: yypParser->yyidx++;
405: if( yypParser->yyidx>=YYSTACKDEPTH ){
406: ParseARG_FETCH;
407: yypParser->yyidx--;
408: #ifndef NDEBUG
409: if( yyTraceFILE ){
410: fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt);
411: }
412: #endif
413: while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser);
414: /* Here code is inserted which will execute if the parser
415: ** stack every overflows */
416: %%
417: ParseARG_STORE; /* Suppress warning about unused %extra_argument var */
418: return;
419: }
420: yytos = &yypParser->yystack[yypParser->yyidx];
421: yytos->stateno = yyNewState;
422: yytos->major = yyMajor;
423: yytos->minor = *yypMinor;
424: #ifndef NDEBUG
425: if( yyTraceFILE && yypParser->yyidx>0 ){
426: int i;
427: fprintf(yyTraceFILE,"%sShift %d\n",yyTracePrompt,yyNewState);
428: fprintf(yyTraceFILE,"%sStack:",yyTracePrompt);
429: for(i=1; i<=yypParser->yyidx; i++)
430: fprintf(yyTraceFILE," %s",yyTokenName[yypParser->yystack[i].major]);
431: fprintf(yyTraceFILE,"\n");
432: }
433: #endif
434: }
435:
436: /* The following table contains information about every rule that
437: ** is used during the reduce.
438: */
439: static struct {
440: YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */
441: unsigned char nrhs; /* Number of right-hand side symbols in the rule */
442: } yyRuleInfo[] = {
443: %%
444: };
445:
446: static void yy_accept(yyParser*); /* Forward Declaration */
447:
448: /*
449: ** Perform a reduce action and the shift that must immediately
450: ** follow the reduce.
451: */
452: static void yy_reduce(
453: yyParser *yypParser, /* The parser */
454: int yyruleno /* Number of the rule by which to reduce */
455: ){
456: int yygoto; /* The next state */
457: int yyact; /* The next action */
458: YYMINORTYPE yygotominor; /* The LHS of the rule reduced */
459: yyStackEntry *yymsp; /* The top of the parser's stack */
460: int yysize; /* Amount to pop the stack */
461: ParseARG_FETCH;
462: yymsp = &yypParser->yystack[yypParser->yyidx];
463: #ifndef NDEBUG
1.1.1.2 ! misho 464: if( yyTraceFILE ) {
! 465: if (yyruleno>=0
1.1 misho 466: && (size_t)yyruleno<sizeof(yyRuleName)/sizeof(yyRuleName[0]) ){
1.1.1.2 ! misho 467: fprintf(yyTraceFILE, "%sReduce [%s].\n", yyTracePrompt,
! 468: yyRuleName[yyruleno]);
! 469: } else {
! 470: return; /*(should not happen)*/
! 471: }
1.1 misho 472: }
473: #endif /* NDEBUG */
474:
475: switch( yyruleno ){
476: /* Beginning here are the reduction cases. A typical example
477: ** follows:
478: ** case 0:
479: ** #line <lineno> <grammarfile>
480: ** { ... } // User supplied code
481: ** #line <lineno> <thisfile>
482: ** break;
483: */
484: %%
485: };
486: yygoto = yyRuleInfo[yyruleno].lhs;
487: yysize = yyRuleInfo[yyruleno].nrhs;
488: yypParser->yyidx -= yysize;
489: yyact = yy_find_reduce_action(yypParser,yygoto);
490: if( yyact < YYNSTATE ){
491: yy_shift(yypParser,yyact,yygoto,&yygotominor);
492: }else if( yyact == YYNSTATE + YYNRULE + 1 ){
493: yy_accept(yypParser);
494: }
495: }
496:
497: /*
498: ** The following code executes when the parse fails
499: */
500: static void yy_parse_failed(
501: yyParser *yypParser /* The parser */
502: ){
503: ParseARG_FETCH;
504: #ifndef NDEBUG
505: if( yyTraceFILE ){
506: fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt);
507: }
508: #endif
509: while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser);
510: /* Here code is inserted which will be executed whenever the
511: ** parser fails */
512: %%
513: ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */
514: }
515:
516: /*
517: ** The following code executes when a syntax error first occurs.
518: */
519: static void yy_syntax_error(
520: yyParser *yypParser, /* The parser */
521: int yymajor, /* The major type of the error token */
522: YYMINORTYPE yyminor /* The minor type of the error token */
523: ){
524: ParseARG_FETCH;
525: UNUSED(yymajor);
526: UNUSED(yyminor);
527: #define TOKEN (yyminor.yy0)
528: %%
529: ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */
530: }
531:
532: /*
533: ** The following is executed when the parser accepts
534: */
535: static void yy_accept(
536: yyParser *yypParser /* The parser */
537: ){
538: ParseARG_FETCH;
539: #ifndef NDEBUG
540: if( yyTraceFILE ){
541: fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt);
542: }
543: #endif
544: while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser);
545: /* Here code is inserted which will be executed whenever the
546: ** parser accepts */
547: %%
548: ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */
549: }
550:
551: /* The main parser program.
552: ** The first argument is a pointer to a structure obtained from
553: ** "ParseAlloc" which describes the current state of the parser.
554: ** The second argument is the major token number. The third is
555: ** the minor token. The fourth optional argument is whatever the
556: ** user wants (and specified in the grammar) and is available for
557: ** use by the action routines.
558: **
559: ** Inputs:
560: ** <ul>
561: ** <li> A pointer to the parser (an opaque structure.)
562: ** <li> The major token number.
563: ** <li> The minor token number.
564: ** <li> An option argument of a grammar-specified type.
565: ** </ul>
566: **
567: ** Outputs:
568: ** None.
569: */
570: void Parse(
571: void *yyp, /* The parser */
572: int yymajor, /* The major token code number */
573: ParseTOKENTYPE yyminor /* The value for the token */
574: ParseARG_PDECL /* Optional %extra_argument parameter */
575: ){
576: YYMINORTYPE yyminorunion;
577: int yyact; /* The parser action. */
578: int yyendofinput; /* True if we are at the end of input */
579: int yyerrorhit = 0; /* True if yymajor has invoked an error */
580: yyParser *yypParser; /* The parser */
581:
582: /* (re)initialize the parser, if necessary */
583: yypParser = (yyParser*)yyp;
584: if( yypParser->yyidx<0 ){
585: if( yymajor==0 ) return;
586: yypParser->yyidx = 0;
587: yypParser->yyerrcnt = -1;
588: yypParser->yystack[0].stateno = 0;
589: yypParser->yystack[0].major = 0;
590: }
591: yyminorunion.yy0 = yyminor;
592: yyendofinput = (yymajor==0);
593: ParseARG_STORE;
594:
595: #ifndef NDEBUG
596: if( yyTraceFILE ){
597: fprintf(yyTraceFILE,"%sInput %s\n",yyTracePrompt,yyTokenName[yymajor]);
598: }
599: #endif
600:
601: do{
602: yyact = yy_find_shift_action(yypParser,yymajor);
603: if( yyact<YYNSTATE ){
604: yy_shift(yypParser,yyact,yymajor,&yyminorunion);
605: yypParser->yyerrcnt--;
606: if( yyendofinput && yypParser->yyidx>=0 ){
607: yymajor = 0;
608: }else{
609: yymajor = YYNOCODE;
610: }
611: }else if( yyact < YYNSTATE + YYNRULE ){
612: yy_reduce(yypParser,yyact-YYNSTATE);
613: }else if( yyact == YY_ERROR_ACTION ){
614: int yymx;
615: #ifndef NDEBUG
616: if( yyTraceFILE ){
617: fprintf(yyTraceFILE,"%sSyntax Error!\n",yyTracePrompt);
618: }
619: #endif
620: #ifdef YYERRORSYMBOL
621: /* A syntax error has occurred.
622: ** The response to an error depends upon whether or not the
623: ** grammar defines an error token "ERROR".
624: **
625: ** This is what we do if the grammar does define ERROR:
626: **
627: ** * Call the %syntax_error function.
628: **
629: ** * Begin popping the stack until we enter a state where
630: ** it is legal to shift the error symbol, then shift
631: ** the error symbol.
632: **
633: ** * Set the error count to three.
634: **
635: ** * Begin accepting and shifting new tokens. No new error
636: ** processing will occur until three tokens have been
637: ** shifted successfully.
638: **
639: */
640: if( yypParser->yyerrcnt<0 ){
641: yy_syntax_error(yypParser,yymajor,yyminorunion);
642: }
643: yymx = yypParser->yystack[yypParser->yyidx].major;
644: if( yymx==YYERRORSYMBOL || yyerrorhit ){
645: #ifndef NDEBUG
646: if( yyTraceFILE ){
647: fprintf(yyTraceFILE,"%sDiscard input token %s\n",
648: yyTracePrompt,yyTokenName[yymajor]);
649: }
650: #endif
651: yy_destructor(yymajor,&yyminorunion);
652: yymajor = YYNOCODE;
653: }else{
654: while(
655: yypParser->yyidx >= 0 &&
656: yymx != YYERRORSYMBOL &&
657: (yyact = yy_find_shift_action(yypParser,YYERRORSYMBOL)) >= YYNSTATE
658: ){
659: yy_pop_parser_stack(yypParser);
660: }
661: if( yypParser->yyidx < 0 || yymajor==0 ){
662: yy_destructor(yymajor,&yyminorunion);
663: yy_parse_failed(yypParser);
664: yymajor = YYNOCODE;
665: }else if( yymx!=YYERRORSYMBOL ){
666: YYMINORTYPE u2;
667: u2.YYERRSYMDT = 0;
668: yy_shift(yypParser,yyact,YYERRORSYMBOL,&u2);
669: }
670: }
671: yypParser->yyerrcnt = 3;
672: yyerrorhit = 1;
673: #else /* YYERRORSYMBOL is not defined */
674: /* This is what we do if the grammar does not define ERROR:
675: **
676: ** * Report an error message, and throw away the input token.
677: **
678: ** * If the input token is $, then fail the parse.
679: **
680: ** As before, subsequent error messages are suppressed until
681: ** three input tokens have been successfully shifted.
682: */
683: if( yypParser->yyerrcnt<=0 ){
684: yy_syntax_error(yypParser,yymajor,yyminorunion);
685: }
686: yypParser->yyerrcnt = 3;
687: yy_destructor(yymajor,&yyminorunion);
688: if( yyendofinput ){
689: yy_parse_failed(yypParser);
690: }
691: yymajor = YYNOCODE;
692: #endif
693: }else{
694: yy_accept(yypParser);
695: yymajor = YYNOCODE;
696: }
697: }while( yymajor!=YYNOCODE && yypParser->yyidx>=0 );
698: return;
699: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>