home *** CD-ROM | disk | FTP | other *** search
- LL1P50: PROC;
- /****************************************************************
- * LL(1) GRAMMAR ANALYZER - PHASE 5 *
- *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 *
- *OUTPUT: *
- * 1) FILE, $1.T03, CONTAINS THE IS-FOLLOWED-DIRECTLY-BY *
- * RELATION. *
- * 2) FILE, $1.T04, CONTAINS THE IS-END-OF RELATION. *
- *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_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. */
-
- /* CALCULATE IT. */
- CALL CLOSUR(ADDR(ARRAY1));
-
- /* RETURN TO CALLER. */
- END CALC_IEO;
-
-
- /****************************************************************
- * * * * * * * * * * * MAIN LINE PROCEDURE * * * * * * * * * * * *
- ****************************************************************/
-
-
- /* ANALYZE THE GRAMMAR. */
- PUT SKIP LIST('BEGINNING PHASE 5 PROCESSING.');
-
- /* CALCULATE THE RELATION, IS-FOLLOWED-DIRECTLY-BY. */
- CALL ZEROAR(ADDR(ARRAY1));
- PUT SKIP LIST('CALCULATING IS-FOLLOWED-DIRECTLY-BY...');
- CALL CALC_IFDB; /*CALCULATE THE RELATION.*/
- CALL PRTARY('*** IS-FOLLOWED-DIRECTLY-BY RELATION ***',TRUE,
- NUMVOC,NUMVOC,ADDR(ARRAY1));
- PUT SKIP LIST('SAVING THE RELATION...');
- CALL SAVARY(ADDR(ARRAY1),'T03');
-
- /* CALCULATE THE RELATION, IS-DIRECT-END-OF. */
- CALL ZEROAR(ADDR(ARRAY1));
- PUT SKIP LIST('CALCULATING IS-DIRECT-END-OF...');
- CALL CALC_IDEO; /*CALCULATE THE RELATION.*/
- CALL PRTARY('*** IS-DIRECT-END-OF RELATION ***',TRUE,
- NUMVOC,NUMVOC,ADDR(ARRAY1));
-
- /* CALCULATE THE RELATION, IS-END-OF. */
- PUT SKIP LIST('CALCULATING IS-END-OF...');
- CALL CALC_IEO; /*CALCULATE THE RELATION.*/
- CALL PRTARY('*** IS-END-OF RELATION ***',TRUE,
- NUMVOC,NUMVOC,ADDR(ARRAY1));
- PUT SKIP LIST('SAVING THE RELATION...');
- CALL SAVARY(ADDR(ARRAY1),'T04');
-
- /* RETURN TO CALLER. */
- PUT SKIP LIST('PHASE 5 PROCESSING COMPLETE.');
- END LL1P50;
-