lempar.c

来自「在VC6环境下开发」· C语言 代码 · 共 426 行

C
426
字号
%%
%%#ifndef INTERFACE#define INTERFACE 1#endif%%#define YY_NO_ACTION      (YYNSTATE+YYNRULE+2)#define YY_ACCEPT_ACTION  (YYNSTATE+YYNRULE+1)#define YY_ERROR_ACTION   (YYNSTATE+YYNRULE)%%#define YY_SZ_ACTTAB (sizeof(yy_action)/sizeof(yy_action[0]))#ifdef YYFALLBACKstatic const yyCode yyFallback[] = {%%};#endif /* YYFALLBACK */struct yyStackEntry {  int stateno;       	/* The state-number */  int major;         	/* The major token value. */  yyMinor minor; 	/* The user-supplied minor token value*/};typedef struct yyStackEntry yyStackEntry;struct yyParser {  int yyidx;                    /* Index of top element in stack */  int yyerrcnt;                 /* Shifts left before out of the error */  ParseARG_SDECL;               /* A place to hold %extra_argument */  yyStackEntry yystack[YYSTACKDEPTH];  /* The parser's stack */};typedef struct yyParser yyParser;#ifndef NDEBUG#include <stdio.h>static FILE *yyTraceFILE = 0;static char *yyTracePrompt = 0;#endif /* NDEBUG */#ifndef NDEBUGvoid ParseTrace(FILE *TraceFILE, char *zTracePrompt){  yyTraceFILE = TraceFILE;  yyTracePrompt = zTracePrompt;  if( yyTraceFILE==0 ) yyTracePrompt = 0;  else if( yyTracePrompt==0 ) yyTraceFILE = 0;}#endif /* NDEBUG */#ifndef NDEBUGstatic const char *yyTokenName[] = { %%};#endif /* NDEBUG */#ifndef NDEBUGstatic const char *yyRuleName[] = {%%};#endif /* NDEBUG */const char *ParseTokenName(int tokenType){#ifndef NDEBUG  if( tokenType>0 && tokenType<(sizeof(yyTokenName)/sizeof(yyTokenName[0])) ){    return yyTokenName[tokenType];  }else{    return "Unknown";  }#else  return "";#endif}void *ParseAlloc(void *(*mallocProc)(size_t)){  yyParser *pParser;  pParser = (yyParser*)(*mallocProc)( (size_t)sizeof(yyParser) );  if( pParser ){    pParser->yyidx = -1;  }  return pParser;}static void yy_destructor(yyCode yymajor, yyMinor *yypminor){  switch( yymajor ){%%    default:  break;   /* If no destructor action specified: do nothing */  }}static int yy_pop_parser_stack(yyParser *pParser){  yyCode yymajor;  yyStackEntry *yytos = &pParser->yystack[pParser->yyidx];  if( pParser->yyidx<0 ) return 0;#ifndef NDEBUG  if( yyTraceFILE && pParser->yyidx>=0 ){    fprintf(yyTraceFILE,"%sPopping %s\n",      yyTracePrompt,      yyTokenName[yytos->major]);  }#endif  yymajor = yytos->major;  yy_destructor( yymajor, &yytos->minor);  pParser->yyidx--;  return yymajor;}void ParseFree(void *p,void (*freeProc)(void*)){  yyParser *pParser = (yyParser*)p;  if( pParser==0 ) return;  while( pParser->yyidx>=0 ) yy_pop_parser_stack(pParser);  (*freeProc)((void*)pParser);}static int yy_find_shift_action(yyParser *pParser,int iLookAhead){  int i;  int stateno = pParser->yystack[pParser->yyidx].stateno;   /* if( pParser->yyidx<0 ) return YY_NO_ACTION;  */  i = yy_shift_ofst[stateno];  if( i==YY_SHIFT_USE_DFLT ){    return yy_default[stateno];  }  if( iLookAhead==YYNOCODE ){    return YY_NO_ACTION;  }  i += iLookAhead;  if( i<0 || i>=YY_SZ_ACTTAB || yy_lookahead[i]!=iLookAhead ){#ifdef YYFALLBACK    int 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      return yy_find_shift_action(pParser, iFallback);    }#endif    return yy_default[stateno];  }else{    return yy_action[i];  }}static int yy_find_reduce_action(yyParser *pParser,int iLookAhead){  int i;  int stateno = pParser->yystack[pParser->yyidx].stateno;   i = yy_reduce_ofst[stateno];  if( i==YY_REDUCE_USE_DFLT ){    return yy_default[stateno];  }  if( iLookAhead==YYNOCODE ){    return YY_NO_ACTION;  }  i += iLookAhead;  if( i<0 || i>=YY_SZ_ACTTAB || yy_lookahead[i]!=iLookAhead ){    return yy_default[stateno];  }else{    return yy_action[i];  }}/*** Perform a shift action.*/static void yy_shift(yyParser *yypParser,int yyNewState,int yyMajor,yyMinor *yypMinor){  yyStackEntry *yytos;  yypParser->yyidx++;  if( yypParser->yyidx>=YYSTACKDEPTH ){     ParseARG_FETCH;     yypParser->yyidx--;#ifndef NDEBUG     if( yyTraceFILE ){       fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt);     }#endif     while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser);     /* Here code is inserted which will execute if the parser stack every overflows */%%     ParseARG_STORE; /* Suppress warning about unused %extra_argument var */     return;  }  yytos = &yypParser->yystack[yypParser->yyidx];  yytos->stateno = yyNewState;  yytos->major = yyMajor;  yytos->minor = *yypMinor;#ifndef NDEBUG  if( yyTraceFILE && yypParser->yyidx>0 ){    int i;    fprintf(yyTraceFILE,"%sShift %d\n",yyTracePrompt,yyNewState);    fprintf(yyTraceFILE,"%sStack:",yyTracePrompt);    for(i=1; i<=yypParser->yyidx; i++)      fprintf(yyTraceFILE," %s",yyTokenName[yypParser->yystack[i].major]);    fprintf(yyTraceFILE,"\n");  }#endif}/* The following table contains information about every rule that** is used during the reduce.*/static struct {  yyCode lhs;         	  /* Symbol on the left-hand side of the rule */  unsigned char nrhs;     /* Number of right-hand side symbols in the rule */} yyRuleInfo[] = {%%};static void yy_accept(yyParser*);  /* Forward Declaration *//*** Perform a reduce action and the shift that must immediately** follow the reduce.*/static void yy_reduce(yyParser *yypParser,int yyruleno){  int yygoto;                     /* The next state */  int yyact;                      /* The next action */  yyMinor 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];#ifndef NDEBUG  if( yyTraceFILE && yyruleno>=0         && yyruleno<sizeof(yyRuleName)/sizeof(yyRuleName[0]) ){    fprintf(yyTraceFILE, "%sReduce [%s].\n", yyTracePrompt,      yyRuleName[yyruleno]);  }#endif /* NDEBUG */  switch( yyruleno ){  /* Beginning here are the reduction cases.  A typical example  ** follows:  **   case 0:  **  #line <lineno> <grammarfile>  **     { ... }           // User supplied code  **  #line <lineno> <thisfile>  **     break;  */%%  };  yygoto = yyRuleInfo[yyruleno].lhs;  yysize = yyRuleInfo[yyruleno].nrhs;  yypParser->yyidx -= yysize;  yyact = yy_find_reduce_action(yypParser,yygoto);  if( yyact < YYNSTATE ){    yy_shift(yypParser,yyact,yygoto,&yygotominor);  }else if( yyact == YYNSTATE + YYNRULE + 1 ){    yy_accept(yypParser);  }}/*** The following code executes when the parse fails*/static void yy_parse_failed(yyParser *yypParser){  ParseARG_FETCH;#ifndef NDEBUG  if( yyTraceFILE ){    fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt);  }#endif  while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser);  /* Here code is inserted which will be executed whenever the  ** parser fails */%%  ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */}/*** The following code executes when a syntax error first occurs.*/static void yy_syntax_error(yyParser *yypParser,int yymajor,yyMinor yyminor){  ParseARG_FETCH;#define TOKEN (yyminor.yy0)%%  ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */}/*** The following is executed when the parser accepts*/static void yy_accept(yyParser *yypParser){  ParseARG_FETCH;#ifndef NDEBUG  if( yyTraceFILE ){    fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt);  }#endif  while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser);  /* Here code is inserted which will be executed whenever the  ** parser accepts */%%  ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */}/* The main parser program.** The first argument is a pointer to a structure obtained from** "ParseAlloc" which describes the current state of the parser.** The second argument is the major token number.  The third is** the minor token.  The fourth optional argument is whatever the** user wants (and specified in the grammar) and is available for** use by the action routines.*/void Parse(void *yyp,yyCode yymajor,ParseToken yyminor,ParseARG_PDECL){  yyMinor yyminorunion;  int yyact;            /* The parser action. */  int yyendofinput;     /* True if we are at the end of input */  int yyerrorhit = 0;   /* True if yymajor has invoked an error */  yyParser *yypParser;  /* The parser */  /* (re)initialize the parser, if necessary */  yypParser = (yyParser*)yyp;  if( yypParser->yyidx<0 ){    if( yymajor==0 ) return;    yypParser->yyidx = 0;    yypParser->yyerrcnt = -1;    yypParser->yystack[0].stateno = 0;    yypParser->yystack[0].major = 0;  }  yyminorunion.yy0 = yyminor;  yyendofinput = (yymajor==0);  ParseARG_STORE;#ifndef NDEBUG  if( yyTraceFILE ){    fprintf(yyTraceFILE,"%sInput %s\n",yyTracePrompt,yyTokenName[yymajor]);  }#endif  do{    yyact = yy_find_shift_action(yypParser,yymajor);    if( yyact<YYNSTATE ){      yy_shift(yypParser,yyact,yymajor,&yyminorunion);      yypParser->yyerrcnt--;      if( yyendofinput && yypParser->yyidx>=0 ){        yymajor = 0;      }else{        yymajor = YYNOCODE;      }    }else if( yyact < YYNSTATE + YYNRULE ){      yy_reduce(yypParser,yyact-YYNSTATE);    }else if( yyact == YY_ERROR_ACTION ){      int yymx;#ifndef NDEBUG      if( yyTraceFILE ){        fprintf(yyTraceFILE,"%sSyntax Error!\n",yyTracePrompt);      }#endif#ifdef YYERRORSYMBOL      /* A syntax error has occurred.      ** The response to an error depends upon whether or not the      ** grammar defines an error token "ERROR".        **      ** This is what we do if the grammar does define ERROR:      **      **  * Call the %syntax_error function.      **      **  * Begin popping the stack until we enter a state where      **    it is legal to shift the error symbol, then shift      **    the error symbol.      **      **  * Set the error count to three.      **      **  * Begin accepting and shifting new tokens.  No new error      **    processing will occur until three tokens have been      **    shifted successfully.      **      */      if( yypParser->yyerrcnt<0 ){        yy_syntax_error(yypParser,yymajor,yyminorunion);      }      yymx = yypParser->yystack[yypParser->yyidx].major;      if( yymx==YYERRORSYMBOL || yyerrorhit ){#ifndef NDEBUG        if( yyTraceFILE ){          fprintf(yyTraceFILE,"%sDiscard input token %s\n",             yyTracePrompt,yyTokenName[yymajor]);        }#endif        yy_destructor(yymajor,&yyminorunion);        yymajor = YYNOCODE;      }else{         while(          yypParser->yyidx >= 0 &&          yymx != YYERRORSYMBOL &&          (yyact = yy_find_shift_action(yypParser,YYERRORSYMBOL)) >= YYNSTATE        ){          yy_pop_parser_stack(yypParser);        }        if( yypParser->yyidx < 0 || yymajor==0 ){          yy_destructor(yymajor,&yyminorunion);          yy_parse_failed(yypParser);          yymajor = YYNOCODE;        }else if( yymx!=YYERRORSYMBOL ){          yyMinor u2;          u2.YYERRSYMDT = 0;          yy_shift(yypParser,yyact,YYERRORSYMBOL,&u2);        }      }      yypParser->yyerrcnt = 3;      yyerrorhit = 1;#else  /* YYERRORSYMBOL is not defined */      /* This is what we do if the grammar does not define ERROR:      **      **  * Report an error message, and throw away the input token.      **      **  * If the input token is $, then fail the parse.      **      ** As before, subsequent error messages are suppressed until      ** three input tokens have been successfully shifted.      */      if( yypParser->yyerrcnt<=0 ){        yy_syntax_error(yypParser,yymajor,yyminorunion);      }      yypParser->yyerrcnt = 3;      yy_destructor(yymajor,&yyminorunion);      if( yyendofinput ){        yy_parse_failed(yypParser);      }      yymajor = YYNOCODE;#endif    }else{      yy_accept(yypParser);      yymajor = YYNOCODE;    }  }while( yymajor!=YYNOCODE && yypParser->yyidx>=0 );  return;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?