home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol047 / np.for < prev    next >
Encoding:
Text File  |  1984-04-29  |  4.3 KB  |  181 lines

  1. C RDLINE-    READ INPUT LINE
  2. C
  3. C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
  4. C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
  5. C WRITTEN BY R. M. SUPNIK
  6. C
  7. C DECLARATIONS
  8. C
  9.     SUBROUTINE RDLINE(INBUF,INLNT,WHO)
  10.     IMPLICIT INTEGER(A-Z)
  11.     LOGICAL*1 INBUF(78)
  12. C
  13. C PARSER OUTPUT
  14. C
  15.     LOGICAL PRSWON
  16.     COMMON /PRSVEC/ PRSA,PRSI,PRSO,PRSWON,PRSCON
  17. C
  18.     COMMON /CHAN/ INPCH,OUTCH,DBCH
  19. C
  20. 5    GO TO (90,10),WHO+1            !SEE WHO TO PROMPT FOR.
  21. 10    WRITE(OUTCH,50)                !PROMPT FOR GAME.
  22. 50    FORMAT(' >',$)
  23. C
  24. 90    READ(INPCH,100) INBUF            !GET INPUT.
  25. 100    FORMAT(78A1)
  26. C
  27.     DO 200 INLNT=78,1,-1
  28.       IF(INBUF(INLNT).NE.' ') GO TO 300    !NOT BLANK?
  29. 200    CONTINUE
  30.     GO TO 5                    !TRY AGAIN.
  31. C
  32. 300    DO 400 I=1,INLNT            !CONVERT TO UPPER CASE.
  33.       IF((INBUF(I).GE.'a').AND.(INBUF(I).LE.'z'))
  34.     1    INBUF(I)=INBUF(I)-"40
  35. 400    CONTINUE
  36.     PRSCON=1                !RESTART LEX SCAN.
  37.     RETURN
  38.     END
  39. C PARSE-    TOP LEVEL PARSE ROUTINE
  40. C
  41. C DECLARATIONS
  42. C
  43. C THIS ROUTINE DETAILS ON BIT 0 OF PRSFLG
  44. C
  45.     LOGICAL FUNCTION PARSE(INBUF,INLNT,VBFLAG)
  46.     IMPLICIT INTEGER(A-Z)
  47.     LOGICAL*1 INBUF(78)
  48.     LOGICAL LEX,SYNMCH,DFLAG,VBFLAG
  49.     INTEGER OUTBUF(40)
  50.     COMMON /DEBUG/ DBGFLG,PRSFLG
  51. C
  52. C PARSER OUTPUT
  53. C
  54.     LOGICAL PRSWON
  55.     COMMON /PRSVEC/ PRSA,PRSI,PRSO,PRSWON,PRSCON
  56.     COMMON /LAST/ LASTIT
  57.     COMMON /XSRCH/ XMIN,XMAX,XDOWN,XUP,
  58.     1    XNORTH,XSOUTH,XENTER,XEXIT,XEAST,XWEST
  59. C
  60. D    DFLAG=(PRSFLG.AND."1).NE.0
  61.     PARSE=.FALSE.                !ASSUME FAILS.
  62.     PRSA=0                    !ZERO OUTPUTS.
  63.     PRSI=0
  64.     PRSO=0
  65. C
  66.     IF(.NOT.LEX(INBUF,INLNT,OUTBUF,OUTLNT,VBFLAG)) GO TO 100
  67.     IF(SPARSE(OUTBUF,OUTLNT,VBFLAG)) 100,200,300    !DO SYN SCAN.
  68. C
  69. C PARSE REQUIRES VALIDATION
  70. C
  71. 200    IF(.NOT.VBFLAG) GO TO 350        !ECHO MODE, FORCE FAIL.
  72.     IF(.NOT.SYNMCH(X)) GO TO 100        !DO SYN MATCH.
  73.     IF((PRSO.GT.0).AND.(PRSO.LT.XMIN)) LASTIT=PRSO
  74. C
  75. C SUCCESSFUL PARSE OR SUCCESSFUL VALIDATION
  76. C
  77. 300    PARSE=.TRUE.
  78. 350    CALL ORPHAN(0,0,0,0,0)            !CLEAR ORPHANS.
  79. D    IF(DFLAG) TYPE 10,PARSE,PRSA,PRSO,PRSI
  80. D10    FORMAT(' PARSE RESULTS- ',L7,3I7)
  81.     RETURN
  82. C
  83. C PARSE FAILS, DISALLOW CONTINUATION
  84. C
  85. 100    PRSCON=1
  86. D    IF(DFLAG) TYPE 10,PARSE,PRSA,PRSO,PRSI
  87.     RETURN
  88. C
  89.     END
  90. C ORPHAN- SET UP NEW ORPHANS
  91. C
  92. C DECLARATIONS
  93. C
  94.     SUBROUTINE ORPHAN(O1,O2,O3,O4,O5)
  95.     IMPLICIT INTEGER(A-Z)
  96.     COMMON /ORPHS/ A,B,C,D,E
  97. C
  98.     A=O1                    !SET UP NEW ORPHANS.
  99.     B=O2
  100.     C=O3
  101.     D=O4
  102.     E=O5
  103.     RETURN
  104.     END
  105. C LEX-    LEXICAL ANALYZER
  106. C
  107. C DECLARATIONS
  108. C
  109. C THIS ROUTINE DETAILS ON BIT 1 OF PRSFLAG
  110. C
  111.     LOGICAL FUNCTION LEX(INBUF,INLNT,OUTBUF,OP,VBFLAG)
  112.     IMPLICIT INTEGER(A-Z)
  113.     LOGICAL*1 INBUF(78),J,DLIMIT(9)
  114.     INTEGER OUTBUF(40)
  115.     LOGICAL DFLAG,VBFLAG
  116. C
  117. C PARSER OUTPUT
  118. C
  119.     LOGICAL PRSWON
  120.     COMMON /PRSVEC/ PRSA,PRSI,PRSO,PRSWON,PRSCON
  121. C
  122.     COMMON /DEBUG/ DBGFLG,PRSFLG
  123. C
  124.     DATA DLIMIT/'A','Z',"100,'1','9',"22,'-','-',"22/
  125. C
  126.     DO 100 I=1,40                !CLEAR OUTPUT BUF.
  127.       OUTBUF(I)=0
  128. 100    CONTINUE
  129. C
  130. D    DFLAG=(PRSFLG.AND."2).NE.0
  131.     LEX=.FALSE.                !ASSUME LEX FAILS.
  132.     OP=-1                    !OUTPUT PTR.
  133. 50    OP=OP+2                    !ADV OUTPUT PTR.
  134.     CP=0                    !CHAR PTR=0.
  135. C
  136. 200    IF(PRSCON.GT.INLNT) GO TO 1000        !END OF INPUT?
  137.     J=INBUF(PRSCON)                !NO, GET CHARACTER,
  138.     PRSCON=PRSCON+1                !ADVANCE PTR.
  139.     IF(J.EQ.'.') GO TO 1000            !END OF COMMAND?
  140.     IF(J.EQ.',') GO TO 1000            !END OF COMMAND?
  141.     IF(J.EQ.' ') GO TO 6000            !SPACE?
  142.     DO 500 I=1,9,3                !SCH FOR CHAR.
  143.       IF((J.GE.DLIMIT(I)).AND.(J.LE.DLIMIT(I+1)))
  144.     1    GO TO 4000
  145. 500    CONTINUE
  146. C
  147.     IF(VBFLAG) CALL RSPEAK(601)        !GREEK TO ME, FAIL.
  148.     RETURN
  149. C
  150. C END OF INPUT, SEE IF PARTIAL WORD AVAILABLE.
  151. C
  152. 1000    IF(PRSCON.GT.INLNT) PRSCON=1        !FORCE PARSE RESTART.
  153.     IF((CP.EQ.0).AND.(OP.EQ.1)) RETURN    !ANY RESULTS?
  154.     IF(CP.EQ.0) OP=OP-2            !ANY LAST WORD?
  155.     LEX=.TRUE.
  156. D    IF(DFLAG) TYPE 10,CP,OP,PRSCON,(OUTBUF(I),I=1,OP+1)
  157. D10    FORMAT(' LEX RESULTS- ',3I7/1X,10O7)
  158.     RETURN
  159. C
  160. C LEGITIMATE CHARACTERS: LETTER, DIGIT, OR HYPHEN.
  161. C
  162. 4000    J1=J-DLIMIT(I+2)            !CVT TO R50.
  163. D    IF(DFLAG) TYPE 20,J,J1,CP
  164. D20    FORMAT(' LEX- CHAR= ',3I7)
  165.     IF(CP.GE.6) GO TO 200            !IGNORE IF TOO MANY CHAR.
  166.     K=OP+(CP/3)                !COMPUTE WORD INDEX.
  167.     GO TO (4100,4200,4300),(MOD(CP,3)+1)    !BRANCH ON CHAR.
  168. 4100    J2=J1*780                !CHAR 1... *780
  169.     OUTBUF(K)=OUTBUF(K)+J2+J2        !*1560 (40 ADDED BELOW).
  170. 4200    OUTBUF(K)=OUTBUF(K)+(J1*39)        !*39 (1 ADDED BELOW).
  171. 4300    OUTBUF(K)=OUTBUF(K)+J1            !*1.
  172.     CP=CP+1
  173.     GO TO 200                !GET NEXT CHAR.
  174. C
  175. C SPACE
  176. C
  177. 6000    IF(CP.EQ.0) GO TO 200            !ANY WORD YET?
  178.     GO TO 50                !YES, ADV OP.
  179. C
  180.     END
  181.