Menu

[r263]: / mplcomp.pas  Maximize  Restore  History

Download this file

91 lines (81 with data), 4.7 kB

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
(* MPL - MICRO PROGRAMMING LANGUAGE / COPYRIGHT (C) 2017-2018 DEREK JOHN EVANS *)
FUNCTION ISO(O:OPER):BOOL; BEGIN
IF GO=O THEN BEGIN NEXT; ISO:=TRUE END ELSE ISO:=FALSE END;
FUNCTION NUMB:SHORT; VAR I:SHORT; PI:PSHORT; NEG:BOOL; BEGIN
I:=0; NEG:=GO=OSUB2; IF GK=K4 THEN NEXT;
IF GO=OLIM2 THEN BEGIN I:=GI; NEXT END
ELSE IF LOC(PI) THEN BEGIN IF GS[1]='.' THEN BEGIN I:=PI^; NEXT END
ELSE BEGIN NEXT; IF ISO(OLEA1) THEN I:=PI^
ELSE I:=GX.I[PI^ SHR 1] END END ELSE ERR(EMIS);
IF NEG THEN NUMB:=-I ELSE NUMB:=I END;
PROCEDURE EXPR; FORWARD; PROCEDURE COMP; FORWARD;
PROCEDURE ELEM(K:KIND; BY1:BOOL); VAR I:SHORT; PI:PSHORT; O:OPER; STEP:BOOL;
LABEL 0; BEGIN
IF(K>K2)THEN BEGIN ELEM(PRED(K),TRUE);
WHILE K=GK DO BEGIN O:=GO; NEXT; O1(OSET1); ELEM(PRED(K),TRUE); O1(O) END
END ELSE BEGIN CASE GO OF
OIFEQ:BEGIN NEXT; OI(OTST2,NUMB) END;
OSET1:BEGIN NEXT; EXPR; IF GO=OSET2 THEN NEXT ELSE ERR(ESYN) END;
OSET4:BEGIN NEXT; EXPR; O1(ODONE) END;
OLOOP:BEGIN I:=GP; NEXT; EXPR; O3(OIFNE,I) END;
OLIM2:BEGIN OL(GI); NEXT END; OLIM3:BEGIN O1(OLIM3); WS; NEXT END;
OLD11,OLD12:BEGIN BY1:=GO=OLD11; NEXT; ELEM(K0,BY1);
IF (K=GK)AND(K=K2) THEN BEGIN O1(OSET1); O:=GO; NEXT; EXPR;
IF BY1 THEN O1(PRED(O)) ELSE O1(O) END ELSE OT(OLD12,BY1) END
ELSE BEGIN O:=GO; IF GK IN [K3,K4,K5,K6(*,K7*)] THEN BEGIN
NEXT; ELEM(K1,TRUE); O1(PRED(O)) END
ELSE BEGIN STEP:=O IN [OAD2A,OSU2A]; IF STEP THEN NEXT; IF LOC(PI) THEN
IF GS[1]='.' THEN BEGIN IF STEP THEN ERR(ESYN); OL(PI^); NEXT END
ELSE BEGIN IF PI^<0 THEN OI(OLEA2,PI^) ELSE OL(PI^); NEXT;
IF STEP THEN OT(O,BY1) ELSE IF (K=GK)AND(K=K2) THEN BEGIN
O1(OSET1); O:=GO; NEXT; EXPR; O1(O) END
ELSE CASE GO OF OAD2A:BEGIN OT(OADA2,BY1); NEXT END;
OSU2A:BEGIN OT(OSUA2,BY1); NEXT END; OLEA1:NEXT
ELSE O1(ODREF) END END ELSE ERR(EMIS) END END END;
IF(K>K0)THEN BEGIN 0:CASE GO OF
OLD11,OLD12:BEGIN O1(OSET1); BY1:=GO=OLD11; NEXT; ELEM(K0,TRUE);
IF(K=GK)AND(K=K2)THEN BEGIN OT(OIDX2,BY1); O:=GO; NEXT; EXPR;
IF BY1 THEN O1(PRED(O)) ELSE O1(O) END ELSE OT(OLD22,BY1); GOTO 0 END;
OSET1:BEGIN O1(OSET1); NEXT; I:=1; IF GO<>OSET2 THEN
REPEAT EXPR; O1(OSET1); I:=SUCC(I) UNTIL NOT ISO(OMORE);
OL(I); O1(OMORE); IF ISO(OSET2) THEN GOTO 0 ELSE ERR(ESYN) END END
END END END;
PROCEDURE EXPR;
VAR EX,JP,EQ:SHORT; O:OPER; BEGIN EX:=GP;
IF GO=OINIT THEN BEGIN REPEAT NEXT; EXPR UNTIL GO<>OSTOP;
IF GO=ODONE THEN NEXT ELSE ERR(ESYN) END ELSE ELEM(K8,TRUE);
IF GO IN [OLOOP,OIFEQ] THEN BEGIN O:=GO; EQ:=GP; O3(OIFEQ,0); NEXT; EXPR;
CASE O OF OLOOP:BEGIN O3(OLOOP,EX); OP(EQ,OIFEQ,GP) END;
OIFEQ:IF GO=OIFNE THEN BEGIN JP:=GP; O3(OLOOP,0); OP(EQ,OIFEQ,GP);
NEXT; EXPR; OP(JP,OLOOP,GP) END ELSE OP(EQ,OIFEQ,GP) END END END;
PROCEDURE BODY;
VAR AIMP,AVAR:BOOL; PI:PSHORT; I,LZ:SHORT; LR:REF;
BEGIN WHILE NOT(GO IN [OSTOP,ODONE])AND(GE=0) DO CASE GO OF
ODREF:REPEAT NEXT; COMP; NEXT UNTIL GO<>OMORE;
OINIT:BEGIN LR:=GR; LZ:=GZ; NEXT; BODY; GR:=LR; GZ:=LZ;
IF GO=ODONE THEN NEXT ELSE ERR(ESYN) END
ELSE BEGIN IF ODD(GP) THEN O1(OADD1); AIMP:=ISO(OLD22);
WRITE(CHR(13),GP:5,': ',GS); CLREOL;
IF GO<>OLIM1 THEN ERR(ESYN) ELSE BEGIN AVAR:=GS[1]<>'.';
IF AIMP THEN IF LOC(PI) THEN IF AVAR THEN GX.I[PI^ SHR 1]:=GP
ELSE ERR(ESYN) ELSE ERR(EMIS) ELSE BEGIN ADD(PI); PI^:=GP END;
IF GE=0 THEN BEGIN NEXT; CASE GO OF
OIFNE:BEGIN NEXT; PI^:=NUMB END;
OSET4:REPEAT NEXT; CASE GO OF
OLD11:BEGIN NEXT; GP:=GP+NUMB END;
OLD12:BEGIN NEXT; GP:=GP+NUMB SHL 1 END;
OLIM3:BEGIN WS; NEXT END ELSE WI(NUMB) END UNTIL GO<>OMORE;
OSET1:BEGIN (*WRITELN;*) IF AVAR THEN IF NOT AIMP THEN WI(GP+2); NEXT;
LR:=GR; LZ:=GZ; I:=1; IF GO<>OSET2 THEN
REPEAT REPEAT IF GO<>OSTOP THEN IF GS[1]='.' THEN ERR(ESYN)
ELSE BEGIN ADD(PI); PI^:=-I; NEXT; CASE GO OF
OLD11:BEGIN NEXT; I:=I+SUCC(NUMB) SHR 1 END;
OLD12:BEGIN NEXT; I:=I+NUMB END ELSE I:=SUCC(I) END;
END UNTIL NOT ISO(OMORE) UNTIL NOT ISO(OSTOP);
IF NOT ISO(OSET2) THEN ERR(ESYN); O2(OINIT,CHR(I)); EXPR; O1(ODONE);
GR:=LR; GZ:=LZ END ELSE IF AVAR THEN ERR(ESYN) END END END END END END;
PROCEDURE COMP; VAR T:TEXT; LT:PTEXT; LC:CHAR; PI:PSHORT; BEGIN
LT:=GT; LC:=GC; GT:=PTR(ADDR(T)); GC:=CHR(32); GO:=OLIM1;
IF NOT LOC(PI) THEN BEGIN ADD(PI);
IF ENTER THEN BEGIN NEXT; BODY; LEAVE END ELSE ERR(EMIS) END;
GT:=LT; GC:=LC; END;
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.