December 04, 2020, 11:24:07 AM

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

#### BlitzBot

• Jr. Member
• Posts: 1
##### [bb] Math Evaluation by Zenith(Matt Griffith) [ 1+ years ago ]
« on: June 29, 2017, 12:28:42 AM »
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
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