77 lines
2.3 KiB
Plaintext
77 lines
2.3 KiB
Plaintext
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
|