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) VSET(D,S,L) MSET(D,S,<<L) VCLR(D,L) MCLR(D,<<L) 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+2 ] ]; !(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),S,IMIN(L,VLEN(S))); VEND(S); D ] VUSE(;D,L) [L=0; D=TOM; !D @ >!D ? [ L+=!D; D+=!D ] : D-=!D; L ] WEND(V;L) [ L=VLEN(V); >L-- @ VEND(V!L); VEND(V) ] GETVEC(M) VNEW(M+1) FREEVEC(V) VEND(V) //////////////////////////////////////////////////////////////////////////////// TOLOWER=.CTOL TOUPPER=.CTOU ISCNTRL(C) >=C ? C<=31 ? 1 : C==127 ISSPACE(C) C==32 ? 1 : 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),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,R) [ L=<(D=%S1-%S2)?%S1:%S2; >L-- @ (R=%S1++-%S2++) ? =R; D ] SDIF(S1,S2;L,D,R) [ L=<(D=%S1-%S2)?%S1:%S2; >L-- @ (R=TOUPPER(%S1++)-TOUPPER(%S2++)) ? =R; 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) ] //////////////////////////////////////////////////////////////////////////////// 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 = .VCLR CLRSCR = .VCLS CPUTS = .VWRS DELLINE = .VDEL GETCH = .VRDC GOTOXY = .VGXY INSLINE = .VINS KEYPRESSED= .VKEY PUTCH = .VWRC READKEY = .VRDK 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,T) L<R ? [ MM=>>((LL=L)+(RR=R))&-2; @ [ T=!MM; <FN(!LL,T) @ !LL++; >FN(!RR,T) @ !RR--; LL<=RR ? [ T=!LL; !LL++=!RR; !RR--=T; LL<RR ] ]; QSORT(L,RR,FN); QSORT(LL,R,FN) ] //////////////////////////////////////////////////////////////////////////////// SNODE.INIT(NODE) [ !NODE=0; NODE ] SLIST.PUSH(LIST,NODE) [ !NODE=!LIST; !LIST=NODE; LIST] SLIST.PULL(LIST;NODE) [ NODE=!LIST; !LIST=!NODE; !NODE=0; NODE ] .DNODE.NEXT : 0 .DNODE.PREV : 1 .DNODE : 2 .DLIST.HEAD : 0 .DLIST.TAIL : 3 .DLIST : 4 DNODE.INIT(A) [ A!0=A!1=0; A ] DNODE.JOIN(A,B) [ A ? [ A!0 ? A!0!1=0; A!0=B ]; B ? [ B!1 ? B!1!0=0; B!1=A ] ] DNODE.PULL(A) [ DNODE.JOIN(A!1,A!0); A ] //////////////////////////////////////////////////////////////////////////////// DLIST.INIT(A) [ DNODE.JOIN(DNODE.INIT(A),DNODE.INIT(A!.DNODE$)); A ] DLIST.EMPTY(A) !A==A!.DNODE$ DLIST.PUSHHEAD(A,B) [ DNODE.JOIN(B,A!0); DNODE.JOIN(A+0,B) ] DLIST.PUSHTAIL(A,B) [ DNODE.JOIN(A!3,B); DNODE.JOIN(B,A!.DNODE$) ] DLIST.PULLHEAD(A) DNODE.PULL(A!.DLIST.HEAD) DLIST.PULLTAIL(A) DNODE.PULL(A!.DLIST.TAIL) ////////////////////////////////////////////////////////////////////////////////