home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol039
/
ll1p50.pli
< prev
next >
Wrap
Text File
|
1984-04-29
|
5KB
|
147 lines
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;