MPL Bytecode Compiler Code
Micro Programming Language - A Portable Language for Micro Computers
Status: Beta
Brought to you by:
buzzphp
##LIBMPX //////////////////////////////////////////////////////////////////////////////// .NIL : 0 .FALSE : 0 .TRUE : 1 .EOF : -1 .INT.MIN : -32768 .INT.MAX : 32767 .LONG : 2 .REAL : 4 .STRING : 64 .STR127 : 64 //////////////////////////////////////////////////////////////////////////////// ISQR=.ISQR IABS=.IABS IMIN=.IMIN IMAX=.IMAX IRND.SEED=0 IRND() IRND.SEED=IRND.SEED*41965+7473 //////////////////////////////////////////////////////////////////////////////// MSET=.MSET MCPY=.MCPY MREV=.MREV MCLR(D,L) MSET(D,0,L) MMOD(D,S,L,F) [ >L-- @ D%L=F(S%L); D ] //////////////////////////////////////////////////////////////////////////////// VCPY(D,S,L) MCPY(D,S,<<L) VCLR(D,L) MCLR(D,<<L) VSET(D,S,L) [ >L-- @ D!L=S; D ] VMOD(D,S,L,F) [ >L-- @ D!L=F(S!L); D ] VNEW(L;D,S) >=L ? [ L=<<L+2; S=TOM; !S @ [ >!S @ S+=!S; D=S; <!S @ S-=!S; <((!D=D-S)+L) ? [ !(D+L)=!D+L; !D++=L; =D ] ]; !(TOM-=L)=L; TOM+2 ] VEND(D) D-- ? >!D ? !D=-!D VLEN(D) D-- ? >!D ? >>!D-1 VOLD(S,L;D) ==S ? VNEW(L) : L==VLEN(S) ? S : [ D=VCPY(VNEW(L)?:=0,S,IMIN(L,VLEN(S))); VEND(S); D ] VUSE(;S,L) [ L=0; S=TOM; !S @ >!S ? [ L+=!S; S+=!S ] : S-=!S; L ] WEND(V;L) [ L=VLEN(V); >L-- @ VEND(V!L); VEND(V) ] GETVEC(M) VNEW(M+1) FREEVEC(V) VEND(V) //////////////////////////////////////////////////////////////////////////////// TOLOWER=.CLWR TOUPPER=.CUPR ISCNTRL(C) >=C ? C<=31 ?: C==127 ISSPACE(C) C==32 ?: C>=9 ? C<=13 ISDIGIT(C) C>=48 ? C<=57 ISUPPER(C) C>=65 ? C<=90 ISLOWER(C) C>=97 ? C<=122 ISGRAPH(C) C>=33 ? C<=126 ISPRINT(C) C>=32 ? C<=126 ISALPHA(C) ISUPPER(C)?:ISLOWER(C) ISALNUM(C) ISALPHA(C)?:ISDIGIT(C) TOASCII(C) C&127 //////////////////////////////////////////////////////////////////////////////// SADD=.SADD SCHR=.SCHR SCPY=.SCPY SDEL=.SDEL SFIX=.SFIX SINS=.SINS SMID=.SMID SSTR=.SSTR SLEN(S) %S SREV(S) MREV(S+1,%S)-1 SDUP(S) SCPY(VNEW(>>%S+1)?:=0,S) SUPR(D,S) MMOD(D+1,S+1,%D=%S,TOUPPER)-1 SLWR(D,S) MMOD(D+1,S+1,%D=%S,TOLOWER)-1 SCMP(S1,S2;L,D) [ L=<(D=%S1-%S2)?%S1:%S2; >L-- @ (TMP=%S1++-%S2++) ? =TMP; D ] SDIF(S1,S2;L,D) [ L=<(D=%S1-%S2)?%S1:%S2; >L-- @ (TMP=TOUPPER(%S1++)-TOUPPER(%S2++)) ? =TMP; D ] ITOA(I,S;N) [ N=<I?I=-I; %S=0; @ [ S%(%S+=1)=I\10+'0'; I/=10 ]; N ? S%(%S+=1)='-'; SREV(S) ] VSPRINTF(S,F,P;FF,N%10) [ FF=%S=0; FF<%F @ (AUX=F%++FF)<>'%' ? S%(%S+=1)=AUX : [ AUX=TOUPPER(F%++FF); ?'S' ? SADD(S,!P) : ?'C' ? S%(%S+=1)=!P : ?'I'||?'D' ? SADD(S,ITOA(!P,N$)) : [ S%(%S+=1)=AUX; !P-- ]; !P++]; S ] SPRINTF(STR,FMT;ARGS!10) VSPRINTF(STR,FMT,ARGS$) //////////////////////////////////////////////////////////////////////////////// SWHILE(S,L,IS) [ (L<=%S?<>IS(S%L)) @ ++L; L ] SUNTIL(S,L,IS) [ (L<=%S?==IS(S%L)) @ ++L; L ] STOKEN(D,S,L,IS) [ SMID(D,S,L=SWHILE(S,L,IS),(D=SUNTIL(S,L,IS))-L); D ] SPARSE(D,S,L) [ STOKEN(D,S,L,ISSPACE) ] //////////////////////////////////////////////////////////////////////////////// CIS=.FINP COS=.FOUT .DIGITS="0123456789ABCDEF" FINDINPUT=0 FINDOUTPUT=0 ENDSTREAM=0 [ .STREAMS=%.FINP NEWSTREAM(;F) [ F=.FMIN; F<=.FMAX @ ==.STREAMS%F ? =F ] ::ENDSTREAM(F) F ? [ .STREAMS%F=0; .FEND(F)] ::FINDINPUT(FN;F) (F=NEWSTREAM()) ? .FOLD(F,FN) ? .STREAMS%F=F ::FINDOUTPUT(FN;F)(F=NEWSTREAM()) ? .FNEW(F,FN) ? .STREAMS%F=F ] SELECTINPUT (F) F ? [ TMP=CIS; CIS=F; TMP ] SELECTOUTPUT(F) F ? [ TMP=COS; COS=F; TMP ] ENDREAD() ENDSTREAM(CIS) ENDWRITE() ENDSTREAM(COS) GETBYTE(P,I) P%I PUTBYTE(P,I,V) P%I=V RDCH( ) AUX=.FRDC(CIS,TMP$) ? %(TMP$) : .EOF WRCH(C) AUX=.FWRC(COS,C) ? C : .EOF NEWLINE() WRCH('*N') READS(S) .FRDS(CIS,S) READN(;SUM,NEG) [ SUM=NEG=0; @ ISSPACE(RDCH()); (NEG=?'-')||?'+' ? RDCH(); ISDIGIT(AUX) @ [ SUM=SUM*10+AUX-'0'; RDCH() ]; NEG ? -SUM : SUM ] WRITES(S) .FWRS(COS,S) WRITET(S,W) WRITES(S) ? [ W-=%S; >W-- @ WRCH('*S') ] WRITEBIN(I,W) [ >--W ? WRITEBIN(I>>1,W); WRCH((I&1)+'0') ] WRITEOCT(I,W) [ >--W ? WRITEOCT(I>>3,W); WRCH((I&7)+'0') ] WRITEDEC(I,W) [ >--W ? WRITEDEC(I/10,W); WRCH(.DIGITS%((I\10)+1)) ] WRITEHEX(I,W) [ >--W ? WRITEHEX(I>>4,W); WRCH(.DIGITS%((I&15)+1)) ] WRITED(I,W;S%16) [ .SOFI(S$,I,0); W-=%(S$); >W-- @ WRCH('*S'); WRITES(S$) ] WRITEN(I) WRITED(I,0) WRITEU(I,W;J) [ (J=>>I/5) ? [ WRITED(J,W-1); W=1 ]; WRITED(I-J*10,W) ] STR2NUMB(S;A,I,DIG) [ A=I=0; ++I<=%S @ [ DIG=S%I-'0'; (>=DIG)&&(DIG<=9) ? A=A*10+DIG ]; S%1=='-' ? -A : A ] CAPITALCH : TOUPPER$ COMPSTRING : SDIF$ COMPCH(C1,C2) CAPITALCH(C1)-CAPITALCH(C2) DECVAL(C) C-(C>=97?87:C>=65?55:48) WRITEF(S;ARGS!10,P,A,E) [ P=ARGS$; E=S+%S; S<E @ (AUX=%++S)=='%' ? [ AUX=CAPITALCH(%++S); A=!P++; ?'S' ? WRITES(A) : ?'N' ? WRITEN(A) : ?'C' ? WRCH(A) : ?'I' ? WRITED (A,DECVAL(%++S)) : ?'U' ? WRITEU (A,DECVAL(%++S)) : ?'B' ? WRITEBIN(A,DECVAL(%++S)) : ?'O' ? WRITEOCT(A,DECVAL(%++S)) : ?'X' ? WRITEHEX(A,DECVAL(%++S)) : ?'D' ? WRITEDEC(A,DECVAL(%++S)) : ?'T' ? WRITET (A,DECVAL(%++S)) : [ WRCH(AUX); !P-- ] ] : WRCH(AUX) ] VGET(FN;V,F,S!.STR127) (F=SELECTINPUT(FINDINPUT(FN))) ? [ V=0; READS(S$) @ [ V=VOLD(V,VLEN(V)+1); V!(VLEN(V)-1)=SDUP(S$) ]; ENDREAD(); SELECTINPUT(F); V ] //////////////////////////////////////////////////////////////////////////////// STDIN=.FINP STDOUT=.FOUT FOPEN(FN,FM) [ AUX=%FM ? TOUPPER(FM%1); ?'R' ? FINDINPUT (FN) : ?'W' ? FINDOUTPUT(FN) ] FCLOSE(F) ENDSTREAM(F) FEOF(F) .FEOF(F) FPUTC(C,F) .FWRC(F,C) ? C : .EOF FGETC(F) .FRDC(F,TMP$) ? %(TMP$) : .EOF FPUTS(S,F;SS) [ SS=0; (SS+=1)<=%S @ FPUTC(S%SS,F); S ] FGETS(S,F;C) ==FEOF(F) ? [ %S=0; (C=FGETC(F))<>.EOF&&C<>'*N' @ S%(%S+=1)=C; S ] GETS(S) FGETS(S,STDIN) ? [ S%%S=='*N' ? %S-=1; S ] PUTS(S) [ FPUTS(S,STDOUT); FPUTC('*N',STDOUT); S ] PRINTF(FMT,ARGS!10;STR!.STR127) FPUTS(VSPRINTF(STR$,FMT,ARGS$),STDOUT) FPRINTF(F,FMT,ARGS!10;STR!.STR127) FPUTS(VSPRINTF(STR$,FMT,ARGS$),F) PUTI(A%10) PUTS(ITOA(A,A$)) //////////////////////////////////////////////////////////////////////////////// .VK.LEFT : 19200 .VK.RIGHT : 19712 CLREOL = .TCLR CLRSCR = .TCLS CPUTS = .TWRS DELLINE = .TDEL GETCH = .TRDC GOTOXY = .TGXY INSLINE = .TINS KEYPRESSED= .TKEY PUTCH = .TWRC READKEY = .TRDK CPUTSXY(S,X,Y) [ GOTOXY(X,Y); CPUTS(S) ] CPRINTF(F,A!10;S!.STR127) CPUTS(VSPRINTF(S$,F,A$)) //////////////////////////////////////////////////////////////////////////////// QSORT(L,R,FN;LL,RR,MM) L<R ? [ MM=>>((LL=L)+(RR=R))&-2; @ [ <FN(!LL,!MM) @ !LL++; >FN(!RR,!MM) @ !RR--; LL<=RR ? [ TMP=!LL; !LL++=!RR; !RR--=TMP; LL<RR ] ]; QSORT(L,RR,FN); QSORT(LL,R,FN) ] //////////////////////////////////////////////////////////////////////////////// NODE.INIT(A) [ !A=0; A ] LIFO.PUSH(A,B) [ !B=!A; !A=B; A] LIFO.PULL(A;B) [ B=!A; !A=!B; !B=0; B ] //////////////////////////////////////////////////////////////////////////////// .CARD.NEXT : 0 .CARD.PREV : 1 .CARD : 2 .DECK.HEAD : 0 .DECK.TAIL : 3 .DECK : 4 CARD.INIT(A) [ A!0=A!1=0; A ] CARD.JOIN(A,B) [ A ? [ A!0 ? A!0!1=0; A!0=B ]; B ? [ B!1 ? B!1!0=0; B!1=A ] ] CARD.PULL(A) [ CARD.JOIN(A!1,A!0); A ] //////////////////////////////////////////////////////////////////////////////// DECK.INIT(A) [ CARD.JOIN(CARD.INIT(A),CARD.INIT(A!.CARD$)); A ] DECK.EMPTY(A) !A==A!.CARD$ DECK.PUSHHEAD(A,B) [ CARD.JOIN(B,A!0); CARD.JOIN(A+0,B) ] DECK.PUSHTAIL(A,B) [ CARD.JOIN(A!3,B); CARD.JOIN(B,A!.CARD$) ] DECK.PULLHEAD(A) CARD.PULL(A!.DECK.HEAD) DECK.PULLTAIL(A) CARD.PULL(A!.DECK.TAIL) //////////////////////////////////////////////////////////////////////////////// // THIS CODE MAY/WILL CHANGE //////////////////////////////////////////////////////////////////////////////// .OBJECT=0,0,0,0 .BASE:0 .SIZE:1 .INIT:2 .DONE:3 INVOKE(O,M) [ !O!M(O) ] CREATE(T;O) [ (O=VNEW(T!.SIZE)) ? [ !O=T; INVOKE(O,.INIT) ]; O ] FINISH(O) [ O ] ////////////////////////////////////////////////////////////////////////////////