LL1P70: PROC;
/****************************************************************
*               LL(1) GRAMMAR ANALYZER - PHASE 7                *
*PURPOSE:                                                       *
*    THIS PROGRAM ANALYZES A LL(1) GRAMMAR GIVEN IN MODIFIED    *
*    BNF FORMAT AND FINDS THE SELECTION SET.                    *
*INPUT:                                                         *
*    1) BASIC GRAMMAR TABLES                                    *
*    2) NULLABLE NON-TERMINALS AND PRODUCTIONS TABLES           *
*    3) ARRAY1 = THE FOLLOW RELATION                            *
*    4) $1.T02 = THE FIRST RELATION                             *
*OUTPUT:                                                        *
*    1) ARRAY1 = THE SELECTION SET FOR ALL PRODUCTIONS          *
*    2) $1.T05 = THE SELECTION SET FOR ALL PRODUCTIONS          *
*OUTLINE:                                                       *
*REMARKS:                                                       *
****************************************************************/

/****************************************************************
* * * * * * * * * * * COMMON DATA DEFINITIONS * * * * * * * * * *
****************************************************************/

/*      * * *  COMMON REPLACEMENTS  * * *       */
%REPLACE TRUE BY '1'B;
%REPLACE FALSE BY '0'B;

%INCLUDE 'LL1CMN.DCL';  /* GET COMMON AREAS. */


/****************************************************************
* * * * * * * * * * * COMMON PROCUDURES * * * * * * * * * * * * *
****************************************************************/

%INCLUDE 'LL1PRC.DCL';


/****************************************************************
* * * * * * * * * * GRAMMAR ANALYSIS PROCEDURES * * * * * * * * *
****************************************************************/


CALC_SS: PROC;
/*THIS ROUTINE IS RESPONSIBLE FOR CALCULATING THE ACTUAL  */
/*SELECTION SET FOR EACH PRODUCTION.  THE SELECTION SET IS*/
/*DEFINED AS THE SET FIRST FOR THE PRODUCTION UNION WITH  */
/*THE FOLLOW SET OF THE LEFT-HAND-SIDE IF IT IS A NULLABLE*/
/*PRODUCTION. */
       DCL I FIXED;            /* INDICES */
       DCL J FIXED;
       DCL K FIXED;

/* MERGE THE FOLLOW SET FOR ALL NULLIBLE PRODUCTIONS. */
       IF NNLPRD=0 THEN        /*NO NULLABLE PRODUCTIONS*/
          ;
       ELSE
          DO I=1 TO NNLPRD;    /*LOOP FOR ALL NULLABLE PRODS.*/
             K=CHRNUM(LHS(NULPRD(I)));
             DO J=1 TO NUMVOC+1; /*LOOP FOR ALL SYMBOLS AND ENDMARKER.*/
                IF TSTBIT(K,J,ADDR(ARRAY1)) THEN
                   CALL SETBIT(NULPRD(I),J,ADDR(ARRAY2));
             END;
          END;

/* RETURN TO CALLER. */
       END CALC_SS;


/****************************************************************
* * * * * * * * * * * MAIN LINE PROCEDURE * * * * * * * * * * * *
****************************************************************/


/* ANALYZE THE GRAMMAR. */
       PUT SKIP LIST('BEGINNING PHASE 7 PROCESSING.');

/* CALCULATE THE SELECTION SET. */
       PUT SKIP LIST('CALCULATING THE SELECTION SET...');
       CALL RSTARY(ADDR(ARRAY2),'T02');
       CALL CALC_SS;           /*CALCULATE THE RELATION.*/
       CALL PRTARY('*** SELECTION SET ***',FALSE,
                        NUMPRD,NUMVOC+1,ADDR(ARRAY2));
       PUT SKIP LIST('SAVE THE SET...');
       CALL SAVARY(ADDR(ARRAY2),'T05');

/* RETURN TO CALLER. */
       PUT SKIP LIST('PHASE 7 PROCESSING COMPLETE.');
       END LL1P70;