Skip to content

Instantly share code, notes, and snippets.

@justanotherminh
Created December 1, 2023 16:03
Show Gist options
  • Save justanotherminh/ac2355aee673909f7cf5be6dc3e65dfa to your computer and use it in GitHub Desktop.
Save justanotherminh/ac2355aee673909f7cf5be6dc3e65dfa to your computer and use it in GitHub Desktop.
class Parser:
def __init__(self, text):
self.text = ''.join(text.split())
self.pos = 0
def parse(self):
return self.parse_expression()
def parse_expression(self):
result = self.parse_term()
while self.pos < len(self.text):
if self.text[self.pos] == '+':
self.pos += 1
result += self.parse_term()
elif self.text[self.pos] == '-':
self.pos += 1
result -= self.parse_term()
else:
break
return result
def parse_term(self):
result = self.parse_factor()
while self.pos < len(self.text):
if self.text[self.pos] == '*':
self.pos += 1
result *= self.parse_factor()
elif self.text[self.pos] == '/':
self.pos += 1
result /= self.parse_factor()
else:
break
return result
def parse_factor(self):
result = self.parse_number()
while self.pos < len(self.text):
if self.text[self.pos] == '^':
self.pos += 1
result = result ** self.parse_factor()
elif self.text[self.pos] == '(':
self.pos += 1
result = self.parse_expression()
self.pos += 1 # Consume closing parenthesis
else:
break
return result
def parse_number(self):
number = 0
while self.pos < len(self.text) and self.text[self.pos].isdigit():
number = number * 10 + int(self.text[self.pos])
self.pos += 1
return number
def parse_math_expression(text):
parser = Parser(text)
return parser.parse()
# Example usage:
expression = "3 + 5 * (2 ^ 3) - 6 / 2"
result = parse_math_expression(expression)
print(f"Result of '{expression}' is: {result}")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment