Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Formula parser
#1
Under pressure from bluekeyboard, I coded a small formula parser which breaks down and solves a formula (ex (10 ^(2*2))/20+( 90*4)*10+ (1+9)*88 +244 /866- 46^ 2-1 )

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 curLow= 2 then return ParseEq(left$(eq,curInd)) * ParseEq(right$(eq,len(eq)-curInd-1))
    if curLow=-2 then return ParseEq(left$(eq,curInd)) / ParseEq(right$(eq,len(eq)-curInd-1))
    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


Messages In This Thread
Formula parser - by Deleter - 12-22-2005, 03:31 AM
Formula parser - by TheBlueKeyboard - 12-23-2005, 05:39 AM
Formula parser - by MystikShadows - 12-23-2005, 05:55 AM
Formula parser - by Agamemnus - 12-23-2005, 11:06 AM
Formula parser - by Deleter - 12-23-2005, 08:02 PM
Formula parser - by Anonymous - 12-23-2005, 10:15 PM
Formula parser - by Agamemnus - 12-24-2005, 11:23 AM
Formula parser - by anarky - 12-24-2005, 09:41 PM
Formula parser - by Deleter - 12-25-2005, 01:50 AM
Formula parser - by Anonymous - 06-28-2006, 08:44 PM
Formula parser - by anarky - 06-28-2006, 08:46 PM
Formula parser - by Deleter - 06-28-2006, 09:05 PM
Formula parser - by Anonymous - 06-28-2006, 10:21 PM
Formula parser - by anarky - 06-28-2006, 10:27 PM
Formula parser - by MikeS - 07-08-2006, 11:43 PM
Formula parser - by relsoft - 07-09-2006, 07:25 PM
Formula parser - by Deleter - 07-10-2006, 04:37 AM

Forum Jump:


Users browsing this thread: 1 Guest(s)