CALC_IFDB: PROC;
/*THIS ROUTINE IS RESPONSIBLE FOR CALCULATING THE RELATION*/
/*IS-FOLLOWED-DIRECTLY-BY. IF SYMBOL, A, COMES BEFORE THE*/
/*SYMBOL,B, ON THE RIGTH-HAND-SIDE OF A PRODUCTION OR ALL */
/*SYMBOLS BETWEEN A AND B ARE NULLABLE. */
DCL I BIN(15); /* INDEXES */
DCL J BIN(15);
DCL K BIN(15);
/* CALCULATE THE RELATION. */
DO I=1 TO NUMPRD; /* LOOP THRU ALL PRODUCTIONS. */
IF LENGTH(RHS(I))=0 THEN /*EPSILON PRODUCTION*/
;
ELSE
DO J=1 TO LENGTH(RHS(I))-1;
DO K=J+1 TO LENGTH(RHS(I));
CALL SETBIT(CHRNUM(SUBSTR(RHS(I),J,1)),
CHRNUM(SUBSTR(RHS(I),K,1)),ADDR(ARRAY1));
IF ISNLNT(SUBSTR(RHS(I),K,1)) THEN
;
ELSE
K=LENGTH(RHS(I));
END;
END;
END;
/* RETURN TO CALLER. */
END CALC_IFDB;
CALC_IDEO: PROC;
/*THIS ROUTINE IS RESPONSIBLE FOR CALCULATING THE RELATION*/
/*IS-DIRECTLY-END-OF. WE SAY THAT IS-DIRECTLY-END-OF IS */
/*SIMPLY THE RIGHT TO LEFT VERSION OF THE RELATION, */
/*BEGINS-DIRECTLY-WITH. */
DCL I BIN(15); /* INDEXES */
DCL J BIN(15);
/* CALCULATE THE RELATION. */
DO I=1 TO NUMPRD; /* LOOP THRU ALL PRODUCTIONS. */
IF LENGTH(RHS(I))=0 THEN /*EPSILON PRODUCTION*/
;
ELSE
DO J=LENGTH(RHS(I)) TO 1 BY -1;
CALL SETBIT(CHRNUM(SUBSTR(RHS(I),J,1)),
CHRNUM(LHS(I)),ADDR(ARRAY1));
IF ISNLNT(SUBSTR(RHS(I),J,1)) THEN
;
ELSE
J=1;
END;
END;
/* RETURN TO CALLER. */
END CALC_IDEO;
CALC_IEO: PROC;
/*THIS ROUTINE IS RESPONSIBLE FOR CALCULATING THE RELATION*/
/*IS-END-OF. IS-END-OF IS THE REFLEXIVE TRANSITIVE */
/*CLOSURE OF THE RELATION, IS-DIRECTLY-END-OF. */