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: *
****************************************************************/
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;
/* 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;