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

  1. LL1P50: PROC;
  2. /****************************************************************
  3. *               LL(1) GRAMMAR ANALYZER - PHASE 5        *
  4. *PURPOSE:                                                       *
  5. *    THIS PROGRAM ANALYZES A LL(1) GRAMMAR GIVEN IN MODIFIED    *
  6. *    BNF FORMAT AND FINDS THE RELATION, IS-FOLLOWED-DIRECTLY-   *
  7. *    BY, IS-DIRECT-END-OF AND IS-END-OF.            *
  8. *INPUT:                                                         *
  9. *    1) BASIC GRAMMAR TABLES                    *
  10. *    2) NULLABLE NON-TERMINALS AND PRODUCTIONS TABLES        *
  11. *OUTPUT:                                                        *
  12. *    1) FILE, $1.T03, CONTAINS THE IS-FOLLOWED-DIRECTLY-BY    *
  13. *       RELATION.                        *
  14. *    2) FILE, $1.T04, CONTAINS THE IS-END-OF RELATION.        *
  15. *OUTLINE:                                                       *
  16. *REMARKS:                                                       *
  17. ****************************************************************/
  18.  
  19. /****************************************************************
  20. * * * * * * * * * * * COMMON DATA DEFINITIONS * * * * * * * * * *
  21. ****************************************************************/
  22.  
  23. /*    * * *  COMMON REPLACEMENTS  * * *    */
  24. %REPLACE TRUE BY '1'B;
  25. %REPLACE FALSE BY '0'B;
  26.  
  27. %INCLUDE 'LL1CMN.DCL';    /* GET COMMON AREAS. */
  28.  
  29.  
  30. /****************************************************************
  31. * * * * * * * * * * * COMMON PROCUDURES * * * * * * * * * * * * *
  32. ****************************************************************/
  33.  
  34.  
  35. %INCLUDE 'LL1PRC.DCL';
  36.  
  37.  
  38. /****************************************************************
  39. * * * * * * * * * * GRAMMAR ANALYSIS PROCEDURES * * * * * * * * *
  40. ****************************************************************/
  41.  
  42.  
  43. CALC_IFDB: PROC;
  44. /*THIS ROUTINE IS RESPONSIBLE FOR CALCULATING THE RELATION*/
  45. /*IS-FOLLOWED-DIRECTLY-BY.  IF SYMBOL, A, COMES BEFORE THE*/
  46. /*SYMBOL,B, ON THE RIGTH-HAND-SIDE OF A PRODUCTION OR ALL */
  47. /*SYMBOLS BETWEEN A AND B ARE NULLABLE. */
  48.     DCL I BIN(15);        /* INDEXES */
  49.     DCL J BIN(15);
  50.     DCL K BIN(15);
  51.  
  52. /* CALCULATE THE RELATION. */
  53.     DO I=1 TO NUMPRD;    /* LOOP THRU ALL PRODUCTIONS. */
  54.        IF LENGTH(RHS(I))=0 THEN /*EPSILON PRODUCTION*/
  55.           ;
  56.        ELSE
  57.           DO J=1 TO LENGTH(RHS(I))-1;
  58.          DO K=J+1 TO LENGTH(RHS(I));
  59.             CALL SETBIT(CHRNUM(SUBSTR(RHS(I),J,1)),
  60.                   CHRNUM(SUBSTR(RHS(I),K,1)),ADDR(ARRAY1));
  61.                 IF ISNLNT(SUBSTR(RHS(I),K,1)) THEN
  62.                    ;
  63.             ELSE
  64.                K=LENGTH(RHS(I));
  65.          END;
  66.           END;
  67.     END;
  68.  
  69. /* RETURN TO CALLER. */
  70.     END CALC_IFDB;
  71.  
  72.  
  73. CALC_IDEO: PROC;
  74. /*THIS ROUTINE IS RESPONSIBLE FOR CALCULATING THE RELATION*/
  75. /*IS-DIRECTLY-END-OF.  WE SAY THAT IS-DIRECTLY-END-OF IS  */
  76. /*SIMPLY THE RIGHT TO LEFT VERSION OF THE RELATION,       */
  77. /*BEGINS-DIRECTLY-WITH. */
  78.     DCL I BIN(15);        /* INDEXES */
  79.     DCL J BIN(15);
  80.  
  81. /* CALCULATE THE RELATION. */
  82.     DO I=1 TO NUMPRD;    /* LOOP THRU ALL PRODUCTIONS. */
  83.        IF LENGTH(RHS(I))=0 THEN /*EPSILON PRODUCTION*/
  84.           ;
  85.        ELSE
  86.           DO J=LENGTH(RHS(I)) TO 1 BY -1;
  87.          CALL SETBIT(CHRNUM(SUBSTR(RHS(I),J,1)),
  88.                   CHRNUM(LHS(I)),ADDR(ARRAY1));
  89.              IF ISNLNT(SUBSTR(RHS(I),J,1)) THEN
  90.                 ;
  91.          ELSE
  92.             J=1;
  93.           END;
  94.     END;
  95.  
  96. /* RETURN TO CALLER. */
  97.     END CALC_IDEO;
  98.  
  99.  
  100. CALC_IEO: PROC;
  101. /*THIS ROUTINE IS RESPONSIBLE FOR CALCULATING THE RELATION*/
  102. /*IS-END-OF.  IS-END-OF IS THE REFLEXIVE TRANSITIVE   */
  103. /*CLOSURE OF THE RELATION, IS-DIRECTLY-END-OF. */
  104.  
  105. /* CALCULATE IT. */
  106.     CALL CLOSUR(ADDR(ARRAY1));
  107.  
  108. /* RETURN TO CALLER. */
  109.     END CALC_IEO;
  110.  
  111.  
  112. /****************************************************************
  113. * * * * * * * * * * * MAIN LINE PROCEDURE * * * * * * * * * * * *
  114. ****************************************************************/
  115.  
  116.  
  117. /* ANALYZE THE GRAMMAR. */
  118.     PUT SKIP LIST('BEGINNING PHASE 5 PROCESSING.');
  119.  
  120. /* CALCULATE THE RELATION, IS-FOLLOWED-DIRECTLY-BY. */
  121.     CALL ZEROAR(ADDR(ARRAY1)); 
  122.     PUT SKIP LIST('CALCULATING IS-FOLLOWED-DIRECTLY-BY...');
  123.     CALL CALC_IFDB;        /*CALCULATE THE RELATION.*/
  124.     CALL PRTARY('*** IS-FOLLOWED-DIRECTLY-BY RELATION ***',TRUE,
  125.              NUMVOC,NUMVOC,ADDR(ARRAY1));
  126.     PUT SKIP LIST('SAVING THE RELATION...');
  127.     CALL SAVARY(ADDR(ARRAY1),'T03');
  128.  
  129. /* CALCULATE THE RELATION, IS-DIRECT-END-OF. */
  130.     CALL ZEROAR(ADDR(ARRAY1)); 
  131.     PUT SKIP LIST('CALCULATING IS-DIRECT-END-OF...');
  132.     CALL CALC_IDEO;        /*CALCULATE THE RELATION.*/
  133.     CALL PRTARY('*** IS-DIRECT-END-OF RELATION ***',TRUE,
  134.              NUMVOC,NUMVOC,ADDR(ARRAY1));
  135.  
  136. /* CALCULATE THE RELATION, IS-END-OF. */
  137.     PUT SKIP LIST('CALCULATING IS-END-OF...');
  138.     CALL CALC_IEO;        /*CALCULATE THE RELATION.*/
  139.     CALL PRTARY('*** IS-END-OF RELATION ***',TRUE, 
  140.              NUMVOC,NUMVOC,ADDR(ARRAY1));
  141.     PUT SKIP LIST('SAVING THE RELATION...');
  142.     CALL SAVARY(ADDR(ARRAY1),'T04');
  143.  
  144. /* RETURN TO CALLER. */
  145.     PUT SKIP LIST('PHASE 5 PROCESSING COMPLETE.');
  146.     END LL1P50;
  147.