home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource4 / 290_01 / hairy.prs < prev    next >
Text File  |  1990-05-14  |  7KB  |  336 lines

  1.  
  2. extern int timeclock;
  3.  
  4.  
  5. int yyerror;        /*  Yyerror and yycost are set by guards.    */
  6. int yycost;        /*  If yyerror is set to a nonzero value by a    */
  7.             /*  guard, the reduction with which the guard    */
  8.             /*  is associated is not performed, and the    */
  9.             /*  error recovery mechanism is invoked.    */
  10.             /*  Yycost indicates the cost of performing    */
  11.             /*  the reduction given the attributes of the    */
  12.             /*  symbols.                    */
  13.  
  14.  
  15. /*  YYMAXDEPTH indicates the size of the parser's state and value    */
  16. /*  stacks.                                */
  17.  
  18. #ifndef    YYMAXDEPTH
  19. #define    YYMAXDEPTH    500
  20. #endif
  21.  
  22. /*  YYMAXRULES must be at least as large as the number of rules that    */
  23. /*  could be placed in the rule queue.  That number could be determined    */
  24. /*  from the grammar and the size of the stack, but, as yet, it is not.    */
  25.  
  26. #ifndef    YYMAXRULES
  27. #define    YYMAXRULES    100
  28. #endif
  29.  
  30. #ifndef    YYMAXBACKUP
  31. #define YYMAXBACKUP    100
  32. #endif
  33.  
  34.  
  35. short    yyss[YYMAXDEPTH];    /*  the state stack            */
  36. YYSTYPE    yyvs[YYMAXDEPTH];    /*  the semantic value stack        */
  37. YYLTYPE yyls[YYMAXDEPTH];    /*  the location stack            */
  38. short    yyrq[YYMAXRULES];    /*  the rule queue            */
  39. int    yychar;            /*  the lookahead symbol        */
  40.  
  41. YYSTYPE    yylval;            /*  the semantic value of the        */
  42.                 /*  lookahead symbol            */
  43.  
  44. YYSTYPE yytval;            /*  the semantic value for the state    */
  45.                 /*  at the top of the state stack.    */
  46.  
  47. YYSTYPE yyval;            /*  the variable used to return        */
  48.                 /*  semantic values from the action    */
  49.                 /*  routines                */
  50.  
  51. YYLTYPE yylloc;        /*  location data for the lookahead    */
  52.                 /*  symbol                */
  53.  
  54. YYLTYPE yytloc;        /*  location data for the state at the    */
  55.                 /*  top of the state stack        */
  56.  
  57.  
  58. int    yynunlexed;
  59. short    yyunchar[YYMAXBACKUP];
  60. YYSTYPE    yyunval[YYMAXBACKUP];
  61. YYLTYPE yyunloc[YYMAXBACKUP];
  62.  
  63. short *yygssp;            /*  a pointer to the top of the state    */
  64.                 /*  stack; only set during error    */
  65.                 /*  recovery.                */
  66.  
  67. YYSTYPE *yygvsp;        /*  a pointer to the top of the value    */
  68.                 /*  stack; only set during error    */
  69.                 /*  recovery.                */
  70.  
  71. YYLTYPE *yyglsp;        /*  a pointer to the top of the        */
  72.                 /*  location stack; only set during    */
  73.                 /*  error recovery.            */
  74.  
  75.  
  76. /*  Yyget is an interface between the parser and the lexical analyzer.    */
  77. /*  It is costly to provide such an interface, but it avoids requiring    */
  78. /*  the lexical analyzer to be able to back up the scan.        */
  79.  
  80. yyget()
  81. {
  82.   if (yynunlexed > 0)
  83.     {
  84.       yynunlexed--;
  85.       yychar = yyunchar[yynunlexed];
  86.       yylval = yyunval[yynunlexed];
  87.       yylloc = yyunloc[yynunlexed];
  88.     }
  89.   else if (yychar <= 0)
  90.     yychar = 0;
  91.   else
  92.     {
  93.       yychar = yylex();
  94.       if (yychar < 0)
  95.     yychar = 0;
  96.       else yychar = YYTRANSLATE(yychar);
  97.     }
  98. }
  99.  
  100.  
  101.  
  102. yyunlex(chr, val, loc)
  103. int chr;
  104. YYSTYPE val;
  105. YYLTYPE loc;
  106. {
  107.   yyunchar[yynunlexed] = chr;
  108.   yyunval[yynunlexed] = val;
  109.   yyunloc[yynunlexed] = loc;
  110.   yynunlexed++;
  111. }
  112.  
  113.  
  114.  
  115. yyrestore(first, last)
  116. register short *first;
  117. register short *last;
  118. {
  119.   register short *ssp;
  120.   register short *rp;
  121.   register int symbol;
  122.   register int state;
  123.   register int tvalsaved;
  124.  
  125.   ssp = yygssp;
  126.   yyunlex(yychar, yylval, yylloc);
  127.  
  128.   tvalsaved = 0;
  129.   while (first != last)
  130.     {
  131.       symbol = yystos[*ssp];
  132.       if (symbol < YYNTBASE)
  133.     {
  134.       yyunlex(symbol, yytval, yytloc);
  135.       tvalsaved = 1;
  136.       ssp--;
  137.     }
  138.  
  139.       ssp--;
  140.  
  141.       if (first == yyrq)
  142.     first = yyrq + YYMAXRULES;
  143.  
  144.       first--;
  145.  
  146.       for (rp = yyrhs + yyprhs[*first]; symbol = *rp; rp++)
  147.     {
  148.       if (symbol < YYNTBASE)
  149.         state = yytable[yypact[*ssp] + symbol];
  150.       else
  151.         {
  152.           state = yypgoto[symbol - YYNTBASE] + *ssp;
  153.  
  154.           if (state >= 0 && state <= YYLAST && yycheck[state] == *ssp)
  155.         state = yytable[state];
  156.           else
  157.         state = yydefgoto[symbol - YYNTBASE];
  158.         }
  159.  
  160.       *++ssp = state;
  161.     }
  162.     }
  163.  
  164.   if ( ! tvalsaved && ssp > yyss)
  165.     {
  166.       yyunlex(yystos[*ssp], yytval, yytloc);
  167.       ssp--;
  168.     }
  169.  
  170.   yygssp = ssp;
  171. }
  172.  
  173.  
  174.  
  175. int
  176. yyparse()
  177. {
  178.   register int yystate;
  179.   register int yyn;
  180.   register short *yyssp;
  181.   register short *yyrq0;
  182.   register short *yyptr;
  183.   register YYSTYPE *yyvsp;
  184.  
  185.   int yylen;
  186.   YYLTYPE *yylsp;
  187.   short *yyrq1;
  188.   short *yyrq2;
  189.  
  190.   yystate = 0;
  191.   yyssp = yyss - 1;
  192.   yyvsp = yyvs - 1;
  193.   yylsp = yyls - 1;
  194.   yyrq0 = yyrq;
  195.   yyrq1 = yyrq0;
  196.   yyrq2 = yyrq0;
  197.  
  198.   yychar = yylex();
  199.   if (yychar < 0)
  200.     yychar = 0;
  201.   else yychar = YYTRANSLATE(yychar);
  202.  
  203. yynewstate:
  204.  
  205.   if (yyssp >= yyss + YYMAXDEPTH - 1)
  206.     {
  207.       yyabort("Parser Stack Overflow");
  208.       YYABORT;
  209.     }
  210.  
  211.   *++yyssp = yystate;
  212.  
  213. yyresume:
  214.  
  215.   yyn = yypact[yystate];
  216.   if (yyn == YYFLAG)
  217.     goto yydefault;
  218.  
  219.   yyn += yychar;
  220.   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar)
  221.     goto yydefault;
  222.  
  223.   yyn = yytable[yyn];
  224.   if (yyn < 0)
  225.     {
  226.       yyn = -yyn;
  227.       goto yyreduce;
  228.     }
  229.   else if (yyn == 0)
  230.     goto yyerrlab;
  231.  
  232.   yystate = yyn;
  233.  
  234.   yyptr = yyrq2;
  235.   while (yyptr != yyrq1)
  236.     {
  237.       yyn = *yyptr++;
  238.       yylen = yyr2[yyn];
  239.       yyvsp -= yylen;
  240.       yylsp -= yylen;
  241.  
  242.       yyguard(yyn, yyvsp, yylsp);
  243.       if (yyerror)
  244.     goto yysemerr;
  245.  
  246.       yyaction(yyn, yyvsp, yylsp);
  247.       *++yyvsp = yyval;
  248.  
  249.       yylsp++;
  250.       if (yylen == 0)
  251.     {
  252.       yylsp->timestamp = timeclock;
  253.       yylsp->first_line = yytloc.first_line;
  254.       yylsp->first_column = yytloc.first_column;
  255.       yylsp->last_line = (yylsp-1)->last_line;
  256.       yylsp->last_column = (yylsp-1)->last_column;
  257.       yylsp->text = 0;
  258.     }
  259.       else
  260.     {
  261.       yylsp->last_line = (yylsp+yylen-1)->last_line;
  262.       yylsp->last_column = (yylsp+yylen-1)->last_column;
  263.     }
  264.       
  265.       if (yyptr == yyrq + YYMAXRULES)
  266.         yyptr = yyrq;
  267.     }
  268.  
  269.   if (yystate == YYFINAL)
  270.     YYACCEPT;
  271.  
  272.   yyrq2 = yyptr;
  273.   yyrq1 = yyrq0;
  274.  
  275.   *++yyvsp = yytval;
  276.   *++yylsp = yytloc;
  277.   yytval = yylval;
  278.   yytloc = yylloc;
  279.   yyget();
  280.  
  281.   goto yynewstate;
  282.  
  283. yydefault:
  284.  
  285.   yyn = yydefact[yystate];
  286.   if (yyn == 0)
  287.     goto yyerrlab;
  288.  
  289. yyreduce:
  290.  
  291.   *yyrq0++ = yyn;
  292.  
  293.   if (yyrq0 == yyrq + YYMAXRULES)
  294.     yyrq0 = yyrq;
  295.  
  296.   if (yyrq0 == yyrq2)
  297.     {
  298.       yyabort("Parser Rule Queue Overflow");
  299.       YYABORT;
  300.     }
  301.  
  302.   yyssp -= yyr2[yyn];
  303.   yyn = yyr1[yyn];
  304.  
  305.   yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
  306.   if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
  307.     yystate = yytable[yystate];
  308.   else
  309.     yystate = yydefgoto[yyn - YYNTBASE];
  310.  
  311.   goto yynewstate;
  312.  
  313. yysemerr:
  314.   *--yyptr = yyn;
  315.   yyrq2 = yyptr;
  316.   yyvsp += yyr2[yyn];
  317.  
  318. yyerrlab:
  319.  
  320.   yygssp = yyssp;
  321.   yygvsp = yyvsp;
  322.   yyglsp = yylsp;
  323.   yyrestore(yyrq0, yyrq2);
  324.   yyrecover();
  325.   yystate = *yygssp;
  326.   yyssp = yygssp;
  327.   yyvsp = yygvsp;
  328.   yyrq0 = yyrq;
  329.   yyrq1 = yyrq0;
  330.   yyrq2 = yyrq0;
  331.   goto yyresume;
  332. }
  333.  
  334. $
  335.  
  336.