home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / awk / awk320sr.zip / YYPARSE.C < prev    next >
C/C++ Source or Header  |  1989-08-17  |  4KB  |  155 lines

  1. /*
  2.  * yyparse.c --  parser for yacc output
  3.  */
  4.  
  5. #define YYFLAG -1000
  6. #define YYABORT return(1)
  7. #define YYACCEPT return(0)
  8. #define YYERROR goto yyerrlab
  9.  
  10. int     yychar = -1;    /* current input token number */
  11. int     yydebug = 0;    /* 1 for debugging */
  12. int     yynerrs = 0;    /* number of errors */
  13. short   yyerrflag = 0;  /* error recovery flag */
  14. short   yys[YYMAXDEPTH];/* where the stack is stored */
  15. YYSTYPE yyv[YYMAXDEPTH];/* where the values are stored */
  16.  
  17. #ifndef YYLOG
  18. #define YYLOG stderr
  19. #endif
  20.  
  21. yyparse()
  22. {
  23.     short   yyj;
  24.     short   yym;
  25.     short   *yyps;
  26.     short   *yyxi;
  27.     YYSTYPE *yypv;
  28.     YYSTYPE *yypvt;
  29.     short   yystate;
  30.     register short  yyn;
  31.  
  32.     extern int yylex(void);
  33.     extern void yyerror(char*);
  34.  
  35.     yystate = 0;
  36.     yychar = -1;
  37.     yynerrs = 0;
  38.     yyerrflag = 0;
  39.     yyps= &yys[-1];
  40.     yypv= &yyv[-1];
  41.  
  42. yystack:    /* put a state and value onto the stack */
  43. #ifdef YYDEBUG
  44.     if (yydebug)
  45.         fprintf(YYLOG, "state %d, char 0%o\n", yystate, yychar );
  46. #endif
  47.     if (++yyps> &yys[YYMAXDEPTH]) {
  48.         yyerror("yacc stack overflow");
  49.         goto yyabort;
  50.     }
  51.     *yyps = yystate;
  52.     ++yypv;
  53. #ifdef UNION
  54.     yyunion(yypv, &yyval);
  55. #else
  56.     *yypv = yyval;
  57. #endif
  58. yynewstate:
  59.     yyn = yypact[yystate];
  60.     if (yyn <= YYFLAG)
  61.         goto yydefault; /* simple state */
  62.     if (yychar < 0)
  63.         if ((yychar=yylex())<0)
  64.             yychar=0;
  65.     if ((yyn += yychar)<0 || yyn >= YYLAST)
  66.         goto yydefault;
  67.     if (yychk[yyn=yyact[yyn]] == yychar) {
  68.         yychar = -1;
  69. #ifdef UNION
  70.         yyunion(&yyval, &yylval);
  71. #else
  72.         yyval = yylval;
  73. #endif
  74.         yystate = yyn;
  75.         if (yyerrflag > 0)
  76.             --yyerrflag;
  77.         goto yystack;
  78.     }
  79. /* 
  80.  *default state action
  81.  */
  82. yydefault:
  83.     if ((yyn=yydef[yystate]) == -2) {
  84.         if (yychar<0) if ((yychar = yylex())<0) yychar = 0;
  85. /*
  86.  * look through exception table
  87.  */
  88.         for (yyxi=yyexca; (*yyxi != (-1)) || (yyxi[1] != yystate) ; yyxi += 2)
  89.             ;
  90.         for (yyxi += 2; *yyxi >= 0; yyxi += 2)
  91.             if (*yyxi == yychar)
  92.                 break;
  93.         if ((yyn = yyxi[1]) < 0)
  94.             return(0);   /* accept */
  95.     }
  96.     if (yyn == 0) {
  97. /* error ... attempt to resume parsing */
  98.         switch (yyerrflag) {
  99.         case 0:
  100.             yyerror("syntax error");
  101. yyerrlab:
  102.             ++yynerrs;
  103.         case 1:
  104.         case 2:
  105.             yyerrflag = 3;
  106.             while (yyps >= yys) {
  107.                 yyn = yypact[*yyps] + YYERRCODE;
  108.                 if (yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE) {
  109.                     yystate = yyact[yyn];
  110.                     goto yystack;
  111.                 }
  112.                 yyn = yypact[*yyps];
  113. #ifdef YYDEBUG
  114.                 if (yydebug)
  115.                     fprintf(YYLOG, "error recovery pops state %d, uncovers %d\n",
  116.                                 *yyps, yyps[-1]);
  117. #endif
  118.                 --yyps;
  119.                 --yypv;
  120.             }
  121. yyabort:
  122.             return(1);
  123.         case 3:
  124. #ifdef YYDEBUG
  125.             if (yydebug)
  126.                 fprintf(YYLOG, "error recovery discards char %d\n", yychar );
  127. #endif
  128.             if (yychar == 0)
  129.                 goto yyabort; /* don't discard EOF, quit */
  130.             yychar = -1;
  131.             goto yynewstate;   /* try again in the same state */
  132.         }
  133.     }
  134.  
  135.     /* reduction by production yyn */
  136.     yyps -= yyr2[yyn];
  137.     yypvt = yypv;
  138.     yypv -= yyr2[yyn];
  139. #ifdef UNION
  140.     yyunion(&yyval, &yypv[1]);
  141. #else
  142.     yyval = yypv[1];
  143. #endif
  144.     yym=yyn;
  145.     yyn = yyr1[yyn];
  146.     yyj = yypgo[yyn] + *yyps + 1;
  147.     if (yyj>=YYLAST || yychk[yystate = yyact[yyj]] != -yyn)
  148.         yystate = yyact[yypgo[yyn]];
  149.     switch(yym) {
  150.         $A
  151.     }
  152.     goto yystack;
  153. }
  154.  
  155.