home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / program / c / yaccsrc2 / yclopt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-05-19  |  3.2 KB  |  156 lines

  1. /* Edits:
  2.  *      06-Dec-80 Broken out of y4.c, impure data in y4imp.c.
  3.  *      18-Dec-80 ZAPFILE not used for decus compiler, fmkdl() used.
  4.  */
  5.  
  6. # include "y4.h" 
  7.  
  8. void callopt( )
  9. {
  10.  
  11.   register i,
  12.          * p,
  13.            j,
  14.            k,
  15.          * q;
  16.  
  17.   /* read the arrays from tempfile and set parameters */
  18.  
  19.  
  20.   if ( ( finput = fopen( TEMPNAME, "r" ) ) == NULL )
  21.     error( "optimizer cannot open tempfile" );
  22.   pgo[ 0 ]    = 0;
  23.   yypact[ 0 ] = 0;
  24.   nstate      = 0;
  25.   nnonter     = 0;
  26.   for ( ; ; )
  27.     {
  28.       switch ( gtnm( ) )
  29.         {
  30.  
  31.           case '\n' :
  32.             yypact[ ++nstate ] = ( --pmem ) - mem0;
  33.  
  34.           case ',' :
  35.             continue ;
  36.  
  37.           case '$' :
  38.             break ;
  39.  
  40.           default :
  41.             error( "bad tempfile" );
  42.         }
  43.       break ;
  44.     }
  45.  
  46.   yypact[ nstate ]   = yypgo[ 0 ] = ( --pmem ) - mem0;
  47.  
  48.   for ( ; ; )
  49.     {
  50.       switch ( gtnm( ) )
  51.         {
  52.  
  53.           case '\n' :
  54.             yypgo[ ++nnonter ] = pmem - mem0;
  55.           case '\r' :
  56.           case ',' :
  57.             continue ;
  58.  
  59.           case -1 : /* EOF */
  60.             break ;
  61.  
  62.           default :
  63.             error( "bad tempfile" );
  64.         }
  65.       break ;
  66.     }
  67.  
  68.   yypgo[ nnonter-- ] = ( --pmem ) - mem0;
  69.   for ( i = 0; i < nstate; ++i )
  70.     {
  71.  
  72.       k = 32000;
  73.       j = 0;
  74.       q = mem0 + yypact[ i + 1 ];
  75.       for ( p = mem0 + yypact[ i ]; p < q; p += 2 )
  76.         {
  77.           if ( *p > j )
  78.             j = *p;
  79.           if ( *p < k )
  80.             k = *p;
  81.         }
  82.       if ( k <= j )
  83.         {
  84.           /* nontrivial situation */
  85.           /* temporarily, kill this for compatibility
  86.                                  j -= k;  j is now the range */
  87.           if ( k > maxoff )
  88.             maxoff = k;
  89.         }
  90.       greed[ i ] = ( yypact[ i + 1 ] - yypact[ i ] ) + 2 * j;
  91.       if ( j > maxspr )
  92.         maxspr = j;
  93.     }
  94.  
  95.   /* initialize ggreed table */
  96.  
  97.   for ( i = 1; i <= nnonter; ++i )
  98.     {
  99.       ggreed[ i ] = 1;
  100.       j = 0;
  101.       /* minimum entry index is always 0 */
  102.       q = mem0 + yypgo[ i + 1 ] - 1;
  103.       for ( p = mem0 + yypgo[ i ]; p < q; p += 2 )
  104.         {
  105.           ggreed[ i ] += 2;
  106.           if ( *p > j )
  107.             j = *p;
  108.         }
  109.       ggreed[ i ] = ggreed[ i ] + 2 * j;
  110.       if ( j > maxoff )
  111.         maxoff = j;
  112.     }
  113.  
  114.   /* now, prepare to put the shift actions into the a array */
  115.  
  116.   for ( i = 0; i < ACTSIZE; ++i )
  117.     yyact[ i ] = 0;
  118.   maxa        = yyact;
  119.  
  120.   for ( i = 0; i < nstate; ++i )
  121.     {
  122.       if ( greed[ i ] == 0 && adb > 1 )
  123.         fprintf( ftable, "State %d: null\n", i );
  124.       pa[ i ] = YYFLAG1;
  125.     }
  126.  
  127.   while ( ( i = nxti( ) ) != NOMORE )
  128.     {
  129.       if ( i >= 0 )
  130.         stin( i );
  131.       else
  132.         gin( -i );
  133.  
  134.     }
  135.  
  136.   if ( adb > 2 )
  137.     {
  138.       /* print a array */
  139.       for ( p = yyact; p <= maxa; p += 10 )
  140.         {
  141.           fprintf( ftable, "%4d  ", p - yyact );
  142.           for ( i = 0; i < 10; ++i )
  143.             fprintf( ftable, "%4d  ", p[ i ] );
  144.           fprintf( ftable, "\n" );
  145.         }
  146.     }
  147.     /* write out the output appropriate to the language */
  148.  
  149.   aoutput( );
  150.  
  151.   osummary( );
  152.  
  153.   fclose( finput );
  154.   ZAPFILE( TEMPNAME );
  155. }
  156.