Guest User

Untitled

a guest
Jan 16th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.18 KB | None | 0 0
  1. def is_digit( num ) :
  2. if num in list( map( lambda n: str( n ), range( 10 ) ) ) :
  3. return True
  4. return False
  5.  
  6. class Tokenizer :
  7. def __init__( self, formula ) :
  8. self.formula = formula
  9. self.tokens = []
  10.  
  11. self.position = 0
  12.  
  13. token = ''
  14. character = ''
  15.  
  16. while True :
  17. character = self.peek()
  18.  
  19. if character == None :
  20. break
  21.  
  22. if character == ' ' :
  23. self.next()
  24. continue
  25.  
  26. if is_digit( character ) or character == '.' :
  27. token = token + character
  28. self.next()
  29. continue
  30.  
  31. if token != '' :
  32. self.tokens.append( token )
  33. token = ''
  34.  
  35. self.tokens.append( character )
  36. self.next()
  37.  
  38. if token != '' :
  39. self.tokens.append( token )
  40.  
  41. def peek( self ) :
  42. if self.position < len( self.formula ) :
  43. return self.formula[self.position]
  44. return None
  45.  
  46. def next( self ) :
  47. self.position = self.position + 1
  48.  
  49. def get_tokens( self ) :
  50. return self.tokens
  51.  
  52. class Parser :
  53.  
  54. def __init__( self, tokens ) :
  55. self.tokens = tokens
  56. self.position = 0
  57.  
  58. def peek( self ) :
  59. if self.position < len( self.tokens ) :
  60. return self.tokens[self.position]
  61. return None
  62.  
  63. def poll( self ) :
  64. position = self.position
  65. self.position = self.position + 1
  66. return self.tokens[position]
  67.  
  68. def parse( self ) :
  69. return self.expression()
  70.  
  71. def expression( self ) :
  72. n = self.term()
  73.  
  74. if self.peek() == '+' or self.peek() == '-' :
  75. n = {
  76. 'type': 'BinaryExpression',
  77. 'operator': self.poll(),
  78. 'left': n,
  79. 'right': self.term()
  80. }
  81.  
  82. return n
  83.  
  84. def term( self ) :
  85. n = self.factor()
  86.  
  87. if self.peek() == '*' or self.peek() == '/' :
  88. n = {
  89. 'type': 'BinaryExpression',
  90. 'operator': self.poll(),
  91. 'left': n,
  92. 'right': self.factor()
  93. }
  94.  
  95. return n
  96.  
  97. def factor( self ) :
  98. if self.peek() == '(' :
  99. self.poll()
  100. n = self.expression()
  101. self.poll()
  102. return n
  103. else :
  104. return {
  105. 'type': 'Literal',
  106. 'value': self.poll()
  107. }
  108.  
  109. def evaluate( tree ) :
  110. if tree['type'] == 'BinaryExpression' :
  111. left = evaluate( tree['left'] )
  112. right = evaluate( tree['right'] )
  113.  
  114. if tree['operator'] == '+' :
  115. return left + right
  116. if tree['operator'] == '-' :
  117. return left - right
  118. if tree['operator'] == '*' :
  119. return left * right
  120. if tree['operator'] == '/' :
  121. return left / right
  122.  
  123. if tree['type'] == 'Literal' :
  124. if tree['value'].find( '.' ) == -1 :
  125. return int( tree['value'] )
  126. else :
  127. return float( tree['value'] )
  128.  
  129. formula = '((2 + 5.1) + 2) * 2'
  130. tokens = Tokenizer( formula ).get_tokens()
  131. parsed = Parser( tokens ).parse()
  132. result = evaluate( parsed )
  133.  
  134. print( result )
Add Comment
Please, Sign In to add comment