Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Formula parser
#11
NECROMANCER!
Screwing with your reality since 1998.
Reply
#12
nah this post was mentioned in another place Wink

@cha0s, ah, I thought all string stuff like that was slower, I'll remember that about asc.
[Image: freebasic.png]
Reply
#13
Quote:NECROMANCER!

You're just jealous 'cause I actually CONTRIBUTED something..


Necromancy would be posting like a simple "heh."

man... -_-;;
Reply
#14
Heh. Big Grin
Screwing with your reality since 1998.
Reply
#15
Cool, I needed an example like this.

Smile
love games!
Reply
#16
awesome!!!!
y smiley is 24 bit.
[Image: anya2.jpg]

Genso's Junkyard:
http://rel.betterwebber.com/
Reply
#17
changed it so its a bit more compressed. Tongue (by 1 line Wink)

Code:
function ParseEq(byval eq as string) as double
    dim as integer curLow=4,curInd,numOfOps=0,numOfPar=1

    'filter spaces
    for c = 0 to len(eq)-1
        if eq[c]=32 then eq=left$(eq,c)+right$(eq,len(eq)-c-1)      
    next c
    
    'get rid of parantheses if they include the whole equation 'ex (234+434*(23+1)) ->  234+434*(23+1)
    if eq[0]=40 and eq[len(eq)-1]=41 then
        for c = 1 to len(eq)-1          
            if eq[c]=41 or eq[c]=40 then numOfPar+=(40-eq[c])*2+1          
            if numOfPar=0 and c<>len(eq)-1 then exit for
            if numOfPar=0 and c=len(eq)-1 then eq=mid$(eq,2,len(eq)-2)
        next
    end if
  
    'find the lowest operator
    for c = 0 to len(eq)-1
      
        'skip stuff inside parantheses in the operation count
        if eq[c]=40 then '(
            numOfPar=1
            
            for tempc = c+1 to len(eq)-1
                if eq[tempc]=41 or eq[tempc]=40 then numOfPar+=(40-eq[tempc])*2+1          
                c=tempc+1
                if numOfPar=0 then exit for
            next
            
            if c>=len(eq) then exit for 'equation end has been reached          
        end if
      
        if eq[c]=43 or eq[c]=45 or eq[c]=42 or eq[c]=47 or eq[c]=94 then numOfOps+=1
        if eq[c]=43 or eq[c]=45 then '+,-
            curLow=44-eq[c]
            curInd=c
        elseif eq[c]=42 or eq[c]=47 then '*,/
            if abs(curLow) > 1 then
                curLow=-((eq[c]-42)/5*4-2)
                curInd=c
            end if
        elseif eq[c]=94 then '^
            if abs(curLow) > 2 then
                curLow=3
                curInd=c
            end if        
        end if
    next
    
    if numOfOps=0 then return val(eq)'single number, no equation to evaluate!
    if abs(curLow)= 1 then return ParseEq(left$(eq,curInd)) + ParseEq(right$(eq,len(eq)-curInd-1))*curLow 'split formula into two formulas, the split being at the lowest operation
    if abs(curLow)= 2 then return ParseEq(left$(eq,curInd)) * ParseEq(right$(eq,len(eq)-curInd-1))^ SGN(curLow)
    if curLow= 3 then return ParseEq(left$(eq,curInd)) ^ ParseEq(right$(eq,len(eq)-curInd-1))  
end function

dim as string eq
eq="(10  ^(2*2))/20+(  90*4)*10+ (1+9)*88  +244  /866-  46^  2-1"
print (10 ^(2*2))/20+( 90*4)*10+ (1+9)*88 +244 /866- 46^ 2-1
print ParseEq(eq)


sleep
[Image: freebasic.png]
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)