December 04, 2020, 11:01:47 AM

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

Offline 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 6
push 7
pop  ebx
pop  eax
mul  eax, ebx
push eax
push 2
push 4
pop  ebx
pop  eax
mul  eax, ebx
push eax
pop  ebx
pop  eax
add  eax, ebx
push eax
pop  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"
  59.                         Print "add  eax, ebx"
  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


Comments :


Rck(Posted 1+ years ago)

 Interesting


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal