Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Expression evaluator
#31
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 Sad

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
Reply


Messages In This Thread
Expression evaluator - by Nexinarus - 07-10-2003, 10:48 AM
Expression evaluator - by Agamemnus - 07-10-2003, 05:46 PM
Expression evaluator - by toonski84 - 07-10-2003, 07:05 PM
Expression evaluator - by Moneo - 07-10-2003, 11:36 PM
Expression evaluator - by Antoni Gual - 07-10-2003, 11:48 PM
Re: Expression evaluator - by Mango - 07-11-2003, 12:29 AM
Expression evaluator - by toonski84 - 07-11-2003, 12:38 AM
Expression evaluator - by whitetiger0990 - 07-11-2003, 01:39 AM
Expression evaluator - by Moneo - 07-11-2003, 03:44 AM
Expression evaluator - by Nexinarus - 07-11-2003, 03:55 AM
Expression evaluator - by Moneo - 07-11-2003, 06:30 AM
Expression evaluator - by oracle - 07-11-2003, 07:09 AM
Expression evaluator - by Moneo - 07-11-2003, 09:02 AM
Expression evaluator - by na_th_an - 07-12-2003, 06:48 PM
Expression evaluator - by oracle - 07-14-2003, 03:37 AM
Expression evaluator - by Moneo - 07-14-2003, 04:18 AM
Expression evaluator - by Agamemnus - 07-14-2003, 05:06 AM
Expression evaluator - by Moneo - 07-14-2003, 05:22 AM
Expression evaluator - by na_th_an - 07-14-2003, 05:53 AM
Expression evaluator - by Moneo - 07-14-2003, 05:59 AM
huh? - by Agamemnus - 07-14-2003, 06:36 AM
Expression evaluator - by Moneo - 07-14-2003, 07:09 AM
Expression evaluator - by oracle - 07-14-2003, 07:12 AM
Expression evaluator - by Moneo - 07-14-2003, 07:35 AM
Expression evaluator - by relsoft - 07-14-2003, 10:30 AM
Expression evaluator - by Nexinarus - 07-14-2003, 04:12 PM
Expression evaluator - by na_th_an - 07-14-2003, 04:48 PM
Expression evaluator - by Agamemnus - 07-14-2003, 05:53 PM
Expression evaluator - by na_th_an - 07-14-2003, 06:55 PM
Expression evaluator - by Agamemnus - 07-14-2003, 08:26 PM
Expression evaluator - by na_th_an - 07-14-2003, 09:07 PM
Expression evaluator - by Agamemnus - 07-14-2003, 09:14 PM
Expression evaluator - by Moneo - 07-15-2003, 03:54 AM
Expression evaluator - by na_th_an - 07-15-2003, 04:37 AM
Expression evaluator - by Moneo - 07-15-2003, 06:06 AM
Expression evaluator - by Nexinarus - 07-16-2003, 03:34 AM
Expression evaluator - by Agamemnus - 07-16-2003, 04:03 AM
Expression evaluator - by na_th_an - 07-16-2003, 04:14 AM
Expression evaluator - by Nexinarus - 07-16-2003, 04:52 AM
Expression evaluator - by Agamemnus - 07-16-2003, 05:57 AM
Expression evaluator - by Nexinarus - 07-16-2003, 06:29 AM
Expression evaluator - by Moneo - 07-20-2003, 11:39 PM
Expression evaluator - by Nexinarus - 07-21-2003, 09:49 AM
Expression evaluator - by oracle - 07-21-2003, 09:51 AM
Expression evaluator - by Nexinarus - 07-21-2003, 10:00 AM
Expression evaluator - by Blitz - 07-22-2003, 07:38 AM
Expression evaluator - by Agamemnus - 07-22-2003, 07:12 PM
Expression evaluator - by Nexinarus - 07-23-2003, 09:40 AM
Expression evaluator - by na_th_an - 07-23-2003, 03:04 PM
Expression evaluator - by Agamemnus - 07-23-2003, 05:03 PM
Expression evaluator - by na_th_an - 07-23-2003, 05:16 PM
Expression evaluator - by Nexinarus - 07-24-2003, 12:41 AM
Expression evaluator - by Agamemnus - 07-24-2003, 12:57 AM
Expression evaluator - by Nexinarus - 07-24-2003, 09:46 AM
Expression evaluator - by toonski84 - 07-24-2003, 10:03 AM
Expression evaluator - by Nexinarus - 07-24-2003, 10:06 AM
Expression evaluator - by toonski84 - 07-24-2003, 10:14 AM
Expression evaluator - by Nexinarus - 07-24-2003, 02:16 PM

Forum Jump:


Users browsing this thread: 2 Guest(s)