home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / alde_c / misc / comm / yaccunx / yclopt.4c < prev    next >
Encoding:
Text File  |  1983-12-25  |  2.8 KB  |  140 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. callopt()
  9.    {
  10.  
  11.    register i, *p, j, k, *q;
  12.  
  13.    /* read the arrays from tempfile and set parameters */
  14.  
  15.    
  16.    if( (finput=fopen(TEMPNAME,"r")) == NULL ) error( "optimizer cannot open tempfile" );
  17.    pgo[0] = 0;
  18.    yypact[0] = 0;
  19.    nstate = 0;
  20.    nnonter = 0;
  21.    for(;;)
  22.       {
  23.       switch( gtnm() )
  24.          {
  25.  
  26.       case '\n':
  27.          yypact[++nstate] = (--pmem) - mem0;
  28.  
  29.       case ',':
  30.          continue;
  31.  
  32.       case '$':
  33.          break;
  34.  
  35.       default:
  36.          error( "bad tempfile" );
  37.          }
  38.       break;
  39.       }
  40.  
  41.    yypact[nstate] = yypgo[0] = (--pmem) - mem0;
  42.  
  43.    for(;;)
  44.       {
  45.       switch( gtnm() )
  46.          {
  47.  
  48.       case '\n':
  49.          yypgo[++nnonter]= pmem-mem0;
  50.       case '\r':
  51.       case ',' :
  52.          continue;
  53.  
  54.       case -1: /* EOF */
  55.          break;
  56.  
  57.       default:
  58.          error( "bad tempfile" );
  59.          }
  60.       break;
  61.       }
  62.  
  63.    yypgo[nnonter--] = (--pmem) - mem0;
  64.    for( i=0; i<nstate; ++i )
  65.       {
  66.  
  67.       k = 32000;
  68.       j = 0;
  69.       q = mem0 + yypact[i+1];
  70.       for( p = mem0 + yypact[i]; p<q ; p += 2 )
  71.          {
  72.          if( *p > j ) j = *p;
  73.          if( *p < k ) k = *p;
  74.          }
  75.       if( k <= j )
  76.          {
  77.          /* nontrivial situation */
  78.          /* temporarily, kill this for compatibility
  79.                                 j -= k;  j is now the range */
  80.          if( k > maxoff ) maxoff = k;
  81.          }
  82.       greed[i] = (yypact[i+1]-yypact[i]) + 2*j;
  83.       if( j > maxspr ) maxspr = j;
  84.       }
  85.  
  86.    /* initialize ggreed table */
  87.  
  88.    for( i=1; i<=nnonter; ++i )
  89.       {
  90.       ggreed[i] = 1;
  91.       j = 0;
  92.       /* minimum entry index is always 0 */
  93.       q = mem0 + yypgo[i+1] -1;
  94.       for( p = mem0+yypgo[i]; p<q ; p += 2 ) 
  95.          {
  96.          ggreed[i] += 2;
  97.          if( *p > j ) j = *p;
  98.          }
  99.       ggreed[i] = ggreed[i] + 2*j;
  100.       if( j > maxoff ) maxoff = j;
  101.       }
  102.  
  103.    /* now, prepare to put the shift actions into the a array */
  104.  
  105.    for( i=0; i<ACTSIZE; ++i ) a[i] = 0;
  106.    maxa = a;
  107.  
  108.    for( i=0; i<nstate; ++i ) 
  109.       {
  110.       if( greed[i]==0 && adb>1 ) fprintf( ftable, "State %d: null\n", i );
  111.       pa[i] = YYFLAG1;
  112.       }
  113.  
  114.    while( (i = nxti()) != NOMORE ) 
  115.       {
  116.       if( i >= 0 ) stin(i);
  117.       else gin(-i);
  118.  
  119.       }
  120.  
  121.    if( adb>2 )
  122.       {
  123.       /* print a array */
  124.       for( p=a; p <= maxa; p += 10)
  125.          {
  126.          fprintf( ftable, "%4d  ", p-a );
  127.          for( i=0; i<10; ++i ) fprintf( ftable, "%4d  ", p[i] );
  128.          fprintf( ftable, "\n" );
  129.          }
  130.       }
  131.    /* write out the output appropriate to the language */
  132.  
  133.    aoutput();
  134.  
  135.    osummary();
  136.  
  137.    fclose(finput);
  138.    ZAPFILE(TEMPNAME);
  139.    }
  140.