LL1P60: PROC; /**************************************************************** * LL(1) GRAMMAR ANALYZER - PHASE 6 * *PURPOSE: * * THIS PROGRAM ANALYZES A LL(1) GRAMMAR GIVEN IN MODIFIED * * BNF FORMAT AND FINDS THE RELATION, IS-FOLLOWED-DIRECTLY- * * BY, IS-DIRECT-END-OF AND IS-END-OF. * *INPUT: * * 1) BASIC GRAMMAR TABLES * * 2) NULLABLE NON-TERMINALS AND PRODUCTIONS TABLES * * 3) ARRAY1 = THE IS-END-OF RELATION * *OUTPUT: * * 1) ARRAY1 = THE FOLLOW SET FOR NON-TERMINALS * *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_IFB: PROC; /*THIS ROUTINE IS RESPONSIBLE FOR CALCULATING THE RELATION*/ /*IS-FOLLOWED-BY. THIS RELATION IS THE PRODUCT OF THE */ /*IS-END-OF, IS-FOLLOWED-DIRECTLY-BY AND BEGINS-WITH RELA-*/ /*TIONS. */ /* CALCULATE THE RELATION. */ CALL RSTARY(ADDR(ARRAY2),'T03'); /*RESTORE IS-FOLLOWED-DIRECTLY-BY RELATION.*/ CALL MULREL; /*ARRAY1=IS-FOLLOWED-DIRECTLY-BY * IS-END-OF */ CALL RSTARY(ADDR(ARRAY2),'T01'); /*RESTORE BEGINS-WITH RELATION.*/ CALL MULREL; /*GET THE PRODUCT.*/ /* RETURN TO CALLER. */ END CALC_IFB; CALC_IFB_A: PROC; /*THIS ROUTINE IS RESPONSIBLE FOR ADDING THE ENDMARKER TO THE*/ /*RELATION,IS-FOLLOWED-BY. THIS IS DONE BY APPENDING THE */ /*STARTING SYMBOL COLUMN OF THE IS-END-OF RELATION TO THE IS-*/ /*FOLLOWED-BY RELATION. */ DCL I FIXED; DCL J FIXED; /* ADD IT. */ CALL RSTARY(ADDR(ARRAY2),'T04'); /*RESTORE IS-END-OF RELATION.*/ J=CHRNUM(STRSYM); /*GET STARTING SYMBOL COLUMN.*/ DO I=1 TO NUMVOC; IF TSTBIT(I,J,ADDR(ARRAY2)) THEN CALL SETBIT(I,NUMVOC+1,ADDR(ARRAY1)); ELSE CALL RSTBIT(I,NUMVOC+1,ADDR(ARRAY1)); END; /* RETURN TO CALLER. */ END CALC_IFB_A; /**************************************************************** * * * * * * * * * * * MAIN LINE PROCEDURE * * * * * * * * * * * * ****************************************************************/ /* ANALYZE THE GRAMMAR. */ PUT SKIP LIST('BEGINNING PHASE 6 PROCESSING.'); /* CALCULATE THE RELATION, IS-FOLLOWED-BY. */ PUT SKIP LIST('CALCULATING IS-FOLLOWED-BY...'); CALL CALC_IFB; /*CALCULATE THE RELATION.*/ CALL PRTARY('*** IS-FOLLOWED-BY RELATION ***',TRUE, NUMVOC,NUMVOC,ADDR(ARRAY1)); /* ADD THE ENDMARKER TO THE IS-FOLLOWED-BY RELATION. */ PUT SKIP LIST('ADDING ENDMARKER TO IS-FOLLOWED-BY...'); CALL CALC_IFB_A; /*CALCULATE THE RELATION.*/ CALL PRTARY('*** IS-FOLLOWED-BY W/_|_ RELATION ***',TRUE, NUMVOC,NUMVOC+1,ADDR(ARRAY1)); /* RETURN TO CALLER. */ PUT SKIP LIST('PHASE 6 PROCESSING COMPLETE.'); END LL1P60;