The following code [FILENAME.BAS] can be executed by by either of the two programs BASIC1.PAS / BASIC2.PAS
10 START
15 LET A1 0
16 LET A2 0
17 LET E 0
20 INPUT N
40 LET C 0
50 INCR C 1
60 INPUT B2
70 GOSUB 445
72 LET B1 0
75 ADD B1 B1 E
140 GOSUB 745
120 CMP C N
130 JE 150 50
150 PRINT A1
160 NEWLINE
170 END
400 REM GOSUB2
445 CMP A2 B2
460 JL 470 472
470 INCR E 1
471 JMP 475
472 LET E 1
475 LET A2 0
477 ADD A2 A2 B2
500 RETURN
700 REM GOSUB3
745 CMP A1 B1
760 JL 770 800
770 LET A1 0
775 ADD A1 A1 B1
800 RETURN
RUN
BASIC1.PAS
PROGRAM CODE;
VAR
MYFILE : TEXT;
LINENUMBER : INTEGER;
COMMAND, VARIABLE, PARAMETER1, PARAMETER2 : STRING;
Z, M : CHAR;
S, S1, S3, W, R : STRING;
X, Y, GOSUB1 : BOOLEAN;
C, L, L1, K, H, V, V1, O, I, U, J, GOSUB2 : INTEGER;
VARB : ARRAY [1..10000] OF STRING;
VALS : ARRAY [1..10000] OF STRING;
VAL : ARRAY [1..10000] OF INTEGER;
VALC : ARRAY [1..10000] OF CHAR;
FLS : ARRAY [1..10000] OF INTEGER;
P : ARRAY [1..10000] OF INTEGER;
LNO : ARRAY [1..10000] OF INTEGER;
COM : ARRAY [1..10000] OF STRING;
PARAM1 : ARRAY [1..10000] OF STRING;
PARAM2 : ARRAY [1..10000] OF STRING;
PROCEDURE BASIC();
BEGIN
R := 'START';
ASSIGN(MYFILE, 'FILENAME.BAS');
REWRITE(MYFILE);
END;
PROCEDURE INI();
BEGIN
S := '0123456789';
S1 := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,.!_$"';
K := 0;
H := 0;
END;
PROCEDURE INIS();
BEGIN
S3 := '';
END;
PROCEDURE INIB();
BEGIN
X := TRUE;
END;
PROCEDURE INIH();
BEGIN
H := 0;
END;
PROCEDURE INIC();
BEGIN
C := 0;
END;
PROCEDURE INC();
BEGIN
C := C + 1;
END;
PROCEDURE START(D : INTEGER);
BEGIN
IF (R = 'START') THEN
BEGIN
INI;
INIB;
INIH;
INIC;
INC;
LNO[C] := D;
COM[C] := 'START';
END;
END;
PROCEDURE PUSH();
BEGIN
K := K + 1;
P[K] := C;
END;
PROCEDURE POP();
BEGIN
C := P[K];
K := K - 1;
END;
PROCEDURE CODE4();
BEGIN
INC;
IF (W[C] = ';') THEN L := C - 1 ELSE CODE4;
END;
PROCEDURE LEN(S1 : STRING);
BEGIN
W := S1 + ';';
PUSH;
INIC;
CODE4;
POP;
END;
PROCEDURE CODE3();
BEGIN
INC;
IF (Z = S[C]) THEN H := H * 10 + (C - 1);
IF (Z <> S[C]) AND (C < 10) THEN CODE3;
END;
PROCEDURE CODE2(S1 : STRING);
BEGIN
INC;
Z := S1[C];
PUSH;
INIC;
CODE3;
POP;
IF (C < L) THEN CODE2(S1);
END;
PROCEDURE INT1(S1 : STRING);
BEGIN
PUSH;
INIC;
INIH;
LEN(S1);
CODE2(S1);
POP;
END;
PROCEDURE CODE1(S1 : STRING);
BEGIN
INC;
IF (VARB[C] <> S1) AND (C < V) THEN CODE1(S1);
END;
PROCEDURE CODE5(S1 : STRING);
BEGIN
INC;
IF (LNO[C] <> H) AND (C < V1) THEN CODE5(S1);
END;
PROCEDURE LET(D : INTEGER; S1 : STRING; S2 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'LET';
VARB[C] := S1;
PARAM1[C] := S2;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S1);
LEN(S1);
IF (W[L] = '$') THEN VALS[C] := S2 ELSE
BEGIN
INT1(S2);
VAL[C] := H;
END;
POP;
END;
END;
PROCEDURE INPUT(D : INTEGER; S1 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'INPUT';
VARB[C] := S1;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S1);
LEN(S1);
IF (W[L] = '$') THEN READLN(VALS[C]) ELSE READ(VAL[C]);
POP;
END;
END;
PROCEDURE PRINT(D : INTEGER; S2 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'PRINT';
PARAM1[C] := S2;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S2);
LEN(S2);
IF (W[L] = '$') THEN WRITE(VALS[C]) ELSE WRITE(VAL[C]);
POP;
END;
END;
PROCEDURE NEWLINE(D : INTEGER);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'NEWLINE';
END;
IF (R = 'RUN') THEN WRITELN();
END;
PROCEDURE INCR(D : INTEGER; C1, B1 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'INCR';
VARB[C] := C1;
PARAM1[C] := B1;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(C1);
O := C;
INIH;
INT1(B1);
VAL[O] := VAL[O] + H;
POP;
END;
END;
PROCEDURE ADD(D : INTEGER; C1, B1, A1 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'ADD';
VARB[C] := C1;
PARAM1[C] := B1;
PARAM2[C] := A1;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(C1);
O := C;
INIC;
CODE1(B1);
I := C;
INIC;
CODE1(A1);
U := C;
VAL[O] := VAL[I] + VAL[U];
VALS[O] := VALS[I] + VALS[U];
POP;
END;
END;
PROCEDURE MUL(D : INTEGER; C1, B1, A1 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'MUL';
VARB[C] := C1;
PARAM1[C] := B1;
PARAM2[C] := A1;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(C1);
O := C;
INIC;
CODE1(B1);
I := C;
INIC;
CODE1(A1);
U := C;
VAL[O] := VAL[I] * VAL[U];
POP;
END;
END;
PROCEDURE CMP(D : INTEGER; S1, S2 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'CMP';
PARAM1[C] := S1;
PARAM2[C] := S2;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S1);
O := C;
INIC;
CODE1(S2);
U := C;
POP;
IF (VALS[O] = VALS[U]) AND (VAL[O] = VAL[U]) THEN X := TRUE ELSE X := FALSE;
IF (VALS[O] = VALS[U]) AND (VAL[O] < VAL[U]) THEN Y := TRUE ELSE Y := FALSE;
END;
END;
PROCEDURE JMP(D : INTEGER; D1: STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'JMP';
PARAM1[C] := D1;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
INT1(D1);
CODE5(D1);
J := C;
POP;
C := J - 1;
END;
END;
PROCEDURE JE(D : INTEGER; D1, D2 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'JE';
PARAM1[C] := D1;
PARAM2[C] := D2;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
IF (X = TRUE) THEN
BEGIN
INT1(D1);
CODE5(D1);
J := C;
END
ELSE IF (X = FALSE) THEN
BEGIN
INT1(D2);
CODE5(D2);
J := C;
END;
POP;
C := J - 1;
END;
END;
PROCEDURE JL(D : INTEGER; D1, D2 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'JL';
PARAM1[C] := D1;
PARAM2[C] := D2;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
IF (Y = TRUE) THEN
BEGIN
INT1(D1);
CODE5(D1);
J := C;
END
ELSE IF (Y = FALSE) THEN
BEGIN
INT1(D2);
CODE5(D2);
J := C;
END;
POP;
C := J - 1;
END;
END;
PROCEDURE PAUSE(D: INTEGER);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'PAUSE';
END;
IF (R = 'RUN') THEN READ(M);
END;
PROCEDURE REM(D : INTEGER; S1 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'REM';
PARAM1[C] := S1;
END;
END;
PROCEDURE INPUT_CHAR(D : INTEGER; S1 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'INPUT_CHAR';
PARAM1[C] := S1;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S1);
H := VAL[C];
READ(VALC[H]);
Z := VALC[H];
POP;
END;
END;
PROCEDURE CODE6();
BEGIN
INC;
IF (Z = S1[C]) THEN X := FALSE;
IF (Z <> S1[C]) AND (C < 66) THEN CODE6;
END;
PROCEDURE CHK_EOL(D : INTEGER);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'CHK_EOL';
END;
IF (R = 'RUN') THEN
BEGIN
PUSH;
INIC;
INIB;
CODE6;
POP;
END;
END;
PROCEDURE PRINT_CHAR(D : INTEGER; S1 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'PRINT_CHAR';
PARAM1[C] := S1;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S1);
H := VAL[C];
WRITE(VALC[H]);
POP;
END;
END;
PROCEDURE INT(D : INTEGER; S1, S2 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'INT';
VARB[C] := S1;
PARAM1[C] := S2;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S1);
W := VALS[C];
INT1(W);
VAL[V] := H;
PARAM1[C] := W;
POP;
END;
END;
PROCEDURE ADD_CHAR(D : INTEGER; S1, S2 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'ADD_CHAR';
VARB[C] := S1;
PARAM1[C] := S2;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S1);
O := C;
INIC;
CODE1(S2);
H := VAL[C];
VALS[O] := VALS[O] + VALC[H];
POP;
END;
END;
PROCEDURE CHK_SPACE(D : INTEGER);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'CHK_EOL';
END;
IF (R = 'RUN') THEN
BEGIN
PUSH;
INIC;
INIB;
IF (Z <> ' ') THEN X := FALSE;
POP;
END;
END;
PROCEDURE FILEIN(D : INTEGER; S1, S2 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'FILEIN';
PARAM1[C] := S1;
VARB[C] := S2;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S1);
H := VAL[C];
INIC;
CODE1(S2);
FLS[H] := VAL[C];
POP;
END;
END;
PROCEDURE FILEOUT(D : INTEGER; S1, S2 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'FILEOUT';
PARAM1[C] := S1;
VARB[C] := S2;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S1);
H := VAL[C];
INIC;
CODE1(S2);
VAL[C] := FLS[H];
POP;
END;
END;
PROCEDURE CODE12();
BEGIN
INC;
L1 := L1 + 10;
LNO[C] := L1;
IF (C < V1) THEN CODE12;
END;
PROCEDURE RENUM(D : INTEGER);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'RENUM';
END;
IF (R = 'RUN') THEN
BEGIN
PUSH;
INIC;
CODE12;
POP;
END;
END;
PROCEDURE PICK_CHAR(D : INTEGER; S1, S2, S3 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'PICK_CHAR';
VARB[C] := S1;
PARAM1[C] := S2;
PARAM2[C] := S3;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S1);
O := C;
INIC;
CODE1(S2);
H := VAL[C];
INIC;
CODE1(S3);
W := VALS[C];
VALS[O] := W[H];
POP;
END;
END;
PROCEDURE LEN(D : INTEGER; S1, S2 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'LEN';
VARB[C] := S1;
PARAM1[C] := S2;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S2);
W := VALS[C] + ';';
PUSH;
INIC;
CODE4;
INIC;
CODE1(S1);
VAL[C] := L;
POP;
POP;
END;
END;
PROCEDURE GOSUB(D : INTEGER; S1 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'GOSUB';
PARAM1[C] := S1;
GOSUB1 := True;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
GOSUB2 := C;
PUSH;
INIC;
INT1(S1);
CODE5(S1);
J := C;
POP;
C := J - 1;
END;
END;
PROCEDURE RETURN(D : INTEGER);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'RETURN';
PARAM1[C] := S1;
GOSUB1 := True;
END;
IF (R = 'RUN') THEN
BEGIN
C := GOSUB2;
END;
END;
PROCEDURE RUN1();
BEGIN
INC;
IF (COM[C] = 'START') THEN START(LNO[C]);
IF (COM[C] = 'INPUT_CHAR') THEN INPUT_CHAR(LNO[C], PARAM1[C]);
IF (COM[C] = 'PRINT_CHAR') THEN PRINT_CHAR(LNO[C], PARAM1[C]);
IF (COM[C] = 'INPUT') THEN INPUT(LNO[C], VARB[C]);
IF (COM[C] = 'LET') THEN LET(LNO[C], VARB[C], PARAM1[C]);
IF (COM[C] = 'PRINT') THEN PRINT(LNO[C], PARAM1[C]);
IF (COM[C] = 'NEWLINE') THEN NEWLINE(LNO[C]);
IF (COM[C] = 'INCR') THEN INCR(LNO[C], VARB[C], PARAM1[C]);
IF (COM[C] = 'ADD') THEN ADD(LNO[C], VARB[C], PARAM1[C], PARAM2[C]);
IF (COM[C] = 'MUL') THEN MUL(LNO[C], VARB[C], PARAM1[C], PARAM2[C]);
IF (COM[C] = 'CMP') THEN CMP(LNO[C], PARAM1[C], PARAM2[C]);
IF (COM[C] = 'JMP') THEN JMP(LNO[C], PARAM1[C]);
IF (COM[C] = 'JE') THEN JE(LNO[C], PARAM1[C], PARAM2[C]);
IF (COM[C] = 'JL') THEN JL(LNO[C], PARAM1[C], PARAM2[C]);
IF (COM[C] = 'PAUSE') THEN PAUSE(LNO[C]);
IF (COM[C] = 'REM') THEN REM(LNO[C], PARAM1[C]);
IF (COM[C] = 'CHK_EOL') THEN CHK_EOL(LNO[C]);
IF (COM[C] = 'INT') THEN INT(LNO[C], VARB[C], PARAM1[C]);
IF (COM[C] = 'ADD_CHAR') THEN ADD_CHAR(LNO[C], VARB[C], PARAM1[C]);
IF (COM[C] = 'PICK_CHAR') THEN PICK_CHAR(LNO[C], VARB[C], PARAM1[C], PARAM2[C]);
IF (COM[C] = 'CHK_SPACE') THEN CHK_SPACE(LNO[C]);
IF (COM[C] = 'FILEIN') THEN FILEIN(LNO[C], PARAM1[C], VARB[C]);
IF (COM[C] = 'FILEOUT') THEN FILEOUT(LNO[C], PARAM1[C], VARB[C]);
IF (COM[C] = 'LEN') THEN LEN(LNO[C], VARB[C], PARAM1[C]);
IF (COM[C] = 'GOSUB') THEN GOSUB(LNO[C], PARAM1[C]);
IF (COM[C] = 'RETURN') THEN RETURN(LNO[C]);
IF (COM[C] <> 'END') AND (R = 'RUN') THEN RUN1;
END;
PROCEDURE EXIT(D : INTEGER);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'END';
END;
END;
PROCEDURE RUN();
BEGIN
IF (R = 'START') THEN
BEGIN
R := 'RUN';
V1 := C;
END;
INIC;
RUN1;
END;
PROCEDURE CODE_CODE1();
BEGIN
INC;
IF (Z = S1[C]) THEN
BEGIN
X := FALSE;
IF (S3 = '') THEN S3 := Z ELSE S3 := S3 + Z;
END;
IF (Z <> S1[C]) AND (C < 67) THEN CODE_CODE1;
END;
PROCEDURE CODE_CODE();
BEGIN
READ(Z);
(*WRITE(MYFILE, Z);*)
PUSH;
INIC;
INIB;
CODE_CODE1;
IF (X <> TRUE) THEN CODE_CODE;
POP;
END;
PROCEDURE CODE_CODEA();
BEGIN
INC;
IF (Z = S[C]) THEN
BEGIN
X := FALSE;
H := H * 10 + (C - 1);
END;
IF (Z <> S[C]) AND (C < 10) THEN CODE_CODEA;
END;
PROCEDURE CODE_CODES();
BEGIN
READ(Z);
(*WRITE(MYFILE, Z);*)
PUSH;
INIC;
INIB;
CODE_CODEA;
IF (X <> TRUE) THEN CODE_CODES;
POP;
END;
PROCEDURE CODE_INPUT();
BEGIN
INIS;
CODE_CODE;
VARIABLE := S3;
INPUT(LINENUMBER, VARIABLE);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND, ' ', VARIABLE);
END;
PROCEDURE CODE_LET();
BEGIN
INIS;
CODE_CODE;
VARIABLE := S3;
INIS;
CODE_CODE;
PARAMETER1 := S3;
LET(LINENUMBER, VARIABLE, PARAMETER1);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND, ' ', VARIABLE, ' ', PARAMETER1);
END;
PROCEDURE CODE_PRINT();
BEGIN
INIS;
CODE_CODE;
PARAMETER1 := S3;
PRINT(LINENUMBER, PARAMETER1);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND, ' ', PARAMETER1);
END;
PROCEDURE CODE_NEWLINE();
BEGIN
NEWLINE(LINENUMBER);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND);
END;
PROCEDURE CODE_INCR();
BEGIN
INIS;
CODE_CODE;
VARIABLE := S3;
INIS;
CODE_CODE;
PARAMETER1 := S3;
INCR(LINENUMBER, VARIABLE, PARAMETER1);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND, ' ', VARIABLE, ' ', PARAMETER1);
END;
PROCEDURE CODE_ADD();
BEGIN
INIS;
CODE_CODE;
VARIABLE := S3;
INIS;
CODE_CODE;
PARAMETER1 := S3;
INIS;
CODE_CODE;
PARAMETER2 := S3;
ADD(LINENUMBER, VARIABLE, PARAMETER1, PARAMETER2);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND, ' ', VARIABLE, ' ', PARAMETER1, ' ', PARAMETER2);
END;
PROCEDURE CODE_MUL();
BEGIN
INIS;
CODE_CODE;
VARIABLE := S3;
INIS;
CODE_CODE;
PARAMETER1 := S3;
INIS;
CODE_CODE;
PARAMETER2 := S3;
MUL(LINENUMBER, VARIABLE, PARAMETER1, PARAMETER2);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND, ' ', VARIABLE, ' ', PARAMETER1, ' ', PARAMETER2);
END;
PROCEDURE CODE_CMP();
BEGIN
INIS;
CODE_CODE;
PARAMETER1 := S3;
INIS;
CODE_CODE;
PARAMETER2 := S3;
CMP(LINENUMBER, PARAMETER1, PARAMETER2);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND, ' ', PARAMETER1, ' ', PARAMETER2);
END;
PROCEDURE CODE_JE();
BEGIN
INIS;
CODE_CODE;
PARAMETER1 := S3;
INIS;
CODE_CODE;
PARAMETER2 := S3;
JE(LINENUMBER, PARAMETER1, PARAMETER2);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND, ' ', PARAMETER1, ' ', PARAMETER2);
END;
PROCEDURE CODE_JL();
BEGIN
INIS;
CODE_CODE;
PARAMETER1 := S3;
INIS;
CODE_CODE;
PARAMETER2 := S3;
JL(LINENUMBER, PARAMETER1, PARAMETER2);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND, ' ', PARAMETER1, ' ', PARAMETER2);
END;
PROCEDURE CODE_JMP();
BEGIN
INIS;
CODE_CODE;
PARAMETER1 := S3;
JMP(LINENUMBER, PARAMETER1);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND, ' ', PARAMETER1);
END;
PROCEDURE CODE_CHK_SPACE();
BEGIN
CHK_SPACE(LINENUMBER);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND);
END;
PROCEDURE CODE_ADD_CHAR();
BEGIN
INIS;
CODE_CODE;
VARIABLE := S3;
INIS;
CODE_CODE;
PARAMETER1 := S3;
ADD_CHAR(LINENUMBER, VARIABLE, PARAMETER1);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND, ' ', VARIABLE, ' ', PARAMETER1);
END;
PROCEDURE CODE_INPUT_CHAR();
BEGIN
INIS;
CODE_CODE;
PARAMETER1 := S3;
INPUT_CHAR(LINENUMBER, PARAMETER1);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND, ' ', PARAMETER1);
END;
PROCEDURE CODE_PRINT_CHAR();
BEGIN
INIS;
CODE_CODE;
PARAMETER1 := S3;
PRINT_CHAR(LINENUMBER, PARAMETER1);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND, ' ', PARAMETER1);
END;
PROCEDURE CODE_INT();
BEGIN
INIS;
CODE_CODE;
VARIABLE := S3;
INIS;
CODE_CODE;
PARAMETER1 := S3;
INT(LINENUMBER, VARIABLE, PARAMETER1);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND, ' ', VARIABLE, ' ', PARAMETER1);
END;
PROCEDURE CODE_FILEIN();
BEGIN
INIS;
CODE_CODE;
PARAMETER1 := S3;
INIS;
CODE_CODE;
PARAMETER2 := S3;
FILEIN(LINENUMBER, PARAMETER1, PARAMETER2);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND, ' ', PARAMETER1, ' ', PARAMETER2);
END;
PROCEDURE CODE_FILEOUT();
BEGIN
INIS;
CODE_CODE;
PARAMETER1 := S3;
INIS;
CODE_CODE;
PARAMETER2 := S3;
FILEOUT(LINENUMBER, PARAMETER1, PARAMETER2);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND, ' ', PARAMETER1, ' ', PARAMETER2);
END;
PROCEDURE CODE_CHK_EOL();
BEGIN
CHK_EOL(LINENUMBER);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND);
END;
PROCEDURE CODE_REM();
BEGIN
INIS;
CODE_CODE;
PARAMETER1 := S3;
REM(LINENUMBER, PARAMETER1);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND, ' ', PARAMETER1);
END;
PROCEDURE CODE_PICK_CHAR();
BEGIN
INIS;
CODE_CODE;
VARIABLE := S3;
INIS;
CODE_CODE;
PARAMETER1 := S3;
INIS;
CODE_CODE;
PARAMETER2 := S3;
PICK_CHAR(LINENUMBER, VARIABLE, PARAMETER1, PARAMETER2);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND, ' ', VARIABLE, ' ', PARAMETER1, ' ', PARAMETER2);
END;
PROCEDURE CODE_LEN();
BEGIN
INIS;
CODE_CODE;
VARIABLE := S3;
INIS;
CODE_CODE;
PARAMETER1 := S3;
LEN(LINENUMBER, VARIABLE, PARAMETER1);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND, ' ', VARIABLE, ' ', PARAMETER1);
END;
PROCEDURE CODE_GOSUB();
BEGIN
INIS;
CODE_CODE;
PARAMETER1 := S3;
GOSUB(LINENUMBER, PARAMETER1);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND, ' ', PARAMETER1);
END;
PROCEDURE CODE_RETURN();
BEGIN
RETURN(LINENUMBER);
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND);
END;
PROCEDURE CODE_END();
BEGIN
WRITELN(MYFILE, LINENUMBER, ' ', COMMAND);
EXIT(LINENUMBER);
END;
PROCEDURE CODE_RUN();
BEGIN
WRITELN(MYFILE, COMMAND);
RUN;
END;
PROCEDURE CODE_BASIC1();
BEGIN
IF (COMMAND = 'INPUT') THEN CODE_INPUT;
IF (COMMAND = 'LET') THEN CODE_LET;
IF (COMMAND = 'PRINT') THEN CODE_PRINT;
IF (COMMAND = 'NEWLINE') THEN CODE_NEWLINE;
IF (COMMAND = 'INCR') THEN CODE_INCR;
IF (COMMAND = 'ADD') THEN CODE_ADD;
IF (COMMAND = 'CMP') THEN CODE_CMP;
IF (COMMAND = 'JE') THEN CODE_JE;
IF (COMMAND = 'JL') THEN CODE_JL;
IF (COMMAND = 'JMP') THEN CODE_JMP;
IF (COMMAND = 'FILEIN') THEN CODE_FILEIN;
IF (COMMAND = 'FILEOUT') THEN CODE_FILEOUT;
IF (COMMAND = 'REM') THEN CODE_REM;
IF (COMMAND = 'CHK_EOL') THEN CODE_CHK_EOL;
IF (COMMAND = 'CHK_SPACE') THEN CODE_CHK_SPACE;
IF (COMMAND = 'INT') THEN CODE_INT;
IF (COMMAND = 'ADD_CHAR') THEN CODE_ADD_CHAR;
IF (COMMAND = 'INPUT_CHAR') THEN CODE_INPUT_CHAR;
IF (COMMAND = 'PRINT_CHAR') THEN CODE_PRINT_CHAR;
IF (COMMAND = 'PICK_CHAR') THEN CODE_PICK_CHAR;
IF (COMMAND = 'LEN') THEN CODE_LEN;
IF (COMMAND = 'GOSUB') THEN CODE_GOSUB;
IF (COMMAND = 'RETURN') THEN CODE_RETURN;
IF (COMMAND = 'END') THEN CODE_END;
IF (COMMAND = 'RUN') THEN CODE_RUN;
END;
PROCEDURE CODE_BASIC();
BEGIN
INIS;
CODE_CODE;
IF (S3 <> 'RUN') THEN
BEGIN
INIH;
INT1(S3);
LINENUMBER := H;
INIS;
CODE_CODE;
COMMAND := S3;
END
ELSE COMMAND := S3;
CODE_BASIC1;
IF (COMMAND <> 'RUN') THEN CODE_BASIC;
END;
PROCEDURE END_BASIC();
BEGIN
CLOSE(MYFILE);
END;
BEGIN
BASIC;
START(10);
WRITELN('10 START');
WRITELN(MYFILE, '10 START');
CODE_BASIC;
END_BASIC;
END.
BASIC2.PAS
PROGRAM CODE;
VAR
MYFILE : TEXT;
LINENUMBER : INTEGER;
COMMAND, VARIABLE, PARAMETER1, PARAMETER2 : STRING;
Z, M : CHAR;
S, S1, S3, W, R : STRING;
X, Y, GOSUB1 : BOOLEAN;
C, L, K, H, V, V1, O, I, U, J, GOSUB2 : INTEGER;
VARB : ARRAY [1..10000] OF STRING;
VALS : ARRAY [1..10000] OF STRING;
VAL : ARRAY [1..10000] OF INTEGER;
VALC : ARRAY [1..10000] OF CHAR;
FLS : ARRAY [1..10000] OF STRING;
FLI : ARRAY [1..10000] OF INTEGER;
P : ARRAY [1..10000] OF INTEGER;
LNO : ARRAY [1..10000] OF INTEGER;
COM : ARRAY [1..10000] OF STRING;
PARAM1 : ARRAY [1..10000] OF STRING;
PARAM2 : ARRAY [1..10000] OF STRING;
PROCEDURE BASIC();
BEGIN
R := 'START';
ASSIGN(MYFILE, 'FILENAME.BAS');
RESET(MYFILE);
END;
PROCEDURE INI();
BEGIN
S := '0123456789';
S1 := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,.!_$"';
K := 0;
H := 0;
END;
PROCEDURE INIS();
BEGIN
S3 := '';
END;
PROCEDURE INIB();
BEGIN
X := TRUE;
END;
PROCEDURE INIH();
BEGIN
H := 0;
END;
PROCEDURE INIC();
BEGIN
C := 0;
END;
PROCEDURE INC();
BEGIN
C := C + 1;
END;
PROCEDURE START(D : INTEGER);
BEGIN
IF (R = 'START') THEN
BEGIN
INI;
INIB;
INIH;
INIC;
INC;
LNO[C] := D;
COM[C] := 'START';
END;
END;
PROCEDURE PUSH();
BEGIN
K := K + 1;
P[K] := C;
END;
PROCEDURE POP();
BEGIN
C := P[K];
K := K - 1;
END;
PROCEDURE CODE4();
BEGIN
INC;
IF (W[C] = ';') THEN L := C - 1 ELSE CODE4;
END;
PROCEDURE LEN1(S1 : STRING);
BEGIN
W := S1 + ';';
PUSH;
INIC;
CODE4;
POP;
END;
PROCEDURE CODE3();
BEGIN
INC;
IF (Z = S[C]) THEN H := H * 10 + (C - 1);
IF (Z <> S[C]) AND (C < 10) THEN CODE3;
END;
PROCEDURE CODE2(S1 : STRING);
BEGIN
INC;
Z := S1[C];
PUSH;
INIC;
CODE3;
POP;
IF (C < L) THEN CODE2(S1);
END;
PROCEDURE INT1(S1 : STRING);
BEGIN
PUSH;
INIC;
INIH;
LEN1(S1);
CODE2(S1);
POP;
END;
PROCEDURE CODE1(S1 : STRING);
BEGIN
INC;
IF (VARB[C] <> S1) AND ((C < V) OR (C < V1)) THEN CODE1(S1);
END;
PROCEDURE CODE5(S1 : STRING);
BEGIN
INC;
IF (LNO[C] <> H) AND (C < V1) THEN CODE5(S1);
END;
PROCEDURE LET(D : INTEGER; S1 : STRING; S2 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'LET';
VARB[C] := S1;
PARAM1[C] := S2;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S1);
LEN1(S1);
IF (W[L] = '$') THEN VALS[C] := S2 ELSE
BEGIN
INT1(S2);
VAL[C] := H;
END;
POP;
END;
END;
PROCEDURE INPUT(D : INTEGER; S1 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'INPUT';
VARB[C] := S1;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S1);
LEN1(S1);
IF (W[L] = '$') THEN READLN(VALS[C]) ELSE READ(VAL[C]);
POP;
END;
END;
PROCEDURE PRINT(D : INTEGER; S2 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'PRINT';
PARAM1[C] := S2;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S2);
LEN1(S2);
IF (W[L] = '$') THEN WRITE(VALS[C]) ELSE WRITE(VAL[C]);
POP;
END;
END;
PROCEDURE NEWLINE(D : INTEGER);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'NEWLINE';
END;
IF (R = 'RUN') THEN WRITELN();
END;
PROCEDURE INCR(D : INTEGER; C1, B1 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'INCR';
VARB[C] := C1;
PARAM1[C] := B1;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(C1);
O := C;
INIH;
INT1(B1);
VAL[O] := VAL[O] + H;
POP;
END;
END;
PROCEDURE ADD(D : INTEGER; C1, B1, A1 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'ADD';
VARB[C] := C1;
PARAM1[C] := B1;
PARAM2[C] := A1;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(C1);
O := C;
INIC;
CODE1(B1);
I := C;
INIC;
CODE1(A1);
U := C;
VAL[O] := VAL[I] + VAL[U];
VALS[O] := VALS[I] + VALS[U];
POP;
END;
END;
PROCEDURE MUL(D : INTEGER; C1, B1, A1 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'MUL';
VARB[C] := C1;
PARAM1[C] := B1;
PARAM2[C] := A1;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(C1);
O := C;
INIC;
CODE1(B1);
I := C;
INIC;
CODE1(A1);
U := C;
VAL[O] := VAL[I] * VAL[U];
POP;
END;
END;
PROCEDURE CMP(D : INTEGER; S1, S2 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'CMP';
PARAM1[C] := S1;
PARAM2[C] := S2;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S1);
O := C;
INIC;
CODE1(S2);
U := C;
POP;
IF (VALS[O] = VALS[U]) AND (VAL[O] = VAL[U]) THEN X := TRUE ELSE X := FALSE;
IF (VALS[O] = VALS[U]) AND (VAL[O] < VAL[U]) THEN Y := TRUE ELSE Y := FALSE;
END;
END;
PROCEDURE JMP(D : INTEGER; D1: STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'JMP';
PARAM1[C] := D1;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
INT1(D1);
CODE5(D1);
J := C;
POP;
C := J - 1;
END;
END;
PROCEDURE JE(D : INTEGER; D1, D2 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'JE';
PARAM1[C] := D1;
PARAM2[C] := D2;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
IF (X = TRUE) THEN
BEGIN
INT1(D1);
CODE5(D1);
J := C;
END
ELSE IF (X = FALSE) THEN
BEGIN
INT1(D2);
CODE5(D2);
J := C;
END;
POP;
C := J - 1;
END;
END;
PROCEDURE JL(D : INTEGER; D1, D2 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'JL';
PARAM1[C] := D1;
PARAM2[C] := D2;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
IF (Y = TRUE) THEN
BEGIN
INT1(D1);
CODE5(D1);
J := C;
END
ELSE IF (Y = FALSE) THEN
BEGIN
INT1(D2);
CODE5(D2);
J := C;
END;
POP;
C := J - 1;
END;
END;
PROCEDURE PAUSE(D: INTEGER);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'PAUSE';
END;
IF (R = 'RUN') THEN READ(M);
END;
PROCEDURE REM(D : INTEGER; S1 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'REM';
PARAM1[C] := S1;
END;
END;
PROCEDURE INPUT_CHAR(D : INTEGER; S1 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'INPUT_CHAR';
PARAM1[C] := S1;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S1);
H := VAL[C];
READ(VALC[H]);
Z := VALC[H];
POP;
END;
END;
PROCEDURE CODE6();
BEGIN
INC;
IF (Z = S1[C]) THEN X := FALSE;
IF (Z <> S1[C]) AND (C < 67) THEN CODE6;
END;
PROCEDURE CHK_EOL(D : INTEGER);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'CHK_EOL';
END;
IF (R = 'RUN') THEN
BEGIN
PUSH;
INIC;
INIB;
CODE6;
POP;
END;
END;
PROCEDURE PRINT_CHAR(D : INTEGER; S1 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'PRINT_CHAR';
PARAM1[C] := S1;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S1);
H := VAL[C];
WRITE(VALC[H]);
POP;
END;
END;
PROCEDURE INT(D : INTEGER; S1, S2 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'INT';
VARB[C] := S1;
PARAM1[C] := S2;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S1);
W := VALS[C];
INT1(W);
VAL[V] := H;
PARAM1[C] := W;
POP;
END;
END;
PROCEDURE ADD_CHAR(D : INTEGER; S1, S2 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'ADD_CHAR';
VARB[C] := S1;
PARAM1[C] := S2;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S1);
O := C;
INIC;
CODE1(S2);
H := VAL[C];
VALS[O] := VALS[O] + VALC[H];
POP;
END;
END;
PROCEDURE CHK_SPACE(D : INTEGER);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'CHK_EOL';
END;
IF (R = 'RUN') THEN
BEGIN
PUSH;
INIC;
INIB;
IF (Z <> ' ') THEN X := FALSE;
POP;
END;
END;
PROCEDURE FILEIN(D : INTEGER; S1, S2 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'FILEIN';
PARAM1[C] := S1;
VARB[C] := S2;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S1);
H := VAL[C];
INIC;
CODE1(S2);
LEN1(S2);
IF (W[L] = '$') THEN FLS[H] := VALS[C] ELSE FLI[H] := VAL[C];
POP;
END;
END;
PROCEDURE FILEOUT(D : INTEGER; S1, S2 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'FILEOUT';
PARAM1[C] := S1;
VARB[C] := S2;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S1);
H := VAL[C];
INIC;
CODE1(S2);
LEN1(S2);
IF (W[L] = '$') THEN VALS[C] := FLS[H] ELSE VAL[C] := FLI[H];
POP;
END;
END;
PROCEDURE PICK_CHAR(D : INTEGER; S1, S2, S3 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'PICK_CHAR';
VARB[C] := S1;
PARAM1[C] := S2;
PARAM2[C] := S3;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S1);
O := C;
INIC;
CODE1(S2);
H := VAL[C];
INIC;
CODE1(S3);
W := VALS[C];
VALS[O] := W[H];
POP;
END;
END;
PROCEDURE LEN(D : INTEGER; S1, S2 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'LEN';
VARB[C] := S1;
PARAM1[C] := S2;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
PUSH;
INIC;
CODE1(S2);
W := VALS[C] + ';';
PUSH;
INIC;
CODE4;
INIC;
CODE1(S1);
VAL[C] := L;
POP;
POP;
END;
END;
PROCEDURE GOSUB(D : INTEGER; S1 : STRING);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'GOSUB';
PARAM1[C] := S1;
GOSUB1 := True;
END;
IF (R = 'RUN') THEN
BEGIN
V := C;
GOSUB2 := C;
PUSH;
INIC;
INT1(S1);
CODE5(S1);
J := C;
POP;
C := J - 1;
END;
END;
PROCEDURE RETURN(D : INTEGER);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'RETURN';
PARAM1[C] := S1;
GOSUB1 := True;
END;
IF (R = 'RUN') THEN
BEGIN
C := GOSUB2;
END;
END;
PROCEDURE RUN1();
BEGIN
INC;
IF (COM[C] = 'START') THEN START(LNO[C]);
IF (COM[C] = 'INPUT_CHAR') THEN INPUT_CHAR(LNO[C], PARAM1[C]);
IF (COM[C] = 'PRINT_CHAR') THEN PRINT_CHAR(LNO[C], PARAM1[C]);
IF (COM[C] = 'INPUT') THEN INPUT(LNO[C], VARB[C]);
IF (COM[C] = 'LET') THEN LET(LNO[C], VARB[C], PARAM1[C]);
IF (COM[C] = 'PRINT') THEN PRINT(LNO[C], PARAM1[C]);
IF (COM[C] = 'NEWLINE') THEN NEWLINE(LNO[C]);
IF (COM[C] = 'INCR') THEN INCR(LNO[C], VARB[C], PARAM1[C]);
IF (COM[C] = 'ADD') THEN ADD(LNO[C], VARB[C], PARAM1[C], PARAM2[C]);
IF (COM[C] = 'MUL') THEN MUL(LNO[C], VARB[C], PARAM1[C], PARAM2[C]);
IF (COM[C] = 'CMP') THEN CMP(LNO[C], PARAM1[C], PARAM2[C]);
IF (COM[C] = 'JMP') THEN JMP(LNO[C], PARAM1[C]);
IF (COM[C] = 'JE') THEN JE(LNO[C], PARAM1[C], PARAM2[C]);
IF (COM[C] = 'JL') THEN JL(LNO[C], PARAM1[C], PARAM2[C]);
IF (COM[C] = 'PAUSE') THEN PAUSE(LNO[C]);
IF (COM[C] = 'REM') THEN REM(LNO[C], PARAM1[C]);
IF (COM[C] = 'CHK_EOL') THEN CHK_EOL(LNO[C]);
IF (COM[C] = 'INT') THEN INT(LNO[C], VARB[C], PARAM1[C]);
IF (COM[C] = 'ADD_CHAR') THEN ADD_CHAR(LNO[C], VARB[C], PARAM1[C]);
IF (COM[C] = 'PICK_CHAR') THEN PICK_CHAR(LNO[C], VARB[C], PARAM1[C], PARAM2[C]);
IF (COM[C] = 'CHK_SPACE') THEN CHK_SPACE(LNO[C]);
IF (COM[C] = 'FILEIN') THEN FILEIN(LNO[C], PARAM1[C], VARB[C]);
IF (COM[C] = 'FILEOUT') THEN FILEOUT(LNO[C], PARAM1[C], VARB[C]);
IF (COM[C] = 'LEN') THEN LEN(LNO[C], VARB[C], PARAM1[C]);
IF (COM[C] = 'GOSUB') THEN GOSUB(LNO[C], PARAM1[C]);
IF (COM[C] = 'RETURN') THEN RETURN(LNO[C]);
IF (COM[C] <> 'END') AND (R = 'RUN') THEN RUN1;
END;
PROCEDURE EXIT(D : INTEGER);
BEGIN
IF (R = 'START') THEN
BEGIN
INC;
LNO[C] := D;
COM[C] := 'END';
END;
END;
PROCEDURE RUN();
BEGIN
IF (R = 'START') THEN
BEGIN
R := 'RUN';
V1 := C;
END;
INIC;
RUN1;
END;
PROCEDURE CODE_CODE1();
BEGIN
INC;
IF (Z = S1[C]) THEN
BEGIN
X := FALSE;
IF (S3 = '') THEN S3 := Z ELSE S3 := S3 + Z;
END;
IF (Z <> S1[C]) AND (C < 67) THEN CODE_CODE1;
END;
PROCEDURE CODE_CODE();
BEGIN
READ(MYFILE, Z);
PUSH;
INIC;
INIB;
CODE_CODE1;
IF (X <> TRUE) THEN CODE_CODE;
POP;
END;
PROCEDURE CODE_CODEA();
BEGIN
INC;
IF (Z = S[C]) THEN
BEGIN
X := FALSE;
H := H * 10 + (C - 1);
END;
IF (Z <> S[C]) AND (C < 10) THEN CODE_CODEA;
END;
PROCEDURE CODE_CODES();
BEGIN
READ(MYFILE, Z);
PUSH;
INIC;
INIB;
CODE_CODEA;
IF (X <> TRUE) THEN CODE_CODES;
POP;
END;
PROCEDURE CODE_INPUT();
BEGIN
INIS;
CODE_CODE;
VARIABLE := S3;
INPUT(LINENUMBER, VARIABLE);
WRITELN(LINENUMBER, ' ', COMMAND, ' ', VARIABLE);
END;
PROCEDURE CODE_LET();
BEGIN
INIS;
CODE_CODE;
VARIABLE := S3;
INIS;
CODE_CODE;
PARAMETER1 := S3;
LET(LINENUMBER, VARIABLE, PARAMETER1);
WRITELN(LINENUMBER, ' ', COMMAND, ' ', VARIABLE, ' ', PARAMETER1);
END;
PROCEDURE CODE_PRINT();
BEGIN
INIS;
CODE_CODE;
PARAMETER1 := S3;
PRINT(LINENUMBER, PARAMETER1);
WRITELN(LINENUMBER, ' ', COMMAND, ' ', PARAMETER1);
END;
PROCEDURE CODE_NEWLINE();
BEGIN
NEWLINE(LINENUMBER);
WRITELN(LINENUMBER, ' ', COMMAND);
END;
PROCEDURE CODE_INCR();
BEGIN
INIS;
CODE_CODE;
VARIABLE := S3;
INIS;
CODE_CODE;
PARAMETER1 := S3;
INCR(LINENUMBER, VARIABLE, PARAMETER1);
WRITELN(LINENUMBER, ' ', COMMAND, ' ', VARIABLE, ' ', PARAMETER1);
END;
PROCEDURE CODE_ADD();
BEGIN
INIS;
CODE_CODE;
VARIABLE := S3;
INIS;
CODE_CODE;
PARAMETER1 := S3;
INIS;
CODE_CODE;
PARAMETER2 := S3;
ADD(LINENUMBER, VARIABLE, PARAMETER1, PARAMETER2);
WRITELN(LINENUMBER, ' ', COMMAND, ' ', VARIABLE, ' ', PARAMETER1, ' ', PARAMETER2);
END;
PROCEDURE CODE_MUL();
BEGIN
INIS;
CODE_CODE;
VARIABLE := S3;
INIS;
CODE_CODE;
PARAMETER1 := S3;
INIS;
CODE_CODE;
PARAMETER2 := S3;
MUL(LINENUMBER, VARIABLE, PARAMETER1, PARAMETER2);
WRITELN(LINENUMBER, ' ', COMMAND, ' ', VARIABLE, ' ', PARAMETER1, ' ', PARAMETER2);
END;
PROCEDURE CODE_CMP();
BEGIN
INIS;
CODE_CODE;
PARAMETER1 := S3;
INIS;
CODE_CODE;
PARAMETER2 := S3;
CMP(LINENUMBER, PARAMETER1, PARAMETER2);
WRITELN(LINENUMBER, ' ', COMMAND, ' ', PARAMETER1, ' ', PARAMETER2);
END;
PROCEDURE CODE_JE();
BEGIN
INIS;
CODE_CODE;
PARAMETER1 := S3;
INIS;
CODE_CODE;
PARAMETER2 := S3;
JE(LINENUMBER, PARAMETER1, PARAMETER2);
WRITELN(LINENUMBER, ' ', COMMAND, ' ', PARAMETER1, ' ', PARAMETER2);
END;
PROCEDURE CODE_JL();
BEGIN
INIS;
CODE_CODE;
PARAMETER1 := S3;
INIS;
CODE_CODE;
PARAMETER2 := S3;
JL(LINENUMBER, PARAMETER1, PARAMETER2);
WRITELN(LINENUMBER, ' ', COMMAND, ' ', PARAMETER1, ' ', PARAMETER2);
END;
PROCEDURE CODE_JMP();
BEGIN
INIS;
CODE_CODE;
PARAMETER1 := S3;
JMP(LINENUMBER, PARAMETER1);
WRITELN(LINENUMBER, ' ', COMMAND, ' ', PARAMETER1);
END;
PROCEDURE CODE_CHK_SPACE();
BEGIN
CHK_SPACE(LINENUMBER);
WRITELN(LINENUMBER, ' ', COMMAND);
END;
PROCEDURE CODE_ADD_CHAR();
BEGIN
INIS;
CODE_CODE;
VARIABLE := S3;
INIS;
CODE_CODE;
PARAMETER1 := S3;
ADD_CHAR(LINENUMBER, VARIABLE, PARAMETER1);
WRITELN(LINENUMBER, ' ', COMMAND, ' ', VARIABLE, ' ', PARAMETER1);
END;
PROCEDURE CODE_INPUT_CHAR();
BEGIN
INIS;
CODE_CODE;
PARAMETER1 := S3;
INPUT_CHAR(LINENUMBER, PARAMETER1);
WRITELN(LINENUMBER, ' ', COMMAND, ' ', PARAMETER1);
END;
PROCEDURE CODE_PRINT_CHAR();
BEGIN
INIS;
CODE_CODE;
PARAMETER1 := S3;
PRINT_CHAR(LINENUMBER, PARAMETER1);
WRITELN(LINENUMBER, ' ', COMMAND, ' ', PARAMETER1);
END;
PROCEDURE CODE_INT();
BEGIN
INIS;
CODE_CODE;
VARIABLE := S3;
INIS;
CODE_CODE;
PARAMETER1 := S3;
INT(LINENUMBER, VARIABLE, PARAMETER1);
WRITELN(LINENUMBER, ' ', COMMAND, ' ', VARIABLE, ' ', PARAMETER1);
END;
PROCEDURE CODE_FILEIN();
BEGIN
INIS;
CODE_CODE;
PARAMETER1 := S3;
INIS;
CODE_CODE;
PARAMETER2 := S3;
FILEIN(LINENUMBER, PARAMETER1, PARAMETER2);
WRITELN(LINENUMBER, ' ', COMMAND, ' ', PARAMETER1, ' ', PARAMETER2);
END;
PROCEDURE CODE_FILEOUT();
BEGIN
INIS;
CODE_CODE;
PARAMETER1 := S3;
INIS;
CODE_CODE;
PARAMETER2 := S3;
FILEOUT(LINENUMBER, PARAMETER1, PARAMETER2);
WRITELN(LINENUMBER, ' ', COMMAND, ' ', PARAMETER1, ' ', PARAMETER2);
END;
PROCEDURE CODE_CHK_EOL();
BEGIN
CHK_EOL(LINENUMBER);
WRITELN(LINENUMBER, ' ', COMMAND);
END;
PROCEDURE CODE_REM();
BEGIN
INIS;
CODE_CODE;
PARAMETER1 := S3;
REM(LINENUMBER, PARAMETER1);
WRITELN(LINENUMBER, ' ', COMMAND, ' ', PARAMETER1);
END;
PROCEDURE CODE_PICK_CHAR();
BEGIN
INIS;
CODE_CODE;
VARIABLE := S3;
INIS;
CODE_CODE;
PARAMETER1 := S3;
INIS;
CODE_CODE;
PARAMETER2 := S3;
PICK_CHAR(LINENUMBER, VARIABLE, PARAMETER1, PARAMETER2);
WRITELN(LINENUMBER, ' ', COMMAND, ' ', VARIABLE, ' ', PARAMETER1, ' ', PARAMETER2);
END;
PROCEDURE CODE_LEN();
BEGIN
INIS;
CODE_CODE;
VARIABLE := S3;
INIS;
CODE_CODE;
PARAMETER1 := S3;
LEN(LINENUMBER, VARIABLE, PARAMETER1);
WRITELN(LINENUMBER, ' ', COMMAND, ' ', VARIABLE, ' ', PARAMETER1);
END;
PROCEDURE CODE_GOSUB();
BEGIN
INIS;
CODE_CODE;
PARAMETER1 := S3;
GOSUB(LINENUMBER, PARAMETER1);
WRITELN(LINENUMBER, ' ', COMMAND, ' ', PARAMETER1);
END;
PROCEDURE CODE_RETURN();
BEGIN
RETURN(LINENUMBER);
WRITELN(LINENUMBER, ' ', COMMAND);
END;
PROCEDURE CODE_END();
BEGIN
WRITELN(LINENUMBER, ' ', COMMAND);
EXIT(LINENUMBER);
END;
PROCEDURE CODE_RUN();
BEGIN
WRITELN(COMMAND);
RUN;
END;
PROCEDURE CODE_BASIC1();
BEGIN
IF (COMMAND = 'INPUT') THEN CODE_INPUT;
IF (COMMAND = 'LET') THEN CODE_LET;
IF (COMMAND = 'PRINT') THEN CODE_PRINT;
IF (COMMAND = 'NEWLINE') THEN CODE_NEWLINE;
IF (COMMAND = 'INCR') THEN CODE_INCR;
IF (COMMAND = 'ADD') THEN CODE_ADD;
IF (COMMAND = 'MUL') THEN CODE_MUL;
IF (COMMAND = 'CMP') THEN CODE_CMP;
IF (COMMAND = 'JE') THEN CODE_JE;
IF (COMMAND = 'JL') THEN CODE_JL;
IF (COMMAND = 'JMP') THEN CODE_JMP;
IF (COMMAND = 'FILEIN') THEN CODE_FILEIN;
IF (COMMAND = 'FILEOUT') THEN CODE_FILEOUT;
IF (COMMAND = 'REM') THEN CODE_REM;
IF (COMMAND = 'CHK_EOL') THEN CODE_CHK_EOL;
IF (COMMAND = 'CHK_SPACE') THEN CODE_CHK_SPACE;
IF (COMMAND = 'INT') THEN CODE_INT;
IF (COMMAND = 'ADD_CHAR') THEN CODE_ADD_CHAR;
IF (COMMAND = 'INPUT_CHAR') THEN CODE_INPUT_CHAR;
IF (COMMAND = 'PRINT_CHAR') THEN CODE_PRINT_CHAR;
IF (COMMAND = 'PICK_CHAR') THEN CODE_PICK_CHAR;
IF (COMMAND = 'LEN') THEN CODE_LEN;
IF (COMMAND = 'GOSUB') THEN CODE_GOSUB;
IF (COMMAND = 'RETURN') THEN CODE_RETURN;
IF (COMMAND = 'END') THEN CODE_END;
IF (COMMAND = 'RUN') THEN CODE_RUN;
END;
PROCEDURE CODE_BASIC();
BEGIN
INIS;
CODE_CODE;
IF (S3 <> 'RUN') THEN
BEGIN
INIH;
INT1(S3);
LINENUMBER := H;
INIS;
CODE_CODE;
COMMAND := S3;
END
ELSE COMMAND := S3;
CODE_BASIC1;
IF (COMMAND <> 'RUN') THEN CODE_BASIC;
END;
PROCEDURE END_BASIC();
BEGIN
CLOSE(MYFILE);
END;
BEGIN
BASIC;
START(10);
WRITELN('10 START');
CODE_BASIC;
END_BASIC;
END.
Compile with pascal compiler and execute
e.g. In ubuntu operating system in terminal type [with the FREEPASCALCOMPILER installed]
fpc BASIC1.PAS or fpc BASIC1.PAS
then ./BASIC1 or ./BASIC2