December 04, 2020, 11:24:07 AM

Author Topic: [bb] Math Evaluation by Zenith(Matt Griffith) [ 1+ years ago ]  (Read 443 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : Math Evaluation
Author : Zenith(Matt Griffith)
Posted : 1+ years ago

Description : This is my math evaluation function with an example. It outputs to easy to read asm code, which you can easily change.. It is mathmatically correct, and works out ()'s

Tell me what you think :)


Code :
Code: BlitzBasic
  1. ; zenith's Math Evaluation Function (WITH EXAMPLE!)
  2. ; please give me credit if you use this in anyway shape or form (haha)
  3. ; if you have questions, please don't spam me by email
  4. ; but find me on IRC at: irc.blitzed.org on channel #blitzbasic or #blitzcoder
  5. ; If you're jsut going to steal my code and give me no credits, just remember I worked very hard on this.. :)
  6.  
  7. ; Here is where you add Mathmatical operators
  8. Const opmax=10
  9. Global op$[opmax]
  10. ; op you use in to eval on left, asm op name on right
  11. ; use with proper math ordering, where 0=last thing it checks, opmax= first thing it checks
  12. op[0]="+,add"
  13. op[1]="-,sub"
  14. op[2]="*,mul"
  15. op[3]="/,div"
  16. op[4]="%,mod"
  17. ; bitwise ops
  18. op[5]="&,and"
  19. op[6]="|,or"
  20. op[6]="^,eor"
  21. op[7]=">>,shr"
  22. op[8]="<<,shl"
  23. ;logical ops
  24. op[9]="&&,and"
  25. op[10]="||,or"
  26.  
  27. ; Create a function called int()
  28. f.func = New func
  29. f
  30. ame="calldll"
  31.  
  32. ; ------------- EXAMPLE ------------
  33. Global file=WriteFile("output.txt"),time=MilliSecs()
  34. evalme$="-34--rab*345/calldll(34)"      ;what we will be evaluating
  35. evalme$=cleanupNeg(evalme)
  36. Printf "// problem: "+evalme
  37. eval(evalme)                                                            ; evaluate the problem
  38. Printf "// "+(MilliSecs()-time)+"ms taken"      ; how long it took to eval
  39. CloseFile(file)                                                         ; close the file
  40. ExecFile "output.txt"                                           ; open up the file
  41. End
  42. ; ----------------------------------
  43.  
  44.  
  45. ; list of functions
  46. Type func
  47. Field name$
  48. End Type
  49.  
  50. Function cleanupneg$(in$)
  51.         Local out$
  52.         For i=1 To Len(in)
  53.                 m$=Mid(in,i,1)
  54.                 n$=Mid(in,i+1,1)
  55.                 If m="-" And n="-"
  56.                         o$=Right(in,Len(in)-i-1)
  57.                         in$=Left(in,i-1)+"-(-"+o+")"
  58.                         printf in
  59.                 EndIf
  60.         Next
  61.         Return in
  62. End Function
  63.  
  64. Function eval(in$)
  65.         ; In my eval function, once something is worked out, it is pushed into the stack..
  66.         ; then what we just worked is renamed to 'stack'
  67.         ; whenever it reads stack, it pop's it to a register and then uses it
  68.         Local vari$
  69.        
  70.         For i=1 To Len(in)
  71.                 m$=Mid(in,i,1)
  72.                 If m="("
  73.                         ble$=find_back(in,i,2)
  74.                         f.func = findfunc(ble)
  75.                         ; we've found a function
  76.                         If f<>Null
  77.                                 io$=find_next(in,i,0)                   ; Lets find the whole function name
  78.                                 name$=f
  79. ame+"("+io+")"
  80.                                 printf "// function: "+name
  81.                                 in=Replace(in,name,"stack")             ; now lets replace that whole function with 'stack'
  82.                                 Select f
  83. ame
  84.                                         Case "calldll"
  85.                                                 eval(io)                                ; io is the parameters, whereas calldll() only has one parameter
  86.                                                 printf "pop r1"                 ; asm output for this function
  87.                                                 Printf "run 'dll',r1"
  88.                                                 Printf "push 0"                 ; even though this function doesnt return anything, it needs to return 0
  89.                                 End Select
  90.                         Else
  91.                                 io$=find_next(in,i,0)                   ; well it's not a function, so it has to be some () we have to work out
  92.                                 eval(io)
  93.                                 io="("+io+")"
  94.                                 in=Replace(in,io,"stack")               ; now that we've worked it out, lets rename it to 'stack'
  95.                                 Printf "// out: "+in
  96.                         EndIf
  97.                 EndIf
  98.         Next
  99.        
  100.         ; my eval function uses a first in, last out stack
  101.         ; IE: push 45, push 23, pop r1 = 23, pop r2 = 45
  102.  
  103.         For x=opmax To 0 Step -1                                        ; we're checking for every single optoken
  104.                                                                                                 ; we do it backwards for proper math ordering
  105.                 If in="stack" Exit                                              ; if in just equals stack, then we're finished
  106.                 For i=1 To Len(in)
  107.                         m$=Mid(in,i,1)
  108.                         tokop$=parse(op[x],",",0)
  109.                         If Mid(in,i,Len(tokop))=tokop
  110.                                 a$=find_back(in,i)
  111.                                 b$=find_next(in,i+(Len(tokop)-1))
  112.                                 Printf "// in: "+a+tokop+b
  113.                                 in=Replace(in,a+tokop+b,"stack")
  114.  
  115.                                 If a="stack"                                    ; if a = stack
  116.                                         Printf "pop r1"                         ; then we have to pop the value out of the stack
  117.                                 ElseIf Int(a)=a                                 ; if a = a value
  118.                                         Printf "mov r1,"+a                      ; then we simply just mov r1 to the value
  119.                                 ElseIf a=""                                             ; a negativity
  120.                                         a="-"
  121.                                 ElseIf Left(a,1)="-"
  122.                                         Printf "ldr r1,"+Right(a,Len(a)-1)
  123.                                         Printf "sgn r1"
  124.                                         ;printf "mov r3,r1"
  125.                                         ;Printf "sub r1,r1,r1"
  126.                                         ;printf "sub r1,r1,r3"
  127.                                 Else                                                    ; but if its a variable
  128.                                         Printf "ldr r1,"+a                      ; we have to loadregister with that variable
  129.                                 EndIf
  130.                                                                                                 ; the same thing goes for the next part with variable b
  131.                                 If b="stack"
  132.                                         If a="-"
  133.                                                 Printf "pop r1"
  134.                                         Else
  135.                                                 Printf "pop r2"
  136.                                         EndIf
  137.                                 ElseIf Int(b)=b
  138.                                         If a="-"
  139.                                                 Printf "mov r1,"+b
  140.                                         Else
  141.                                                 Printf "mov r2,"+b
  142.                                         EndIf
  143.                                 ElseIf b=""                                             ; a negativity
  144.                                         b="-"
  145.                                 ElseIf Left(b,1)="-"
  146.                                         Printf "ldr r2,"+Right(b,Len(b)-1)
  147.                                         Printf "sgn r2"
  148.                                         ;printf "mov r3,r2"
  149.                                         ;Printf "sub r2,r2,r2"
  150.                                         ;printf "sub r2,r2,r3"
  151.                                 Else
  152.                                         If a="-"
  153.                                                 Printf "ldr r1,"+b
  154.                                         Else
  155.                                                 Printf "ldr r2,"+b
  156.                                         EndIf
  157.                                 EndIf
  158.                                
  159.                                 If a="-"                                                ; output negativity
  160.                                        
  161.                                         Printf "sgn r1"
  162.                                         ;printf "mov r3,r2"
  163.                                         ;Printf "sub r1,r2,r2"
  164.                                         ;printf "sub r1,r1,r3"
  165.                                 ElseIf b="-"
  166.                                         Printf "sgn r2"
  167.                                         ;printf "mov r3,r2"
  168.                                         ;Printf "sub r1,r1,r1"
  169.                                         ;printf "sub r1,r1,r3"
  170.                                 Else
  171.                                         Printf parse(op[x],",",1)+" r1,r1,r2"   ; now we do the math for it
  172.                                 EndIf
  173.                                 Printf "push r1"                                                ; last we push this value into the stack
  174.                                 If in="stack" Exit                              ; if in just equals stack, then we're finished
  175.                                 Printf "// out: "+in
  176.                         EndIf
  177.                 Next
  178.         Next
  179.        
  180.         If in<>"stack"                                                          ; meanwhile, if in still doesn't equal stack
  181.                 If Int(in)=in                                                   ; which means, no work was done to it yet..
  182.                         Printf "push "+in                                       ; we just have to push it to the stack ourselves :)
  183.                 Else
  184.                         Printf "ldr r1,"+in
  185.                         Printf "push r1"
  186.                 EndIf
  187.         EndIf
  188. End Function
  189.  
  190. ; just an easy output function
  191. Function Printf(in$)
  192.         WriteLine file,in
  193. End Function
  194.  
  195. ; find a number or variable until you hit another optoken (before x position)
  196. Function find_back$(in$,x,io=1)
  197.         Local out$
  198.         Select io
  199.                 ; looking for a function
  200.                 Case 2
  201.                         For i=x-1 To 1 Step -1
  202.                                 For e=opmax To 0 Step -1
  203.                                         m$=Mid(in,i,Len(parse(op[e],",",0)))
  204.                                         If m=parse(op[e],",",0) Return out
  205.                                 Next
  206.                                 m$=Mid(in,i,1)
  207.                                 If m="(" Return out
  208.                                 out=m+out
  209.                         Next
  210.                 ; looking for optoks
  211.                 Case 1
  212.                         For i=x-1 To 1 Step -1
  213.                                 For e=opmax To 0 Step -1
  214.                                         m$=Mid(in,i,Len(parse(op[e],",",0)))
  215.                                         If m=parse(op[e],",",0) Return out
  216.                                 Next
  217.                                 m$=Mid(in,i,1)
  218.                                 out=m+out
  219.                         Next
  220.                 ; finding a (
  221.                 Case 0
  222.                         For i=x-1 To 1 Step -1
  223.                                 m$=Mid(in,i,1)
  224.                                 If m="(" Return out
  225.                                 out=m+out
  226.                         Next
  227.         End Select
  228.         Return out
  229. End Function
  230.  
  231. ; find a number or variable until you hit another optoken (after x position)
  232. Function find_next$(in$,x,io=1)
  233.         Local out$
  234.         If io=1
  235.                 ; find op
  236.                 For i=x+1 To Len(in)
  237.                         For e=opmax To 0 Step -1
  238.                                 m$=Mid(in,i,Len(parse(op[e],",",0)))
  239.                                 If m=parse(op[e],",",0); And Mid(in,i+1,1)<>"-" And count=0
  240.                                         Return out
  241.                                 EndIf
  242.                         Next
  243.                         m$=Mid(in,i,1)
  244.                         out=out+m
  245.                 Next
  246.         Else
  247.                 ; find paras
  248.                 For i=x+1 To Len(in)
  249.                         m$=Mid(in,i,1)
  250.                         If m="(" sub=sub+1
  251.                         If m=")" If sub=0 Return out Else sub=sub-1
  252.                         out=out+m
  253.                 Next
  254.         EndIf
  255.         Return out
  256. End Function
  257.  
  258. ; just a quick find function.. function :)
  259. Function findfunc.func(name$)
  260.         For f.func = Each func
  261.                 If f
  262. ame=name Return f
  263.         Next
  264.         Return Null
  265. End Function
  266.  
  267. ; parse a string with a delim character at a position
  268. ; example: in$="var,ghe,oe,oxw"
  269. ; to get "ghe" you would do parse(in,",",1)
  270. Function parse$(in$,de$,se)
  271.         For x=1 To Len(in)
  272.                 v$=Mid(in,x,1)
  273.                 If v=de i=i+1
  274.                 If se=i And v<>de m$=m+v
  275.         Next
  276.         Return m
  277. End Function


Comments :


Streaksy(Posted 1+ years ago)

 Looks amazing but I have no idea how to actually get a result from it


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal