Advertisement
Guest User

Untitled

a guest
Dec 10th, 2019
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.48 KB | None | 0 0
  1. class ExpressionParser():
  2. def __init__(self, expr: str) -> None:
  3. self.expr = expr;
  4. self.cur = 0
  5.  
  6. def advance(self) -> None:
  7. self.cur += 1
  8.  
  9. @property
  10. def eof(self) -> bool:
  11. return self.cur >= len(self.expr)
  12.  
  13. def primary(self) -> float:
  14. start_idx = self.cur
  15. while not self.eof and (self.expr[self.cur].isnumeric()
  16. or self.expr[self.cur] == '('):
  17.  
  18. self.advance()
  19. if self.expr[self.cur - 1] == '(':
  20. expr = self.expression()
  21. self.advance()
  22. return expr
  23.  
  24. if not self.eof and self.expr[self.cur] == '.':
  25. self.advance()
  26.  
  27. return float(self.expr[start_idx:self.cur])
  28.  
  29. def unary(self) -> float:
  30. if not self.eof and self.expr[self.cur] == '-':
  31. self.advance()
  32. u_expr = self.unary()
  33. u_expr *= -1
  34. elif not self.eof and self.expr[self.cur] == '+':
  35. self.advance()
  36. u_expr = self.unary()
  37. elif not self.eof:
  38. u_expr = self.primary()
  39.  
  40. return u_expr
  41.  
  42. def power(self) -> float:
  43. u_expr = self.unary()
  44. if not self.eof and self.expr[self.cur] == '^':
  45. self.advance()
  46. power = self.power()
  47. u_expr = u_expr ** power
  48.  
  49. return u_expr
  50.  
  51. def multiplication(self) -> float:
  52. p_expr = self.power()
  53. if not self.eof and self.expr[self.cur] in ['*', '/']:
  54. op = self.expr[self.cur]
  55. self.advance()
  56. m_expr = self.multiplication()
  57. if op == '*':
  58. p_expr *= m_expr
  59. else:
  60. p_expr /= m_expr
  61.  
  62. return p_expr
  63.  
  64. def addition(self) -> float:
  65. m_expr = self.multiplication()
  66. if not self.eof and self.expr[self.cur] in ['+', '-']:
  67. op = self.expr[self.cur]
  68. self.advance()
  69. a_expr = self.addition()
  70. if op == '+':
  71. m_expr += a_expr
  72. else:
  73. m_expr -= a_expr
  74.  
  75. return m_expr
  76.  
  77. def expression(self) -> float:
  78. return self.addition()
  79.  
  80. if __name__ == "__main__":
  81. while True:
  82. try:
  83. expr = input(">>> ")
  84. parser = ExpressionParser(expr)
  85. print(parser.expression())
  86. except KeyboardInterrupt:
  87. print()
  88. exit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement