10 REM Parsing/RPN calculator algorithm 20 MAX.INDEX% = 63 30 REM Stack 40 REM TOP.INDEX% - top index of the stack 50 DIM ELEMS(MAX.INDEX%) 60 EXPR$ = "3 4 2 * 1 5 - 2 3 ^ ^ / +": GOSUB 200 70 END 190 REM ** Evaluate the expression in RPN 200 GOSUB 1000 210 PRINT "Input", "Operation", "Stack after" 220 REM SP% - start position of token, DP% - position of delimiter 230 DP% = 0 240 REM Loop: do ... until DP% = 0 250 SP% = DP% + 1 260 DP% = INSTR(DP% + 1, EXPR$, " ") 270 IF DP% = 0 THEN TOKEN$ = MID$(EXPR$, SP%, LEN(EXPR$) - SP% + 1) ELSE TE% = DP% - 1: TOKEN$ = MID$(EXPR$, SP%, DP% - SP%) 280 PRINT TOKEN$, 290 IF TOKEN$ <> "*" THEN 350 300 PRINT "Operate", 310 GOSUB 1060: SECOND = POP 320 GOSUB 1060: FIRST = POP 330 X = FIRST * SECOND: GOSUB 1160 340 GOTO 610 350 IF TOKEN$ <> "/" THEN 410 360 PRINT "Operate", 370 GOSUB 1060: SECOND = POP 380 GOSUB 1060: FIRST = POP 390 X = FIRST / SECOND: GOSUB 1160 400 GOTO 610 410 IF TOKEN$ <> "-" THEN 470 420 PRINT "Operate", 430 GOSUB 1060: SECOND = POP 440 GOSUB 1060: FIRST = POP 450 X = FIRST - SECOND: GOSUB 1160 460 GOTO 610 470 IF TOKEN$ <> "+" THEN 530 480 PRINT "Operate", 490 GOSUB 1060: SECOND = POP 500 GOSUB 1060: FIRST = POP 510 X = FIRST + SECOND: GOSUB 1160 520 GOTO 610 530 IF TOKEN$ <> "^" THEN 590 540 PRINT "Operate", 550 GOSUB 1060: SECOND = POP 560 GOSUB 1060: FIRST = POP 570 X = FIRST ^ SECOND: GOSUB 1160 580 GOTO 610 590 PRINT "Push", 600 X = VAL(TOKEN$): GOSUB 1160 610 GOSUB 1100 620 IF DP% <> 0 THEN 250 630 GOSUB 1060: 640 PRINT "Final answer: "; POP 650 GOSUB 1030 660 IF NOT EMPTY% THEN PRINT "Error, too many operands: "; : GOSUB 1100: STOP 670 RETURN 980 REM ** Operations on the stack 990 REM ** Make the stack empty 1000 TOP.INDEX% = MAX.INDEX% + 1 1010 RETURN 1020 REM ** Is the stack empty? 1030 EMPTY% = TOP.INDEX% > MAX.INDEX% 1040 RETURN 1050 REM ** Pop from the stack 1060 GOSUB 1030 1070 IF NOT EMPTY% THEN POP = ELEMS(TOP.INDEX%): TOP.INDEX% = TOP.INDEX% + 1 ELSE PRINT "The stack is empty.": STOP 1080 RETURN 1090 REM ** Print the stack 1100 FOR PTR% = TOP.INDEX% TO MAX.INDEX% 1110 PRINT USING "######.###"; ELEMS(PTR%); 1120 NEXT PTR% 1130 PRINT 1140 RETURN 1150 REM ** Push to the stack 1160 IF TOP.INDEX% > 0 THEN TOP.INDEX% = TOP.INDEX% - 1: ELEMS(TOP.INDEX%) = X ELSE PRINT "The stack is full.": STOP 1170 RETURN