home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol039 / ll1p80.pli < prev    next >
Encoding:
Text File  |  1984-04-29  |  5.9 KB  |  197 lines

  1. LL1P80: PROC;
  2. /****************************************************************
  3. *               LL(1) GRAMMAR ANALYZER - PHASE 8        *
  4. *PURPOSE:                                                       *
  5. *    THIS PROGRAM VALIDATES THAT THE GRAMMAR ANALYZED WAS IN-   *
  6. *    DEED LL(1).  THIS IS DONE BY INSURING THAT THE SELECTION    *
  7. *    SETS OF ALL PRODUCTIONS WITH THE SAME LEFT-HAND-SIDE ARE    *
  8. *    DISJOINT (I.E. HAVE NO COMMON ELEMENTS).            *
  9. *INPUT:                                                         *
  10. *    1) BASIC GRAMMAR TABLES                    *
  11. *    2) NULLABLE NON-TERMINALS AND PRODUCTIONS TABLES        *
  12. *    3) ARRAY2 = THE SELECTION SET FOR ALL PRODUCTIONS        *
  13. *OUTPUT:                                                        *
  14. *OUTLINE:                                                       *
  15. *REMARKS:                                                       *
  16. ****************************************************************/
  17.  
  18. /****************************************************************
  19. * * * * * * * * * * * COMMON DATA DEFINITIONS * * * * * * * * * *
  20. ****************************************************************/
  21.  
  22. /*    * * *  COMMON REPLACEMENTS  * * *    */
  23. %REPLACE TRUE BY '1'B;
  24. %REPLACE FALSE BY '0'B;
  25.  
  26. %INCLUDE 'LL1CMN.DCL';    /* GET COMMON AREAS. */
  27.     DCL NUM_ERR FIXED;
  28.  
  29.  
  30. /****************************************************************
  31. * * * * * * * * * * * COMMON PROCUDURES * * * * * * * * * * * * *
  32. ****************************************************************/
  33.  
  34.  
  35. %INCLUDE 'LL1PRC.DCL';
  36.  
  37.  
  38. /****************************************************************
  39. * * * * * * * * * * GRAMMAR ANALYSIS PROCEDURES * * * * * * * * *
  40. ****************************************************************/
  41.  
  42.  
  43. VALD_SS: PROC;
  44. /*THIS ROUTINE IS VALIDATES THAT ALL SELECTION SETS FOR   */
  45. /*EACH NON-TERMINAL ARE DISJOINT.  */
  46.     DCL I FIXED;        /* INDICES */
  47.     DCL J FIXED;
  48.     DCL K FIXED;
  49.     DCL L FIXED;
  50.     DCL SAMLHS(256) BIN(15);
  51.     DCL NUMSAM BIN(15);
  52.     DCL CURNTRM CHAR;
  53.     DCL TMPSET(32) BIT(8);
  54.     DCL DISJNT BIT(1);
  55.  
  56. /* MAIN LOOP - LOOP FOR ALL NONTERMINALS. */
  57.     DO I=1 TO LENGTH(NTRM);
  58.        CURNTRM=SUBSTR(NTRM,I,1);
  59.  
  60. /* FIND ALL PRODUCTIONS FOR THIS NON-TERMINAL WHERE IT IS THE LHS. */
  61.        NUMSAM=0;
  62.        DO J=1 TO NUMPRD;
  63.           IF CURNTRM=LHS(J) THEN    /**NON-TERMINAL IS LHS**/
  64.          DO;
  65.             NUMSAM=NUMSAM+1;
  66.             SAMLHS(NUMSAM)=J;    /*SAVE PRODUCTION NUMBER.*/
  67.          END;
  68.        END;
  69.  
  70. /* INSURE THAT ALL SELECTION SETS FOR THIS NON-TERMINAL ARE DISJOINT. */
  71.        IF NUMSAM<2 THEN    /*NOT ENOUGH SETS*/
  72.           ;
  73.        ELSE
  74.           DO J=1 TO NUMSAM-1; /*LOOP FOR EACH SET*/
  75.          DO K=J+1 TO NUMSAM; /*LOOP FOR REMAINING SETS*/
  76.             DO L=1 TO 32; /*FIND COMMON ELEMENTS*/
  77.                TMPSET(L)=ARRAY2(SAMLHS(J),L) & ARRAY2(SAMLHS(K),L);
  78.             END;
  79.             DISJNT=TRUE; /*DEFAULT TO DISJOINT*/
  80.             DO L=1 TO 32;
  81.                IF TMPSET(L)='00000000'B THEN /**DISJOINT**/
  82.               ;
  83.                ELSE
  84.               DO;
  85.                  DISJNT=FALSE;
  86.                  L=32;
  87.               END;
  88.             END;
  89.             IF DISJNT THEN
  90.                ;
  91.             ELSE
  92.                DO;
  93.               NUM_ERR=NUM_ERR+1;
  94.                           PUT FILE(LSTFIL) SKIP 
  95.                LIST('***WARNING: THE SELECTION SET FOR',
  96.                 ' PRODUCTIONS',SAMLHS(J),' AND',SAMLHS(K),
  97.                 ' ARE NOT DISJOINT!!!');
  98.                END;
  99.          END;
  100.           END;
  101.  
  102. /* END OF MAIN LOOP */
  103.     END;
  104.  
  105. /* RETURN TO CALLER. */
  106.     END VALD_SS;
  107.  
  108.  
  109. /****************************************************************
  110. * * * * * * * * * * * GRAMMAR PRINT PROCUDURES * * * * * * * * **
  111. ****************************************************************/
  112.  
  113. PRINT_PRODUCTIONS: PROC;
  114. /*THIS ROUTINE IS RESPONSIBLE FOR PRINTING THE VOCABULARY. */
  115.     DCL I BIN(15);        /* INDEXES */
  116.     DCL J BIN(15);
  117.     DCL K BIN(15);
  118.     DCL NUM_LINES BIN(15);    /* MAXIMUM NUMBER OF LINES */
  119.     DCL LHS_ENT CHAR(10) VARYING;
  120.     DCL RHS_ENT(5) CHAR(10) VARYING;
  121.  
  122. /* OUTPUT THE HEADING. */
  123.     ON ENDPAGE(LSTFIL)
  124.        BEGIN;
  125.           PUT FILE(LSTFIL) PAGE;
  126.           PUT FILE(LSTFIL) SKIP(3) 
  127.           EDIT('*** PRODUCTION LISTING W/SELECTION SETS***','PAGE',
  128.             PAGENO(LSTFIL)-1)
  129.           (X(20),A(42),X(10),A(4),F(4));
  130.           PUT FILE(LSTFIL) SKIP(1);
  131.        END;
  132.     SIGNAL ENDPAGE(LSTFIL);
  133.  
  134. /* PRINT THE REPORT LINES. */
  135.     PUT FILE(LSTFIL) SKIP(1)
  136.           EDIT('STARTING SYMBOL: ',VOC(CHRNUM(STRSYM)))
  137.           (X(14),A(17),A(10));
  138.     DO I=1 TO NUMPRD;
  139.        LHS_ENT=VOC(CHRNUM(LHS(I)));
  140.        DO J=1 TO 5;
  141.           IF J>LENGTH(RHS(I)) THEN
  142.              RHS_ENT(J)='';
  143.           ELSE
  144.              RHS_ENT(J)=VOC(CHRNUM(SUBSTR(RHS(I),J,1)));
  145.        END;
  146.        PUT FILE(LSTFIL) SKIP(1)
  147.            EDIT(I,LHS_ENT,' -> ',(RHS_ENT(J) DO J=1 TO 5),';')
  148.           (F(4),X(01),A,A(04),5(A,X(01)),A(1));
  149.        PUT FILE(LSTFIL) SKIP(1) EDIT('{') (X(20),A);
  150.        K=0;
  151.        DO J=LENGTH(NTRM)+1 TO NUMVOC;
  152.           IF TSTBIT(I,J,ADDR(ARRAY2)) THEN
  153.          DO;
  154.             K=K+1;
  155.             IF K>9 THEN
  156.                DO;
  157.                   PUT FILE(LSTFIL) SKIP EDIT(' ') (X(20),A);
  158.               K=0;
  159.                END;
  160.             PUT FILE(LSTFIL) LIST(VOC(J)||' ');
  161.          END;
  162.        END;
  163.        IF TSTBIT(I,NUMVOC+1,ADDR(ARRAY2)) THEN
  164.           PUT FILE(LSTFIL) LIST('''_|_'' }');
  165.        ELSE
  166.           PUT FILE(LSTFIL) LIST('}');
  167.        PUT FILE(LSTFIL) SKIP;
  168.     END;
  169.  
  170.         END  PRINT_PRODUCTIONS;
  171.  
  172.  
  173. /****************************************************************
  174. * * * * * * * * * * * MAIN LINE PROCEDURE * * * * * * * * * * * *
  175. ****************************************************************/
  176.  
  177.  
  178. /* ANALYZE THE GRAMMAR. */
  179.     PUT SKIP LIST('BEGINNING PHASE 8 PROCESSING.');
  180.     PUT FILE(LSTFIL) PAGE;
  181.  
  182. /* CALCULATE THE SELECTION SET. */
  183.     PUT SKIP LIST('VALIDATING THE SELECTION SETS...');
  184.     NUM_ERR=0;
  185.     CALL VALD_SS;        /*VALIDATE THE RELATION.*/
  186.  
  187. /* PRINT THE PRODUCTIONS IF NO ERRORS. */
  188.     PUT SKIP LIST('PRINTING THE PRODUCTIONS...');
  189.     IF NUM_ERR=0 THEN
  190.        CALL PRINT_PRODUCTIONS;    /*VALIDATE THE RELATION.*/
  191.  
  192. /* RETURN TO CALLER. */
  193.     PUT FILE(LSTFIL) SKIP LIST('THERE WERE',NUM_ERR,' ERRORS FOUND.');
  194.     PUT SKIP LIST('THERE WERE',NUM_ERR,' ERRORS FOUND.');
  195.     PUT SKIP LIST('PHASE 8 PROCESSING COMPLETE.');
  196.     END LL1P80;
  197.