home *** CD-ROM | disk | FTP | other *** search
- LL1P80: PROC;
- /****************************************************************
- * LL(1) GRAMMAR ANALYZER - PHASE 8 *
- *PURPOSE: *
- * THIS PROGRAM VALIDATES THAT THE GRAMMAR ANALYZED WAS IN- *
- * DEED LL(1). THIS IS DONE BY INSURING THAT THE SELECTION *
- * SETS OF ALL PRODUCTIONS WITH THE SAME LEFT-HAND-SIDE ARE *
- * DISJOINT (I.E. HAVE NO COMMON ELEMENTS). *
- *INPUT: *
- * 1) BASIC GRAMMAR TABLES *
- * 2) NULLABLE NON-TERMINALS AND PRODUCTIONS TABLES *
- * 3) ARRAY2 = THE SELECTION SET FOR ALL PRODUCTIONS *
- *OUTPUT: *
- *OUTLINE: *
- *REMARKS: *
- ****************************************************************/
-
- /****************************************************************
- * * * * * * * * * * * COMMON DATA DEFINITIONS * * * * * * * * * *
- ****************************************************************/
-
- /* * * * COMMON REPLACEMENTS * * * */
- %REPLACE TRUE BY '1'B;
- %REPLACE FALSE BY '0'B;
-
- %INCLUDE 'LL1CMN.DCL'; /* GET COMMON AREAS. */
- DCL NUM_ERR FIXED;
-
-
- /****************************************************************
- * * * * * * * * * * * COMMON PROCUDURES * * * * * * * * * * * * *
- ****************************************************************/
-
-
- %INCLUDE 'LL1PRC.DCL';
-
-
- /****************************************************************
- * * * * * * * * * * GRAMMAR ANALYSIS PROCEDURES * * * * * * * * *
- ****************************************************************/
-
-
- VALD_SS: PROC;
- /*THIS ROUTINE IS VALIDATES THAT ALL SELECTION SETS FOR */
- /*EACH NON-TERMINAL ARE DISJOINT. */
- DCL I FIXED; /* INDICES */
- DCL J FIXED;
- DCL K FIXED;
- DCL L FIXED;
- DCL SAMLHS(256) BIN(15);
- DCL NUMSAM BIN(15);
- DCL CURNTRM CHAR;
- DCL TMPSET(32) BIT(8);
- DCL DISJNT BIT(1);
-
- /* MAIN LOOP - LOOP FOR ALL NONTERMINALS. */
- DO I=1 TO LENGTH(NTRM);
- CURNTRM=SUBSTR(NTRM,I,1);
-
- /* FIND ALL PRODUCTIONS FOR THIS NON-TERMINAL WHERE IT IS THE LHS. */
- NUMSAM=0;
- DO J=1 TO NUMPRD;
- IF CURNTRM=LHS(J) THEN /**NON-TERMINAL IS LHS**/
- DO;
- NUMSAM=NUMSAM+1;
- SAMLHS(NUMSAM)=J; /*SAVE PRODUCTION NUMBER.*/
- END;
- END;
-
- /* INSURE THAT ALL SELECTION SETS FOR THIS NON-TERMINAL ARE DISJOINT. */
- IF NUMSAM<2 THEN /*NOT ENOUGH SETS*/
- ;
- ELSE
- DO J=1 TO NUMSAM-1; /*LOOP FOR EACH SET*/
- DO K=J+1 TO NUMSAM; /*LOOP FOR REMAINING SETS*/
- DO L=1 TO 32; /*FIND COMMON ELEMENTS*/
- TMPSET(L)=ARRAY2(SAMLHS(J),L) & ARRAY2(SAMLHS(K),L);
- END;
- DISJNT=TRUE; /*DEFAULT TO DISJOINT*/
- DO L=1 TO 32;
- IF TMPSET(L)='00000000'B THEN /**DISJOINT**/
- ;
- ELSE
- DO;
- DISJNT=FALSE;
- L=32;
- END;
- END;
- IF DISJNT THEN
- ;
- ELSE
- DO;
- NUM_ERR=NUM_ERR+1;
- PUT FILE(LSTFIL) SKIP
- LIST('***WARNING: THE SELECTION SET FOR',
- ' PRODUCTIONS',SAMLHS(J),' AND',SAMLHS(K),
- ' ARE NOT DISJOINT!!!');
- END;
- END;
- END;
-
- /* END OF MAIN LOOP */
- END;
-
- /* RETURN TO CALLER. */
- END VALD_SS;
-
-
- /****************************************************************
- * * * * * * * * * * * GRAMMAR PRINT PROCUDURES * * * * * * * * **
- ****************************************************************/
-
- PRINT_PRODUCTIONS: PROC;
- /*THIS ROUTINE IS RESPONSIBLE FOR PRINTING THE VOCABULARY. */
- DCL I BIN(15); /* INDEXES */
- DCL J BIN(15);
- DCL K BIN(15);
- DCL NUM_LINES BIN(15); /* MAXIMUM NUMBER OF LINES */
- DCL LHS_ENT CHAR(10) VARYING;
- DCL RHS_ENT(5) CHAR(10) VARYING;
-
- /* OUTPUT THE HEADING. */
- ON ENDPAGE(LSTFIL)
- BEGIN;
- PUT FILE(LSTFIL) PAGE;
- PUT FILE(LSTFIL) SKIP(3)
- EDIT('*** PRODUCTION LISTING W/SELECTION SETS***','PAGE',
- PAGENO(LSTFIL)-1)
- (X(20),A(42),X(10),A(4),F(4));
- PUT FILE(LSTFIL) SKIP(1);
- END;
- SIGNAL ENDPAGE(LSTFIL);
-
- /* PRINT THE REPORT LINES. */
- PUT FILE(LSTFIL) SKIP(1)
- EDIT('STARTING SYMBOL: ',VOC(CHRNUM(STRSYM)))
- (X(14),A(17),A(10));
- DO I=1 TO NUMPRD;
- LHS_ENT=VOC(CHRNUM(LHS(I)));
- DO J=1 TO 5;
- IF J>LENGTH(RHS(I)) THEN
- RHS_ENT(J)='';
- ELSE
- RHS_ENT(J)=VOC(CHRNUM(SUBSTR(RHS(I),J,1)));
- END;
- PUT FILE(LSTFIL) SKIP(1)
- EDIT(I,LHS_ENT,' -> ',(RHS_ENT(J) DO J=1 TO 5),';')
- (F(4),X(01),A,A(04),5(A,X(01)),A(1));
- PUT FILE(LSTFIL) SKIP(1) EDIT('{') (X(20),A);
- K=0;
- DO J=LENGTH(NTRM)+1 TO NUMVOC;
- IF TSTBIT(I,J,ADDR(ARRAY2)) THEN
- DO;
- K=K+1;
- IF K>9 THEN
- DO;
- PUT FILE(LSTFIL) SKIP EDIT(' ') (X(20),A);
- K=0;
- END;
- PUT FILE(LSTFIL) LIST(VOC(J)||' ');
- END;
- END;
- IF TSTBIT(I,NUMVOC+1,ADDR(ARRAY2)) THEN
- PUT FILE(LSTFIL) LIST('''_|_'' }');
- ELSE
- PUT FILE(LSTFIL) LIST('}');
- PUT FILE(LSTFIL) SKIP;
- END;
-
- END PRINT_PRODUCTIONS;
-
-
- /****************************************************************
- * * * * * * * * * * * MAIN LINE PROCEDURE * * * * * * * * * * * *
- ****************************************************************/
-
-
- /* ANALYZE THE GRAMMAR. */
- PUT SKIP LIST('BEGINNING PHASE 8 PROCESSING.');
- PUT FILE(LSTFIL) PAGE;
-
- /* CALCULATE THE SELECTION SET. */
- PUT SKIP LIST('VALIDATING THE SELECTION SETS...');
- NUM_ERR=0;
- CALL VALD_SS; /*VALIDATE THE RELATION.*/
-
- /* PRINT THE PRODUCTIONS IF NO ERRORS. */
- PUT SKIP LIST('PRINTING THE PRODUCTIONS...');
- IF NUM_ERR=0 THEN
- CALL PRINT_PRODUCTIONS; /*VALIDATE THE RELATION.*/
-
- /* RETURN TO CALLER. */
- PUT FILE(LSTFIL) SKIP LIST('THERE WERE',NUM_ERR,' ERRORS FOUND.');
- PUT SKIP LIST('THERE WERE',NUM_ERR,' ERRORS FOUND.');
- PUT SKIP LIST('PHASE 8 PROCESSING COMPLETE.');
- END LL1P80;
-