home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol039
/
ll1prc.pli
< prev
next >
Wrap
Text File
|
1984-04-29
|
13KB
|
470 lines
LL1PRC: PROC;
/****************************************************************
* LL(1) GRAMMAR ANALYZER - COMMON PROCEDURES *
*PURPOSE: *
* THIS PROGRAM CONTAINS THE COMMON PROCEDURES USES BY *
* MOST OF THE OTHER PHASES. *
*INPUT: *
*OUTPUT: *
*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 * * * * * * * * * * * * *
****************************************************************/
/********************* CHR_TO_NUM ******************************/
CHRNUM: PROC (L) RETURNS(BIN(15)) EXTERNAL;
/* THIS ROUTINE IS RESPONSIBLE FOR CONVERTING A CHARACTER */
/* TO A BINARY NUMBER. */
DCL J BIN(15); /* LOOP INDEX */
DCL K BIT(16); /* INTERMEDIATE BIT VALUE */
DCL L CHAR; /* INTERMEDIATE CHAR VALUE */
DCL M BIT(8);
M=UNSPEC(L);
K='0000'B4;
SUBSTR(K,9,8)=M;
UNSPEC(J)=K;
/* RETURN TO CALLER WITH CHARACTER. */
RETURN(J);
END CHRNUM;
/********************* CLOSURE ******************************/
CLOSUR: PROC(ARRAY_PTR) EXTERNAL;
/*THIS ROUTINE IS RESPONSIBLE FOR CALCULATING THE REFLEXIVE */
/*TRANSITIVE CLOSURE OF THE ARRAY SPECIFIED. */
DCL I FIXED; /* INDICES */
DCL J FIXED;
DCL K FIXED;
DCL LIMIT FIXED;
DCL ARRAY_PTR PTR;
/* PUT IN THE IDENTITY MATRIX. */
LIMIT=LENGTH(NTRM)+LENGTH(TRM);
DO I=1 TO LIMIT;
CALL SETBIT(I,I,ARRAY_PTR);
END;
/* COMPUTE THE REFLEXIVE TRANSITIVE CLOSURE. */
DO I=1 TO LIMIT;
DO J=1 TO LIMIT;
IF TSTBIT(J,I,ARRAY_PTR) THEN
DO K=1 TO LIMIT;
IF TSTBIT(J,K,ARRAY_PTR) | TSTBIT(I,K,ARRAY_PTR) THEN
CALL SETBIT(J,K,ARRAY_PTR);
END;
END;
END;
/* RETURN TO CALLER. */
END CLOSUR;
/********************* IS_NTRM ******************************/
ISNTRM: PROC (X) RETURNS(BIT(1)) EXTERNAL;
/* THIS ROUTINE INDICATES IF A VOCABULARY ELEMENT IS */
/* A NON-TERMINAL. */
DCL X CHAR; /* INPUT INDEX */
DCL I FIXED; /* INTERNAL INDEX */
IF LENGTH(NTRM)=0 THEN
RETURN(FALSE);
DO I=1 TO LENGTH(NTRM);
IF X=SUBSTR(NTRM,I,1) THEN
RETURN(TRUE);
END;
RETURN(FALSE);
END ISNTRM;
/********************* IS_NLNTRM ******************************/
ISNLNT: PROC (X) RETURNS(BIT(1)) EXTERNAL;
/* THIS ROUTINE INDICATES IF A VOCABULARY ELEMENT IS */
/* A NULLABLE NON-TERMINAL. */
DCL X CHAR; /* INPUT INDEX */
DCL I FIXED; /* INTERNAL INDEX */
IF LENGTH(NLNTRM)=0 THEN
RETURN(FALSE);
IF ISNTRM(X)=FALSE THEN /*NOT A NON-TERMINAL*/
RETURN(FALSE);
DO I=1 TO LENGTH(NLNTRM);
IF X=SUBSTR(NLNTRM,I,1) THEN
RETURN(TRUE);
END;
RETURN(FALSE);
END ISNLNT;
/********************* IS_TRM ******************************/
ISTRM: PROC (X) RETURNS(BIT(1)) EXTERNAL;
/* THIS ROUTINE INDICATES IF A VOCABULARY ELEMENT IS TERMINAL. */
DCL X CHAR; /* INPUT INDEX */
DCL I FIXED; /* INTERNAL INDEX */
IF LENGTH(TRM)=0 THEN
RETURN(FALSE);
DO I=1 TO LENGTH(TRM);
IF X=SUBSTR(TRM,I,1) THEN
RETURN(TRUE);
END;
RETURN(FALSE);
END ISTRM;
/********************* MULTREL ******************************/
MULREL: PROC EXTERNAL;
/*THIS ROUTINE IS RESPONSIBLE FOR MULTIPLYING TWO RELATION- */
/*SHIPS TOGETHER. */
DCL I FIXED; /* INDICES */
DCL J FIXED;
DCL K FIXED;
DCL LIMIT FIXED;
DCL ARRAY_PTR PTR;
DCL ARRAY3(256,32) BIT(8) BASED(ARRAY_PTR);
/* DO INITIALIZATION. */
LIMIT=LENGTH(NTRM)+LENGTH(TRM); /*GET ARRAY SIZE.*/
ALLOCATE ARRAY3 SET(ARRAY_PTR);
CALL ZEROAR(ARRAY_PTR);
/* MULTIPLY ARRAY1 BY ARRAY2. */
DO J=1 TO LIMIT;
DO I=1 TO LIMIT;
IF TSTBIT(I,J,ADDR(ARRAY1)) THEN
DO K=1 TO LIMIT;
IF TSTBIT(J,K,ADDR(ARRAY2)) THEN
CALL SETBIT(I,K,ARRAY_PTR);
END;
END;
END;
/* PUT THE PRODUCT BACK IN ARRAY1. */
DO I=1 TO LIMIT;
DO J=1 TO 32;
ARRAY1(I,J)=ARRAY3(I,J);
END;
END;
FREE ARRAY3;
/* RETURN TO CALLER. */
END MULREL;
/********************* NUM_TO_CHR ******************************/
NUMCHR: PROC (J) RETURNS(CHAR) EXTERNAL;
/* THIS ROUTINE IS RESPONSIBLE FOR CONVERTING A BINARY*/
/* NUMBER TO A CHARACTER.*/
DCL J BIN(15); /* LOOP INDEX */
DCL K BIT(16); /* INTERMEDIATE BIT VALUE */
DCL L CHAR; /* INTERMEDIATE CHAR VALUE */
UNSPEC(K)=J;
UNSPEC(L)=SUBSTR(K,8,8);
/* RETURN TO CALLER WITH CHARACTER. */
RETURN(L);
END NUMCHR;
/********************* PRINT_ARRAY ******************************/
PRTARY: PROC(HEADING,PHS,HORNUM,VERNUM,ARRAY_PTR) EXTERNAL;
/*THIS ROUTINE IS RESPONSIBLE FOR PRINTING THE RELATION */
/*DEFINED BY ARRAY1. */
DCL I BIN(15); /* INDEXES */
DCL J BIN(15);
DCL COL_FROM FIXED;
DCL COL_TO FIXED;
DCL LIN_FROM FIXED;
DCL LIN_TO FIXED;
DCL HEADING CHAR(40) VARYING;
DCL PHS BIT(1); /* PRINT HORIZONTAL SYMBOL FLAG */
DCL HORNUM FIXED; /* NUMBER OF HORIZONTAL LINES */
DCL VERNUM FIXED; /* NUMBER OF VERTICAL LINES */
DCL ARRAY_PTR PTR;
/* PRINT HEADING. */
PRINT_HDNG: PROC(COL_FROM,COL_TO);
DCL I FIXED;
DCL J FIXED;
DCL COL_FROM FIXED;
DCL COL_TO FIXED;
DCL LINE_OUT CHAR(130) VARYING;
/* PRINT STANDARD HEADER. */
PUT FILE(LSTFIL) PAGE;
PUT FILE(LSTFIL) SKIP(3)
EDIT(HEADING,'PAGE',PAGENO(LSTFIL)-1)
(X(15),A(37),X(10),A(4),F(4));
PUT FILE(LSTFIL) SKIP(1);
/* PRINT LINES OF SYMBOL NUMBERS FOR HORIZONTAL. */
I=100;
DO WHILE(I>0);
LINE_OUT='';
DO J=COL_FROM TO COL_TO;
IF J<I THEN
LINE_OUT=LINE_OUT || ' ';
ELSE
LINE_OUT=LINE_OUT || ASCII(48+MOD(J/I,10));
END;
PUT FILE(LSTFIL) SKIP EDIT(LINE_OUT) (X(20),A);
I=I/10;
END;
/* PRINT TOP SEPERATOR LINE. */
CALL PRINT_SEP(COL_FROM,COL_TO);
/* RETURN TO CALLER. */
END PRINT_HDNG;
/* PRINT THE CURRENT LINE. */
PRINT_LINE: PROC(COL_CUR,COL_FROM,COL_TO);
DCL I FIXED;
DCL COL_CUR FIXED;
DCL COL_FROM FIXED;
DCL COL_TO FIXED;
DCL LINE_OUT CHAR(130) VARYING;
DCL SYMBOL CHAR(10) VARYING;
/* BUILD MATRIX PART OF LINE. */
LINE_OUT='';
DO I=COL_FROM TO COL_TO;
IF TSTBIT(COL_CUR,I,ARRAY_PTR) THEN
LINE_OUT=LINE_OUT || '1';
ELSE
LINE_OUT=LINE_OUT || '0';
END;
/* PRINT THE LINE. */
IF PHS THEN
SYMBOL=VOC(COL_CUR);
ELSE
SYMBOL='';
PUT FILE(LSTFIL) SKIP EDIT(COL_CUR,SYMBOL,'|',LINE_OUT,'|')
(X(04),F(4),X(01),A(10),A(1),A,A(1));
/* RETURN TO CALLER. */
END PRINT_LINE;
PRINT_SEP: PROC(COL_FROM,COL_TO);
DCL I FIXED;
DCL J FIXED;
DCL COL_FROM FIXED;
DCL COL_TO FIXED;
DCL LINE_OUT CHAR(130) VARYING;
/* PRINT SEPERATOR LINE. */
LINE_OUT='+';
DO I=COL_FROM TO COL_TO;
LINE_OUT=LINE_OUT || '-';
END;
LINE_OUT=LINE_OUT || '+';
PUT FILE(LSTFIL) SKIP EDIT(LINE_OUT) (X(19),A);
/* RETURN TO CALLER. */
END PRINT_SEP;
/* OUTPUT THE HEADING. */
ON ENDPAGE(LSTFIL)
BEGIN;
CALL PRINT_HDNG(COL_FROM,COL_TO);
END;
/* PRINT THE REPORT PAGE. */
LIN_FROM=1; /* SET MARGINS. */
DO WHILE(LIN_FROM<HORNUM); /* PRINT HORIZONTAL LINES. */
LIN_TO=MIN(HORNUM,55+LIN_FROM);
COL_FROM=1;
DO WHILE(COL_FROM<VERNUM); /* PRINT VERTICAL LINES. */
COL_TO=MIN(VERNUM,55+COL_FROM);
SIGNAL ENDPAGE(LSTFIL);
DO I=LIN_FROM TO LIN_TO; /* PRINT THE PAGE. */
CALL PRINT_LINE(I,COL_FROM,COL_TO);
END;
CALL PRINT_SEP(COL_FROM,COL_TO);
COL_FROM=COL_FROM+56;
END;
LIN_FROM=LIN_FROM+56;
END;
/* RETURN TO CALLER. */
END PRTARY;
/********************* RESET_BIT ******************************/
RSTBIT: PROC(X,Y,ARRAY_PTR) EXTERNAL;
/*THIS ROUTINE IS RESPONSIBLE FOR RESETING ON THE BIT DENOTED */
/*BY THE X,Y COORDINATES IN THE ARRAY SPECIFIED. */
DCL I FIXED; /* INDICES */
DCL J FIXED;
DCL K FIXED;
DCL X BIN(15); /* INDICES */
DCL Y BIN(15);
DCL ARRAY_PTR PTR;
DCL ARRAY(256,32) BIT(8) BASED(ARRAY_PTR);
/* DEVELOP ACTUAL ARRAY ELEMENT USING X,Y COORDINATES. */
I=X; /* VERTICAL */
J=(Y/8)+1; /* HORIZONTAL - BYTE */
K=MOD(Y,8)+1; /* HORIZONTAL - BIT */
/* SET THE BIT IN THE ARRAY. */
SUBSTR(ARRAY(I,J),K,1)=FALSE;
/* RETURN TO CALLER. */
END RSTBIT;
/********************* RESTORE_ARRAY ******************************/
RSTARY: PROC(ARRAY_PTR,FILE_TYPE) EXTERNAL;
/* THIS ROUTINE IS RESPONSIBLE FOR RESTORING AN ARRAY. */
DCL I FIXED; /* INDICES */
DCL J FIXED;
DCL BW_FILE FILE;
DCL FILE_TYPE CHAR(3);
DCL FILE_NAME CHAR(20) VARYING;
DCL ARRAY_PTR PTR;
DCL ARRAY(64) CHAR(128) BASED(ARRAY_PTR);
/* OPEN THE FILE. */
FILE_NAME='$1.'||FILE_TYPE;
OPEN FILE(BW_FILE) DIRECT INPUT TITLE(FILE_NAME)
ENV(F(128));
/* WRITE THE ARRAY TO IT. */
DO I=0 TO 63;
READ FILE(BW_FILE) INTO(ARRAY(I+1)) KEY(I);
END;
/* SAVE THE FILE. */
CLOSE FILE(BW_FILE);
/* RETURN TO CALLER. */
END RSTARY;
/********************* SAVE_ARRAY ******************************/
SAVARY: PROC(ARRAY_PTR,FILE_TYPE) EXTERNAL;
/* THIS ROUTINE IS RESPONSIBLE FOR SAVING AN ARRAY. */
DCL I FIXED; /* INDICES */
DCL J FIXED;
DCL BW_FILE FILE;
DCL FILE_TYPE CHAR(3);
DCL FILE_NAME CHAR(20) VARYING;
DCL ARRAY_PTR PTR;
DCL ARRAY(64) CHAR(128) BASED(ARRAY_PTR);
/* OPEN THE FILE. */
FILE_NAME='$1.'||FILE_TYPE;
OPEN FILE(BW_FILE) DIRECT OUTPUT TITLE(FILE_NAME)
ENV(F(128));
/* WRITE THE ARRAY TO IT. */
DO I=0 TO 63;
WRITE FILE(BW_FILE) FROM(ARRAY(I+1)) KEYFROM(I);
END;
/* SAVE THE FILE. */
CLOSE FILE(BW_FILE);
/* RETURN TO CALLER. */
END SAVARY;
/********************* SET_BIT ***************************/
SETBIT: PROC(X,Y,ARRAY_PTR) EXTERNAL;
/*THIS ROUTINE IS RESPONSIBLE FOR SETING ON THE BIT DENOTED */
/*BY THE X,Y COORDINATES IN THE ARRAY SPECIFIED. */
DCL I FIXED; /* INDICES */
DCL J FIXED;
DCL K FIXED;
DCL X BIN(15); /* INDICES */
DCL Y BIN(15);
DCL ARRAY_PTR PTR;
DCL ARRAY(256,32) BIT(8) BASED(ARRAY_PTR);
/* DEVELOP ACTUAL ARRAY ELEMENT USING X,Y COORDINATES. */
I=X; /* VERTICAL */
J=(Y/8)+1; /* HORIZONTAL - BYTE */
K=MOD(Y,8)+1; /* HORIZONTAL - BIT */
/* SET THE BIT IN THE ARRAY. */
SUBSTR(ARRAY(I,J),K,1)=TRUE;
/* RETURN TO CALLER. */
END SETBIT;
/********************* TEST_BIT ***************************/
TSTBIT: PROC(X,Y,ARRAY_PTR) RETURNS(BIT(1)) EXTERNAL;
/*THIS ROUTINE IS RESPONSIBLE FOR TESTING THE BIT DENOTED */
/*BY THE X,Y COORDINATES IN THE ARRAY SPECIFIED. */
DCL I FIXED; /* INDICES */
DCL J FIXED;
DCL K FIXED;
DCL X BIN(15); /* INDICES */
DCL Y BIN(15);
DCL ARRAY_PTR PTR;
DCL ARRAY(256,32) BIT(8) BASED(ARRAY_PTR);
/* DEVELOP ACTUAL ARRAY ELEMENT USING X,Y COORDINATES. */
I=X; /* VERTICAL */
J=(Y/8)+1; /* HORIZONTAL - BYTE */
K=MOD(Y,8)+1; /* HORIZONTAL - BIT */
/* RETURN THE BIT IN THE ARRAY. */
RETURN(SUBSTR(ARRAY(I,J),K,1));
/* RETURN TO CALLER. */
END TSTBIT;
/********************* ZERO_ARRAY ***************************/
ZEROAR: PROC(ARRAY_PTR) EXTERNAL;
/*THIS ROUTINE IS RESPONSIBLE FOR ZEROING THE ARRAY SPECIFIED. */
DCL I FIXED; /* INDICES */
DCL J FIXED;
DCL ARRAY_PTR PTR;
DCL ARRAY(256,32) BIT(8) BASED(ARRAY_PTR);
/* ZERO THE ARRAY. */
DO I=1 TO 256;
DO J=1 TO 32;
ARRAY(I,J)='00000000'B;
END;
END;
/* RETURN TO CALLER. */
END ZEROAR;
/****************************************************************
* * * * * * * * * * * MAIN ROUTINE * * * * * * * * * * * * * * *
****************************************************************/
END LL1PRC;