MPL Bytecode Compiler Code
Micro Programming Language - A Portable Language for Micro Computers
Status: Beta
Brought to you by:
buzzphp
/* A SIMPLE REVERSE POLISH NOTATION CALCULATOR */ ##LIBHDR .STACK=%1024 SP=.STACK .SSS=!.STR127 POP() SP>.STACK ? SP=SP!-.REAL$ : [ WRITES("<EMPTY STACK>*N"); 0 ] EVAL(S;T) [ ++S%(S%-1)=0; %S @ [ ISSPACE(%S) @ ++S; T=S-1; (%S?==ISSPACE(%S)) @ ++S; (%T=S-T-1) ? [ //WRITEF("[%S]*N", T); (T%1=='*+'?%T==1) ? [ POP() ? .RADD(SP,SP,SP!.REAL$) ] : (T%1=='*-'?%T==1) ? [ POP() ? .RSUB(SP,SP,SP!.REAL$) ] : (T%1=='**'?%T==1) ? [ POP() ? .RMUL(SP,SP,SP!.REAL$) ] : (T%1=='*/'?%T==1) ? [ POP() ? .RDIV(SP,SP,SP!.REAL$) ] : ==SDIF(T,"SQR" ) ? [ .RSQR(SP,SP) ] : ==SDIF(T,"SQRT" ) ? [ .RSRT(SP,SP) ] : ==SDIF(T,"SIN" ) ? [ .RSIN(SP,SP) ] : ==SDIF(T,"COS" ) ? [ .RCOS(SP,SP) ] : ==SDIF(T,"EXP" ) ? [ .REXP(SP,SP) ] : ==SDIF(T,"ATAN" ) ? [ .RATN(SP,SP) ] : (T%1=='*.'?%T==1) ? [ POP() ? WRITEF("= %S*N",.SOFR(.SSS,SP!.REAL$,1,2)) ] : [ .ROFS(SP=SP!.REAL$,T); AUX ? [ SP=SP!-.REAL$; WRITES("ERROR!*N") ] ] ] ] ] .(;S!.STR127) [ WRITEF("REVERSE POLISH NOTATION (RPN) CALCULATOR*N"); 1 @ [ WRITES("? "); READS(S$); EVAL(S$) ]; 0 ]