home *** CD-ROM | disk | FTP | other *** search
- 1000 ' BASIC PREPROCESSOR VERSION 2.0, 26 Jan 1984
- 1010 ' COPYRIGHT (c) 1983 by N.C.Shammas with permission
- 1020 ' granted for non-comercial use and distribution only.
- 1030 ' Copied from Dr. Dobb's Journal, January 1984 with
- 1040 ' modifications by m. w. hulse, 26 Jan 84.
- 1050 OPTION BASE 1
- 1060 DEFINT A-Z:LN$="":FF$=CHR$(12)
- 1070 DIM L$(500),LSTK(50),LBL$(50),NM$(2,30),VAR(2),B$(2),C$(2)
- 1080 GOSUB 11180'CLS
- 1090 PRINT:PRINT:PRINT
- 1100 DATA "MBASIC Preprocessor V1.1A","COPYRIGHT (c) 1983 by N. C. Shammas"
- 1110 FOR I=1 TO 2:READ L$(I) : NEXT I
- 1120 FOR I=1 TO 2:GOSUB 11100:PRINT K$;L$(I):PRINT:PRINT:NEXT I
- 1130 INPUT "Enter Filename ";F$ : PRINT : PRINT
- 1140 PTR=INSTR(F$,".")
- 1150 IF PTR<>0 AND MID$(F$,PTR+1,3)="BAS" THEN FOUT$=MID$(F$,1,PTR)+"BAZ"
-
- :GOTO 1170
- 1160 IF PTR=0 THEN FOUT$=F$+".BAS" ELSE FOUT$=LEFT$(F$,PTR)+"BAS"
- 1170 OPEN "I",1,F$
- 1180 PRINT "Errors found this pass will be displayed. They can also be listed."
- 1190 PRINT "Do you want an error printout (Y/N)? ";:PNT$=INPUT$(1):PRINT PNT$:PRINT
- 1200 IF PNT$="Y" THEN PRINT:PRINT "Be sure your printer is on then press any key."
-
- :I$=INPUT$(1):
- 1210 L$(500)="Relax, I'm loading your program and processing it.":I=500
- 1220 GOSUB 11180:GOSUB 11100:PRINT K$;L$(500):FOR I= 1 TO 11:PRINT:NEXT'CLS
- 1230 L=0
- 1240 WHILE EOF(1)<>-1
- 1250 L=L+1
- 1260 LINE INPUT #1,L$(L)
- 1270 WEND
- 1280 CLOSE #1
- 2000 N=L
- 2010 FOR I=1 TO N
- 2020 P=INSTR(L$(I),"REM")
- 2030 IF P <> 0 THEN L$(I)=MID$(L$(I),1,P-1)+"'"+MID$(L$(I),P+3)
- 2040 NEXT
- 3000 '->REPEAT . . . UNTIL(test)
- 3010 CNT=0
- 3020 FOR I=1 TO N
- 3030 PTR=INSTR(L$(I),"REPEAT")
- 3040 IF PTR=0 GOTO 3110
- 3050 P=INSTR(L$(I),"'")
- 3060 IF (P<PTR) AND (P>0) GOTO 3110
- 3070 CNT=CNT+1
- 3080 A$=STR$(CNT)
- 3090 I$="I"+RIGHT$(A$,LEN(A$)-1)
- 3100 L$(I)=MID$(L$(I),1,PTR-1)+"FOR "+I$+"=0 TO 1"+":' "+MID$(L$(I),PTR)
- 3110 PTR=INSTR(L$(I),"UNTIL")
- 3120 IF PTR=0 GOTO 3210
- 3130 P=INSTR(L$(I),"'")
- 3140 IF (P<PTR) AND (P>0) GOTO 3210
- 3150 IF CNT<=0 THEN LN$= "UNTIL error in line "+STR$(VAL(L$(I)))
-
- :GOSUB 11130:E=1
- 3160 A$=STR$(CNT)
- 3170 I$="I"+RIGHT$(A$,LEN(A$)-1)
- 3180 A$=L$(I)
- 3190 L$(I)=MID$(A$,1,PTR-2)+" "+I$+"=-1*"+MID$(A$,PTR+6)+":NEXT "+I$+"' "+MID$(A$,PTR)
- 3200 CNT=CNT-1
- 3210 NEXT I
- 3220 IF CNT<>0 THEN LN$="REPEAT error : More REPEATs than UNTILs."
-
- :GOSUB 11130:E=1
- 4000 '->Label conventions
- 4010 STK=0
- 5000 FOR I=1 TO N
- 5010 PTR=INSTR(L$(I),"[LBL")
- 5020 IF PTR=0 GOTO 5070
- 5030 A$=L$(I):STK=STK+1:PTR2=INSTR(A$,"]")
- 5040 LSTK(STK)=VAL(A$)
- 5050 LBL$(STK)=MID$(A$,PTR+5,PTR2-PTR-5)
- 5060 L$(I)=MID$(A$,1,PTR-2)+MID$(A$,PTR2+1)
- 5070 NEXT I
- 5080 IF STK=0 GOTO 7140
- 6000 FOR I=1 TO N
- 6010 P=INSTR(L$(I),"'")
- 6020 A$=L$(I)
- 6030 PTR=INSTR(A$,"THEN [")
- 6040 IF PTR<>0 GOTO 6130
- 6050 PTR=INSTR(A$,"ELSE [")
- 6060 IF PTR<>0 GOTO 6130
- 6070 PTR=INSTR(A$,"GOTO [")
- 6080 IF PTR<>0 GOTO 6130
- 6090 PTR=INSTR(A$,"GOSUB [")
- 6100 IF PTR<>0 GOTO 6120
- 6110 NEXT I:GOTO 7000
- 6120 J=7:GOTO 6140
- 6130 J=6
- 6140 IF (P<PTR) AND (P>0) GOTO 6110 ELSE PTR2=INSTR(A$,"]")
- 6150 A$=MID$(A$,PTR+J,PTR2-J-PTR):FLAG=0
- 6160 FOR K=1 TO STK
- 6170 IF A$=LBL$(K) THEN FLAG=K:K=STK
- 6180 NEXT K
- 6190 IF FLAG=0 THEN LN$="Error in line "+STR$(VAL(L$(I)))+
-
- ". Label not found.":GOSUB 11130:E=1:GOTO 7000
- 6200 L$(I)=MID$(L$(I),1,PTR+J-3)+STR$(LSTK(FLAG))+MID$(L$(I),PTR2+1)
- 6210 GOTO 6020
- 7000 '->CASE OF(exp)
- 7010 ' !(exp1) DO
- 7020 '
- 7030 ' statements
- 7040 '
- 7050 ' !(exp2) DO
- 7060 '
- 7070 ' statements
- 7080 '
- 7090 ' !ELSE <-- Optional
- 7100 '
- 7110 ' statements
- 7120 '
- 7130 ' ENDCASE
- 7140 DEF FNL$(A$)=RIGHT$(STR$(VAL(A$)),LEN(STR$(VAL(A$)))-1)
- 7150 IF LEL>0 THEN LDO(NRDO)=LEL ELSE NRDO=NRDO-1
- 7160 FOR I=1 TO N'Look for 'CASE OF'
- 7170 EL=0:LDO=0:LEL=0:NRDO=1:CE1=0:CE2=0:CE3=0:CE4=0:CE5=0
- 7180 PTR=INSTR(L$(I),"CASE OF")
- 7190 IF PTR=0 GOTO 7630
- 7200 A$=L$(I)
- 7210 P=INSTR(A$,"'")
- 7220 PTR=INSTR(A$,"(")
- 7230 IF ((P<PTR) AND (P>0)) OR PTR=0 THEN CE1=1:GOTO 7260
- 7240 I$=MID$(A$,PTR)
- 7250 L$(I)=FNL$(A$)+" I0="+I$
- 7260 IF CE1=1 THEN LN$=
-
- "Error in 'CASE OF'. No (expression) found in line "+FNL$(A$):GOSUB 11130
-
- :E=1
- 7270 LCO=J' LCO is line number of 'CASE OF'
- 7280 LEC=N:CO=CO+1:LDO=0
- 7290 FOR K=LCO TO LEC'Look for 'ENDCASE'
- 7300 PTR=INSTR(L$(K),"ENDCASE")
- 7310 IF PTR=0 THEN IF K<=LEC GOTO 7350 ELSE CE5=1:GOTO 7340
- 7320 LEC=K:K=N:EC=EC+1' LECis line # of ENDCASE
- 7330 L$(LEC)=FNL$(L$(LEC))+" ' Endcase"
- 7340 IF CE5=1 THEN LN$="Error. No 'ENDCASE' for the 'CASE OF' in line "+FNL$(L$(LEC)):GOSUB 11130:E=1
- 7350 NEXT K
- 7360 FOR L=LCO TO LEC-1' Look for 'ELSEs'
- 7370 PEX=INSTR(L$(L),"!("):IF PEX>0 THEN LDO=L
- 7380 PEL=INSTR(L$(L),"!ELSE"):IF PEL>0 THEN LEL=L
- 7390 P=INSTR(L$(L),"'")
- 7400 IF PEL=0 OR PEL>P GOTO 7450
- 7410 IF LDO=0 THEN CE4=0:GOTO 7430
- 7420 L$(L)=FNL$(L$(L))+" ' Else condition":EL=EL+1
- 7430 IF CE4=1 OR EL>1 THEN LN$="Error. No '!() DO' before 'ELSE'/'ENDCASE' or too many 'ELSEs'. See line "+FNL$(L$(L)):GOSUB 11130:E=1
- 7440 IF EL=1 THEN LEL1=LEL ELSE IF LEL=0 THEN LEL1=LEC
- 7450 NEXT L
- 7460 FOR M=LCO TO LEL-1' Look for 'DOs'
- 7470 PEX=INSTR(L$(M),"!(")
- 7480 P=INSTR(L$(M),"'")
- 7490 IF PEX=0 OR ((PEX>P) AND (P>0)) GOTO 7510 ELSE LDO(NRDO)=M:PEX(NRDO)=PEX
- 7500 NRDO=NRDO+1
- 7510 NEXT M
- 7520 FOR M=NRDO TO 1 STEP-1'Process 'DOs' from highest line # down
- 7530 IF M=NRDO THEN LDO(M)=LEL:IF LEL=0 GOTO 7620 ELSE
-
- LB4=LEL-1:GOTO 7580
- 7540 A$=L$(LDO(M)):PDO=INSTR(A$,"DO")
- 7550 IF PDO=0 THEN LN$="Error. No 'DO' in line "+FNL$(A$):GOSUB 11130:E=1:GOTO 7620
- 7560 L$(LDO(M))=FNL$(A$)+" IF I0<>"+MID$(A$,PEX(M)+1,
-
- PDO-2-PEX(M)+1)+"GOTO "+FNL$(L$(LDO(M+1)))+MID$(A$,PDO+2)
- 7570 LB4=LDO(M)-1'Put 'GOTO endcase' on line before 'DOs' except 1st.
- 7580 A$=L$(LB4)
- 7590 P=INSTR(A$,"'"):IF P=0 THEN P=LEN(A$)+1
- 7600 IF P>LEN(FNL$(A$))+2 THEN I$=":" ELSE I$=""
- 7610 IF M>1 THEN L$(LB4)=LEFT$(A$,P-1)+I$+"GOTO "+FNL$(L$(LEC))
-
- +MID$(A$,P)
- 7620 NEXT M
- 7630 NEXT I
- 7640 IF CO<>EC THEN LN$="Number of CASE OF and ENDCASE statements do not match.":GOSUB 11130
- 8000 ' -->1505 CALL "matrix" TAKES A;B;C GIVES E;F
- 8010 '
- 8020 ' statements
- 8030 '
- 8040 ' 9000 SUB "matrix" TAKES X;Y;Z GIVES L;M
- 8050 '
- 8060 ' subroutine body
- 8070 '
- 8080 ' RETURN
- 8090 '
- 8100 ' --> The call on line 1505 will become:
- 8110 '
- 8120 ' 1505 X=A : Y=B : Z=C : GOSUB 9000 : E=L : F=M
- 8130 '
- 8140 B$(1)="{":B$(2)="[":C$(1)="}":C$(2)="]"
- 8150 FOR I = 1 TO N
- 8160 P=INSTR(L$(I),"GOSUB")
- 8170 IF P<>0 GOTO 9260
- 8180 P=INSTR(L$(I),"SUB")
- 8190 P1=INSTR(L$(I),"'")
- 8200 IF (P=0) OR ((P1<P) AND (P1>0)) GOTO 9260
- 8210 A$=L$(I)
- 8220 SBLN=VAL(A$)
- 8230 P1=INSTR(A$,CHR$(34))
- 8240 P2=INSTR(P1+1,A$,CHR$(34))
- 8250 IF (P1*P2)=0 THEN LN$="Error in subroutine name @ line "
-
- +STR$(SBLN)+".":GOSUB 11130:E=1
- 8260 SBNM$=MID$(A$,P1+1,P2-P1-1)
- 8270 L$(I)=FNL$(A$)+" '"+MID$(A$,LEN(FNL$(A$))+1)
- 8280 VAR(1)=0:VAR(2)=0
- 8290 GOSUB 11020:'Insert braces and brackets.
- 8300 FOR J=1 TO 2
- 8310 P=INSTR(A$,B$(J))
- 8320 IF P=0 GOTO 8460
- 8330 P1=P
- 8340 P2=INSTR(A$,C$(J))
- 8350 P=INSTR(P1+1,A$,";")
- 8360 PTR=INSTR(A$,"["):IF PTR=0 THEN PTR=LEN(A$)
- 8370 IF (P=0) OR ((P>PTR) AND (J=1)) GOTO 8430
- 8380 VAR(J)=VAR(J)+1
- 8390 K=VAR(J)
- 8400 NM$(J,K)=MID$(A$,P1+1,P-P1-1)
- 8410 P1=P
- 8420 GOTO 8350
- 8430 VAR(J)=VAR(J)+1
- 8440 K=VAR(J)
- 8450 NM$(J,K)=MID$(A$,P1+1,P2-P1-1)
- 8460 NEXT J
- 9000 FOR J=1 TO N' Find "CALLs' using 'SUBs'as targets
- 9010 P=INSTR(L$(J),"CALL")
- 9020 IF P=0 GOTO 9250
- 9030 A$=L$(J)
- 9040 P1=INSTR(A$,CHR$(34))
- 9050 P2=INSTR(P1+1,A$,CHR$(34))
- 9060 IF (P1*P2)=0 GOTO 9250
- 9070 IF SBNM$<>MID$(A$,P1+1,P2-P1-1) GOTO 9250
- 9080 GOSUB 11020: 'Insert braces and brackets as markers
- 9090 L$=FNL$(A$)
- 9100 FOR L=1 TO 2
- 9110 IF VAR(L)=0 GOTO 9220
- 9120 P1=INSTR(A$,B$(L))
- 9130 P2=INSTR(A$,C$(L))
- 9140 FOR K=0 TO VAR(L)
- 9150 IF K=0 THEN K=K+1
- 9160 IF K=VAR(L) THEN P=P2 ELSE P=
-
- INSTR(P1+1,A$,";")
- 9170 IF P=0 THEN LN$=
-
- "Error. Semicolon missing in line "+FNL$(A$)+".":GOSUB 11130:E=1
- 9180 IF L=1 THEN L$=L$+" "+NM$(L,K)+"="+
-
- MID$(A$,P1+1,P-P1-1)+":"
- 9190 IF L=2 THEN L$=L$+" "+MID$(A$,P1+1,P-P1-1)+
-
- "="+NM$(L,K)+":"
- 9200 P1=P
- 9210 NEXT K
- 9220 IF L=1 THEN L$=L$+" GOSUB"+STR$(SBLN)+":"
- 9230 NEXT L
- 9240 L$(J)=L$
- 9250 NEXT J
- 9260 NEXT I
- 10000 I=500:PRINT:PRINT:IF E>0 THEN L$(I)="Unsuccessful run.":GOSUB 11100:PRINT K$;L$(500);CHR$(7):GOTO 11200'End
- 10010 OPEN "O",1,FOUT$
- 10020 PRINT CHR$(7):GOSUB 11180:L$(I)= "Conversion is successful!"
-
- :GOSUB 11100:PRINT K$;L$(I):FOR I=1 TO 8:PRINT:NEXT
- 10030 PRINT:PRINT:PRINT "Do you want a printout of the MBASIC source (Y/N)? ";
-
- :PRINT CHR$(7);:PNT$=INPUT$(1)
- 10040 PRINT:IF PNT$="Y" THEN PRINT "Prepare printer and press any key.":PRINT
-
- :A$=INPUT$(1)
- 10050 GOSUB 11180'CLS
- 10060 J=0
- 10070 FOR I=1 TO N
- 10080 LN$=L$(I):GOSUB 11150
- 10090 PRINT #1,LN$
- 10100 NEXT I
- 10110 CLOSE#1
- 10120 PRINT "[Press any key when done.]":I$=INPUT$(1)
- 10130 FOR I=1 TO 79:PRINT "_";:NEXT I:PRINT
- 10140 PRINT:PRINT "The above listing is residing in file `;FOUT$;"'."
- 10150 GOTO 11200'End
- 11000 '--------------------------SUBROUTINES---------------------------
- 11010 '->Insert braces and brackets.
- 11020 P1=INSTR(A$,"TAKES"):P2=INSTR(A$,"GIVES")
- 11030 IF P1=0 GOTO 11060
- 11040 MID$(A$,P1+5,1)="{"
- 11050 IF P2=0 THEN A$=A$+"}" ELSE MID$(A$,P2-1,1)="}"
- 11060 IF P2=0 GOTO 11090
- 11070 MID$(A$,P2+5,1)="["
- 11080 A$=A$+"]"
- 11090 RETURN
- 11100 '->Center text
- 11110 K$=SPACE$(40-LEN(L$(I))/2)
- 11120 RETURN
- 11130 '->Display or display and list lines $ errors
- 11140 IF J9=0 THEN PRINT "Error List:":IF PNT$="Y" THEN LPRINT "Error List:"
- 11150 PRINT LN$:IF PNT$="Y" THEN LPRINT LN$:J9=J9+1:
-
- IF J9=61 THEN PRINT FF$:J9=0
- 11160 IF PNT$<>"Y" THEN J9=J9+1:IF J9=22 THEN PRINT "[More]":I$=INPUT$(1)
-
- :J9=0
- 11170 RETURN
- 11180 '->Generic clear screen
- 11190 FOR LNS=1 TO 24:PRINT:NEXT:RETURN
- 11200 '->End routine
- 11210 IF PNT$="Y" THEN LPRINT FF$
- 11220 END
- ric clear