home *** CD-ROM | disk | FTP | other *** search
- /* Edits:
- * 06-Dec-80 Broken out of y4.c, impure data in y4imp.c.
- * 18-Dec-80 ZAPFILE not used for decus compiler, fmkdl() used.
- */
-
- # include "y4.h"
-
- void callopt( )
- {
-
- register i,
- * p,
- j,
- k,
- * q;
-
- /* read the arrays from tempfile and set parameters */
-
-
- if ( ( finput = fopen( TEMPNAME, "r" ) ) == NULL )
- error( "optimizer cannot open tempfile" );
- pgo[ 0 ] = 0;
- yypact[ 0 ] = 0;
- nstate = 0;
- nnonter = 0;
- for ( ; ; )
- {
- switch ( gtnm( ) )
- {
-
- case '\n' :
- yypact[ ++nstate ] = ( --pmem ) - mem0;
-
- case ',' :
- continue ;
-
- case '$' :
- break ;
-
- default :
- error( "bad tempfile" );
- }
- break ;
- }
-
- yypact[ nstate ] = yypgo[ 0 ] = ( --pmem ) - mem0;
-
- for ( ; ; )
- {
- switch ( gtnm( ) )
- {
-
- case '\n' :
- yypgo[ ++nnonter ] = pmem - mem0;
- case '\r' :
- case ',' :
- continue ;
-
- case -1 : /* EOF */
- break ;
-
- default :
- error( "bad tempfile" );
- }
- break ;
- }
-
- yypgo[ nnonter-- ] = ( --pmem ) - mem0;
- for ( i = 0; i < nstate; ++i )
- {
-
- k = 32000;
- j = 0;
- q = mem0 + yypact[ i + 1 ];
- for ( p = mem0 + yypact[ i ]; p < q; p += 2 )
- {
- if ( *p > j )
- j = *p;
- if ( *p < k )
- k = *p;
- }
- if ( k <= j )
- {
- /* nontrivial situation */
- /* temporarily, kill this for compatibility
- j -= k; j is now the range */
- if ( k > maxoff )
- maxoff = k;
- }
- greed[ i ] = ( yypact[ i + 1 ] - yypact[ i ] ) + 2 * j;
- if ( j > maxspr )
- maxspr = j;
- }
-
- /* initialize ggreed table */
-
- for ( i = 1; i <= nnonter; ++i )
- {
- ggreed[ i ] = 1;
- j = 0;
- /* minimum entry index is always 0 */
- q = mem0 + yypgo[ i + 1 ] - 1;
- for ( p = mem0 + yypgo[ i ]; p < q; p += 2 )
- {
- ggreed[ i ] += 2;
- if ( *p > j )
- j = *p;
- }
- ggreed[ i ] = ggreed[ i ] + 2 * j;
- if ( j > maxoff )
- maxoff = j;
- }
-
- /* now, prepare to put the shift actions into the a array */
-
- for ( i = 0; i < ACTSIZE; ++i )
- yyact[ i ] = 0;
- maxa = yyact;
-
- for ( i = 0; i < nstate; ++i )
- {
- if ( greed[ i ] == 0 && adb > 1 )
- fprintf( ftable, "State %d: null\n", i );
- pa[ i ] = YYFLAG1;
- }
-
- while ( ( i = nxti( ) ) != NOMORE )
- {
- if ( i >= 0 )
- stin( i );
- else
- gin( -i );
-
- }
-
- if ( adb > 2 )
- {
- /* print a array */
- for ( p = yyact; p <= maxa; p += 10 )
- {
- fprintf( ftable, "%4d ", p - yyact );
- for ( i = 0; i < 10; ++i )
- fprintf( ftable, "%4d ", p[ i ] );
- fprintf( ftable, "\n" );
- }
- }
- /* write out the output appropriate to the language */
-
- aoutput( );
-
- osummary( );
-
- fclose( finput );
- ZAPFILE( TEMPNAME );
- }
-