December 04, 2020, 11:01:47 AM

### Author Topic: [bb] Simple Math Compiler by Vertex [ 1+ years ago ]  (Read 788 times)

#### BlitzBot

• Jr. Member
• Posts: 1
##### [bb] Simple Math Compiler by Vertex [ 1+ years ago ]
« on: June 29, 2017, 12:28:43 AM »
Title : Simple Math Compiler
Author : Vertex
Posted : 1+ years ago

Description :
Code: [Select]
`Digit      = "0" | "1" | "2" | ... | "9";Number     = Digit {Digit};Factor     = Number | "(" Expression ")";Term       = Factor {("*" | "/") Factor};Expression = Term {("+" | "-") Factor};`

Don't use white spaces! It's only a little example to show, how easy it is to do this.

Based on <a href="http://www.informatik.uni-bonn.de/III/lehre/vorlesungen/Informatik_I/WS05/Folien/VLWS0506-10.pdf" target="_blank">http://www.informatik.uni-bonn.de/III/lehre/vorlesungen/Informatik_I/WS05/Folien/VLWS0506-10.pdf[/url]

Example:
"6*7+2*4" will output
Code: [Select]
`push 6push 7pop  ebxpop  eaxmul  eax, ebxpush eaxpush 2push 4pop  ebxpop  eaxmul  eax, ebxpush eaxpop  ebxpop  eaxadd  eax, ebxpush eaxpop  eax; Result: 50`

cu olli [/i]

Code :
Code: BlitzBasic
1. Global In\$
2. Global Position%
3. Global Token%
4.
5. In\$ = Input(">")+Chr(13)
6. Position% = 1
7. Parse()
8. WaitKey()
9. End
10.
11. Function Parse()
12.         GetToken()
13.         Command()
14. End Function
15.
16. Function Error()
17.         Print "Parse error"
18.         WaitKey()
19.         End
20. End Function
21.
22. Function GetToken()
23.         If Position% > Len(In\$) Then Error()
24.         Token% = Asc(Mid(In\$, Position%, 1))
25.         Position% = Position% + 1
26. End Function
27.
28. Function Match(Char%)
29.         If Token% = Char% Then
30.                 GetToken()
31.         Else
32.                 Error()
33.         EndIf
34. End Function
35.
36. Function Command()
37.         Local Result%
38.
39.         Result% = Expression()
40.         If Token% = 13 Then
41.                 Print "pop  eax"
42.                 Print "; Result: "+Result%
43.                 Print ""
44.         Else
45.                 Error()
46.         EndIf
47. End Function
48.
49. Function Expression%()
50.         Local Result%
51.
52.         Result = Term()
53.         While Token% = Asc("+") Or Token% = Asc("-")
54.                 If Token% = Asc("+")
55.                         GetToken()
56.                         Result% = Result% + Term()
57.                         Print "pop  ebx"
58.                         Print "pop  eax"
60.                         Print "push eax"
61.                 Else
62.                         GetToken()
63.                         Result% = Result% - Term()
64.                         Print "pop  ebx"
65.                         Print "pop  eax"
66.                         Print "sub  eax, ebx"
67.                         Print "push eax"
68.                 EndIf
69.         Wend
70.
71.         Return Result%
72. End Function
73.
74. Function Term%()
75.         Local Result%
76.
77.         Result = Factor()
78.         While Token% = Asc("*") Or Token% = Asc("/")
79.                 If Token% = Asc("*") Then
80.                         GetToken()
81.                         Result% = Result% * Factor()
82.                         Print "pop  ebx"
83.                         Print "pop  eax"
84.                         Print "mul  eax, ebx"
85.                         Print "push eax"
86.                 Else
87.                         GetToken()
88.                         Result = Result% / Factor()
89.                         Print "pop  ebx"
90.                         Print "pop  eax"
91.                         Print "div  eax, ebx"
92.                         Print "push eax"
93.                 EndIf
94.         Wend
95.
96.         Return Result%
97. End Function
98.
99. Function Factor%()
100.         Local Result%
101.
102.         If Token% = Asc("(") Then
103.                 Match(Asc("("))
104.                 Result% = Expression()
105.                 Match(Asc(")"))
106.         Else
107.                 Result% = Number()
108.         EndIf
109.
110.         Return Result%
111. End Function
112.
113. Function Number%()
114.         Local Result%
115.
116.         While Token% => Asc("0") And Token% <= Asc("9")
117.                 Result% = Result%*10 + Digit()
118.         Wend
119.
120.         Print "push "+Result%
121.         Return Result%
122. End Function
123.
124. Function Digit%()
125.         Local Result%
126.
127.         If Token% => Asc("0") And Token% <= Asc("9") Then
128.                 Result% = Token% - Asc("0")
129.                 Match(Token%)
130.         Else
131.                 Error()
132.         EndIf
133.
134.         Return Result%
135. End Function