& - CALC-DM.BAS SUBPROGRAM( SET UP2L<C()(E)()(H)R( )B()B()$FE()B" "N""PIN()(p)ZOF()(q)/dSPF device codes/nML (M),(M)+x (P),(P),(P),(P) 8 infix, postfix expressions, value, operand stacks,OS Default output to screen 1 ****************************************** *** PRINT HEADER C;; "--------------------------------------------------", ();IN;"DESK CALCULATOR";OF; "--------------------------------------------------"= "Enter Formulas, Variable assignments, or Commands."* "Type HELP for a list of commands."/ "Enter to return to DESKMASTER."1 ******************************************* *** PROMPT AND GET INFIX EXPRESSION EXPORT: T$ 4" MN M Error message, if any*, OP MN M6MN"@ ": "; prompt for inputJ OP  ": ";0TLPF L  GET LINE^ E"ESC" *&h N  re-prompt/r ****************************************)| PARSE INFIX EXPRESSION INTO TOKENS IMPORT: T$  EXPORT: I$(),I9"NOTVAL"I"NOTID" value,identifier flags 6  () For each char in expression (,,) B :)  GET CHARACTER TYPE (TP$)3 T"Bad character" MT 6 T"NUMERIC" "VAL" "NOTVAL" T"OPERATOR" I"ID" "=" I() ()|("(N),("(N))) MN = T"OPERATOR" I"ID" I"NOTID" 0. T"NUMERIC" "VAL" :V T"ALPHA" I"NOTID" ()I"ID" :J T"OPERATOR" I"ID" ()() :& T"NUMERIC" "NOTVAL" ()|("(&(|(,()))),("(&(|(,())))))"VAL" :;0 T"OPERATOR" () ::rD I"ID"  I() ()|("(N),("(N))) MN 2N *******************************************X INTERPRET EXPRESSIONb IMPORT: I$(I)lv  $L() \IUx((),) U T"NUMERIC" ()"=" M"Can't assign a value to a number" ) ()"="  6 2 I"HELP"     LIST COMMANDS9 I"LIST"    LIST VARIABLE VALUESH I"CLEAR" L  M()N : I"PON" OP  Output to printer' I"POFF" OS B I"EX1"  C      Z I"EX2"  C         9  I()  MN   MN 3I  Default: evaluate expression+  B;N Display numeric answer" OP B;N   end with ESC1* ******************************************4 C   7> ( );"Reloading Desk Master..." "DESK-DM.BAS"2H ****************************************** 1R ******************************************/\ *** TRANSLATE UPPERCASE TO LOWERCASE ***%f IMPORT: LW$ (lowercase string)%p EXPORT: UP$ (UPPERCASE STRING)zUN  (L) (L,,)) "Z" (() ) UU. ***************************************3 *** CONVERT INFIX EXPRESSION TO POSTFIX *** IMPORT: I$(),I  EXPORT: P$(),P"T Top of stack I  ()! ")"    PP;$ "/" "*" "-" "+" t'. "*" "/" P"8 T P V5B (T)"*" (T)"/" P#L (T)"(" P<V PP TT(T) K` PP ()(T)TT Nj PP ()(T)(T) 9t "(" TT(T) ~ Identifier# ()"  EMPTY OPERATOR STACK1 ******************************************+ *** EXECUTE POSTFIXED EXPRESSION *** IMPORT: P$(),P EXPORT: NUT Stack top0   For each post-fixed token ()& Perform arithmetic operationN "+" TT(T)(T)(T) 2N "-" TT(T)(T)(T) 2N  "*" TT(T)(T)(T) 2L "/" (T) M"You can't divide by zero!" FN "/" TT(T)(T)(T) 2*( TT(T)&()2-<N(T) The answer, at last!F0P *****************************************,Z *** PUT VALUE INTO VARIABLE TABLE ***d IMPORT: NU,ID$n EXPORT: ME$ x9 For each variable in the table already3 ()I ()N  L > LM M"No more variables allowed. " VLL(L)()(L)N Add value to variable table0 *****************************************, *** GET VALUE FROM VARIABLE TABLE *** IMPORT: ID$ EXPORT: NU,ME$ . For each value in the table7 L M"Undefined variable" "3 ()I N() "  M"Undefined variable""1, ******************************************+6 *** ASSIGN A VALUE TO A VARIABLE ***@ IMPORT: I$(),I J EXPORT: IB,ME$)Tx((),)   GET TYPE3^  T"NUMERIC" N&(())3h  T"ALPHA" I() 3r  I  POSTFIX AND EXECUTE| MN .I() Z  PUT VALUE IN TABLE. *************************************** DISPLAY VARIABLES+ L "No variables set" 3 "::::::::::::: SET VARIABLES ::::::::::::"G OP "::::::::::::::: SET VARIABLES ::::::::::::::"  L# ();"=";()3 OP ();"=";()2 *******************************************# *** EMPTY OPERATOR STACK ***&0 T b: T  >D (T)"(" ()(T)N TTXb0l ***************************************** v *** WAIT FOR RESPONSE *** * ( );"Hit any key to continue...";v(). ***************************************' *** DETERMINE CHARACTER TYPE *** IMPORT: C$ EXPORT: TP$T"Bad character"C ("A" "Z") ("a" "z") T"ALPHA"9 ("0" "9") "." T"NUMERIC"c ")" "(" "+" "-" "*" "/" "=" T"OPERATOR"/ ****************************************  *** LIST COMMANDS ***      "* 4 > OP HR/\ "Like HELP, type command after colon."f1p *******************************************z *** SOPHISTICATED ERROR ROUTINE ***&M"Error in expression" ! So much for sophistication0 ***************************************** *** GET LINE *** IMPORT: LN,FC,LC EXPORT: T$,EC$ENN' for each character input. v() get character ( B B ;' E E"ESC" L  R  L K (()F ()L) B  ' B  ; ' ; OP ; /$ B   ": "; C. B  x(,) )8 L  L :B    add character and get anotherL OP V /` ****************************************&j "Simple calculations: "," "," "+t ": 2+2"," 4"," ",": 5*5"," 25"," "~ ": 2+(8/2)"," 6" "Assignments: "," "," " $ ": A=15"," ",": A"," 15"," "* ": TOTAL=A+15"," ",": TOTAL"," 30" " " " LIST OF COMMANDS" " "- "PON.................TURNS PRINTER ON". "POFF................TURNS PRINTER OFF"5 "LIST................LIST VALUES OF VARIABLES"1 "CLEAR...............ERASES ALL VARIABLES"0 "HELP................LIST THESE COMMANDS"0 "EX1.................SIMPLE CALCULATIONS"1 "EX2.................VARIABLE ASSIGNMENTS"2 "...............RETURN TO DESK MASTER"  " " ULATIONS"1 "EX2.................VARIABLE ASSIGNMENTS"2 "...............RETURN TO DESK M