MPL Bytecode Compiler Code
Micro Programming Language - A Portable Language for Micro Computers
Status: Beta
Brought to you by:
buzzphp
##LIBSTR CIS=.FINP. COS=.FOUT. FINDINPUT=.NIL. FINDOUTPUT=.NIL. ENDSTREAM=.NIL. [ .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 ] ENDOFSTREAM(F).FEOF.(F) SELECTINPUT (F;R)F?[R=CIS;CIS=F;R] SELECTOUTPUT(F;R)F?[R=COS;COS=F;R] ENDREAD()ENDSTREAM(CIS) ENDWRITE()ENDSTREAM(COS) GETBYTE(P,I)P%I PUTBYTE(P,I,V)P%I=V RDCH() VAL.=.FRDC.(CIS) WRCH(C) VAL.=.FWRC.(COS,C) NEWLINE()WRCH('*N') READS(S)==ENDOFSTREAM(CIS)?[%S=0;@[S%(%S+=1)=RDCH();==(?-1||?'*N')];%S-=1;S] READN(;SUM,NEG) [ SUM=NEG=0;@[RDCH();?'*S'||?'*T'||?'*N'];(NEG=?'-')||?'+'?RDCH(); VAL.>='0'&&VAL.<='9'@[SUM=SUM*10+VAL.-'0';RDCH()];NEG?-SUM:SUM ] WRITES(S) .FWRS.(COS,S) // [E=S+%S;S<E@WRCH(%++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')] WRITEHEX(I,W) [>--W?WRITEHEX(I>>4,W);WRCH("0123456789ABCDEF"%((I&15)+1))] WRITED(I,W;S%16)[.SOFI.(S$,I,0);W-=%S$;>W--@WRCH('*S');WRITES(S$)] /* WRITED(N,D;T%10,I,J,K) [ K=<N?[--D;-N],N;I=0;@[T$%I=K/$10+'0';++I;K/=10]; J=I+1;J<=D@[WRCH('*S');++J];<N?WRCH('-'); J=I-1;>=J@[WRCH(T$%J);--J]] */ WRITEN(I)WRITED(I,0) WRITEU(I,W;J)[(J=(>>I&.INT.MAX.)/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] DECVAL(C)C-(C>=97?87:C>=65?55:48) CAPITALCH(C)C-(C>=97?C<=122?32) COMPCH(C1,C2)CAPITALCH(C1)-CAPITALCH(C2) COMPSTRING(S1,S2;L,I,R)[L=%S1<%S2?%S1:%S2; I=0;++I<=L@(R=COMPCH(S1%I,S2%I))?=R; %S1-%S2] WRITEF(S;ARGS!10,P,A,E) [P=ARGS$;E=S+%S; S<E@(VAL.=%++S)=='%'?[VAL.=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)):?'T'?WRITET (A,DECVAL(%++S)): [WRCH(VAL.);!P--]]:WRCH(VAL.)] GETVEC(N)VECNEW(N+1) FREEVEC(V)VECEND(V)