07-14-2003, 09:07 PM
Well, I fixed things here and there and added support for parentheses. It wasn't that hard. I had problems with the part I had already coded 'cause it read the expressions from left to right... (silly me: recursion works upside down when it is NOT FINAL!!). I've written my own INSTR string which searches from END to BEGINNING.
Parentheses processing takes 22 lines
Parentheses processing takes 22 lines
Code:
DECLARE FUNCTION instrRev% (st1$, st2$)
DECLARE FUNCTION eval% (cmd$)
CLS
PRINT eval%("3+(-3*4+(3-4*(4+3)))")
PRINT
PRINT 3 + (-3 * 4 + (3 - 4 * (4 + 3)))
FUNCTION eval% (cmd$)
' Preprocess parentheses **********************************************
Init% = 1
DO
a% = INSTR(Init%, cmd$, "(")
IF a% <> 0 THEN
Init% = a% + 1: np% = 1: Ps% = Init%: Res$ = ""
DO
IF Ps% > LEN(cmd$) THEN ' Unbalanced Parentheses!
Res$ = "0": Ps% = Init% + 1
EXIT DO
END IF
m$ = MID$(cmd$, Ps%, 1)
IF m$ = ")" AND np% = 1 THEN EXIT DO
Res$ = Res$ + m$
Ps% = Ps% + 1
IF m$ = "(" THEN np% = np% + 1
IF m$ = ")" THEN np% = np% - 1
LOOP
r% = eval%(Res$)
cmd$ = LEFT$(cmd$, Init% - 2) + STR$(r%) + RIGHT$(cmd$, LEN(cmd$) - Ps%)
END IF
LOOP WHILE a% <> 0
' *********************************************************************
cmd$ = LTRIM$(RTRIM$(cmd$))
a% = instrRev%(cmd$, "+")
b% = instrRev%(cmd$, "-")
IF a% = 0 AND b% = 0 THEN
a% = instrRev%(cmd$, "*")
b% = instrRev%(cmd$, "/")
IF a% = 0 AND b% = 0 THEN
Res% = VAL(cmd$)
ELSE
IF a% > b% THEN
Res% = eval%(LEFT$(cmd$, a% - 1)) * eval%(RIGHT$(cmd$, LEN(cmd$) - a%))
ELSE
Res% = eval%(LEFT$(cmd$, b% - 1)) / eval%(RIGHT$(cmd$, LEN(cmd$) - b%))
END IF
END IF
ELSE
' Detect Unary "-" and remove:
IF b% > 1 THEN
lp$ = RTRIM$(LEFT$(cmd$, b% - 1))
IF RIGHT$(lp$, 1) <= "0" OR RIGHT$(lp$, 1) >= "9" THEN b% = 0
END IF
IF a% > b% THEN
Res% = eval%(LEFT$(cmd$, a% - 1)) + eval%(RIGHT$(cmd$, LEN(cmd$) - a%))
ELSE
Res% = eval%(LEFT$(cmd$, b% - 1)) - eval%(RIGHT$(cmd$, LEN(cmd$) - b%))
END IF
END IF
eval% = Res%
END FUNCTION
FUNCTION instrRev% (st1$, st2$)
Res% = 0
FOR i% = LEN(st1$) TO 1 STEP -1
IF MID$(st1$, i%, 1) = st2$ THEN Res% = i%: EXIT FOR
NEXT i%
instrRev% = Res%
END FUNCTION
SCUMM (the band) on Myspace!
ComputerEmuzone Games Studio
underBASIC, homegrown musicians
[img]http://www.ojodepez-fanzine.net/almacen/yoghourtslover.png[/i
ComputerEmuzone Games Studio
underBASIC, homegrown musicians
[img]http://www.ojodepez-fanzine.net/almacen/yoghourtslover.png[/i