From 70ab0db368c19cc630feb81c26b0c6698ae06ee1 Mon Sep 17 00:00:00 2001 From: aoieop Date: Tue, 6 Apr 2021 09:15:42 -0400 Subject: [PATCH 1/6] added modulo and factorial --- mathterpreter/_parser.py | 10 ++++++++-- mathterpreter/lexer.py | 2 ++ mathterpreter/nodes.py | 20 ++++++++++++++++++++ mathterpreter/tokens.py | 6 +++++- 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/mathterpreter/_parser.py b/mathterpreter/_parser.py index 2450677..55bb915 100644 --- a/mathterpreter/_parser.py +++ b/mathterpreter/_parser.py @@ -44,7 +44,7 @@ def _addition_subtraction_base(self): return result - def _multiplication_division(self): + def _multiplication_division_modulo(self): result = self._exponentiation_root() while self._token is not None: @@ -54,6 +54,9 @@ def _multiplication_division(self): elif self._token.type == TokenType.DIVISION_OPERATOR: self._iterate_token() result = DivisionNode(result, self._exponentiation_root()) + elif self._token.type() == TokenType.MODULO_OPERATOR: + self._iterate_token() + result = ModuloNode(result, self._exponentiation_root()) elif self._token.type == TokenType.OPENING_BRACKET: result = MultiplicationNode(result, self._literal_polarity()) else: @@ -61,7 +64,7 @@ def _multiplication_division(self): return result - def _exponentiation_root(self): + def _exponentiation_root_factorial(self): result = self._literal_polarity() while self._token is not None: if self._token.type == TokenType.POWER_OPERATOR: @@ -70,6 +73,9 @@ def _exponentiation_root(self): elif self._token.type == TokenType.SQRT_OPERATOR: self._iterate_token() result = RootNode(result, self._literal_polarity()) + elif self._token.type == TokenType.FACTORIAL_OPERATOR: + self._iterate_token() + result = RootNode(result, self._literal_polarity) else: break return result diff --git a/mathterpreter/lexer.py b/mathterpreter/lexer.py index 23f2fc9..3189bbf 100644 --- a/mathterpreter/lexer.py +++ b/mathterpreter/lexer.py @@ -26,6 +26,8 @@ def expand(compact_dict): "^": lambda: TokenType.POWER_OPERATOR, "(": lambda: TokenType.OPENING_BRACKET, ")": lambda: TokenType.CLOSING_BRACKET, + "!": lambda: TokenType.FACTORIAL_OPERATOR, + "%": lambda: TokenType.MODULO_OPERATOR, } CONSTANTS = { ("pi", "π"): lambda: math.pi, diff --git a/mathterpreter/nodes.py b/mathterpreter/nodes.py index 93d86fe..637abae 100644 --- a/mathterpreter/nodes.py +++ b/mathterpreter/nodes.py @@ -105,3 +105,23 @@ def __repr__(self): def evaluate(self) -> float: return self.first_operand.evaluate() ** self.second_operand.evaluate() + +@dataclass +class ModuloNode(OperationNode): + def __repr__(self): + return f"({self.first_operand}%{self.second_operand})" + + def evaluate(self): + return self.first_operand.evaluate() % self.second_operand.evaluate() + +@dataclass +class SingleOperandNode(Node): + operand: Node + +@dataclass +class FactorialNode(SingleOperandNode): + def __repr__(self): + return f"({self.operand}!)" + + def evaluate(self): + return math.factorial(self.operand.evaluate()) diff --git a/mathterpreter/tokens.py b/mathterpreter/tokens.py index 516f05c..41c35a0 100644 --- a/mathterpreter/tokens.py +++ b/mathterpreter/tokens.py @@ -14,6 +14,8 @@ class TokenType: POWER_OPERATOR = 7 OPENING_BRACKET = 8 CLOSING_BRACKET = 9 + FACTORIAL_OPERATOR = 10 + MODULO_OPERATOR = 11 FORMATS = { @@ -27,7 +29,9 @@ class TokenType: TokenType.SQRT_OPERATOR: "√", TokenType.POWER_OPERATOR: "^", TokenType.OPENING_BRACKET: "(", - TokenType.CLOSING_BRACKET: ")" + TokenType.CLOSING_BRACKET: ")", + TokenType.FACTORIAL_OPERATOR: "!", + TokenType.MODULO_OPERATOR: "%", } From d375cae55b3d5a19c5421d66fa7d07a7cf1fb2bf Mon Sep 17 00:00:00 2001 From: aoieop Date: Tue, 6 Apr 2021 09:20:53 -0400 Subject: [PATCH 2/6] added /venv/ and .egg-info to .gitignore --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index fa9845f..9da50bc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ .idea/* -__pycache__ \ No newline at end of file +__pycache__ +/venv/ +mathterpreter.egg-info \ No newline at end of file From c03f4ece35492928d348d5f029f129d487a1e4e9 Mon Sep 17 00:00:00 2001 From: aoieop <49662700+aoieop@users.noreply.github.com> Date: Tue, 6 Apr 2021 10:01:25 -0400 Subject: [PATCH 3/6] backslashes --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 9da50bc..5dda314 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ .idea/* __pycache__ -/venv/ -mathterpreter.egg-info \ No newline at end of file +\venv\ +mathterpreter.egg-info From df11b3047310a48212b2564ca0272fb35bb679be Mon Sep 17 00:00:00 2001 From: aoieop Date: Tue, 6 Apr 2021 10:15:45 -0400 Subject: [PATCH 4/6] correctly refactored method name --- mathterpreter/_parser.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/mathterpreter/_parser.py b/mathterpreter/_parser.py index 55bb915..7b8808d 100644 --- a/mathterpreter/_parser.py +++ b/mathterpreter/_parser.py @@ -31,32 +31,32 @@ def _addition_subtraction_base(self): if self._token is None: output = ''.join([z.__str__() for z in self.token_list]) raise MathSyntaxError("Expression expected", f"{output}\n{'^^^'.rjust(len(output) + 3)}") - result = self._multiplication_division() + result = self._multiplication_division_modulo() while self._token is not None: if self._token.type == TokenType.ADDITION_OPERATOR: self._iterate_token() - result = AdditionNode(result, self._multiplication_division()) + result = AdditionNode(result, self._multiplication_division_modulo()) elif self._token.type == TokenType.SUBTRACTION_OPERATOR: self._iterate_token() - result = SubtractionNode(result, self._multiplication_division()) + result = SubtractionNode(result, self._multiplication_division_modulo()) else: break return result def _multiplication_division_modulo(self): - result = self._exponentiation_root() + result = self._exponentiation_root_factorial() while self._token is not None: if self._token.type == TokenType.MULTIPLICATION_OPERATOR: self._iterate_token() - result = MultiplicationNode(result, self._exponentiation_root()) + result = MultiplicationNode(result, self._exponentiation_root_factorial()) elif self._token.type == TokenType.DIVISION_OPERATOR: self._iterate_token() - result = DivisionNode(result, self._exponentiation_root()) + result = DivisionNode(result, self._exponentiation_root_factorial()) elif self._token.type() == TokenType.MODULO_OPERATOR: self._iterate_token() - result = ModuloNode(result, self._exponentiation_root()) + result = ModuloNode(result, self._exponentiation_root_factorial()) elif self._token.type == TokenType.OPENING_BRACKET: result = MultiplicationNode(result, self._literal_polarity()) else: From 4228c9f7f49686ee63b85db6b5b6626321890bbc Mon Sep 17 00:00:00 2001 From: aoieop Date: Tue, 6 Apr 2021 10:18:16 -0400 Subject: [PATCH 5/6] \ didnt work --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 5dda314..8521912 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ .idea/* __pycache__ -\venv\ +/venv/ mathterpreter.egg-info From 548661e7d49f52999499178e5b38bb5250590982 Mon Sep 17 00:00:00 2001 From: aoieop Date: Wed, 7 Apr 2021 11:13:40 -0400 Subject: [PATCH 6/6] begone, factorials --- mathterpreter/_parser.py | 18 ++++++++---------- mathterpreter/nodes.py | 11 +---------- mathterpreter/tokens.py | 4 +--- 3 files changed, 10 insertions(+), 23 deletions(-) diff --git a/mathterpreter/_parser.py b/mathterpreter/_parser.py index 7b8808d..80670b6 100644 --- a/mathterpreter/_parser.py +++ b/mathterpreter/_parser.py @@ -1,5 +1,5 @@ from mathterpreter.nodes import * -from mathterpreter.tokens import TokenType, Token +from mathterpreter.tokens import TokenType, Token, FORMATS from mathterpreter.exceptions import MathSyntaxError from typing import List @@ -11,6 +11,7 @@ def __init__(self, tokens: List[Token]): self._token = None self._index = -1 self._iterate_token() + print(tokens) def _iterate_token(self): try: @@ -45,18 +46,18 @@ def _addition_subtraction_base(self): return result def _multiplication_division_modulo(self): - result = self._exponentiation_root_factorial() + result = self._exponentiation_root() while self._token is not None: if self._token.type == TokenType.MULTIPLICATION_OPERATOR: self._iterate_token() - result = MultiplicationNode(result, self._exponentiation_root_factorial()) + result = MultiplicationNode(result, self._exponentiation_root()) elif self._token.type == TokenType.DIVISION_OPERATOR: self._iterate_token() - result = DivisionNode(result, self._exponentiation_root_factorial()) - elif self._token.type() == TokenType.MODULO_OPERATOR: + result = DivisionNode(result, self._exponentiation_root()) + elif self._token.type == TokenType.MODULO_OPERATOR: self._iterate_token() - result = ModuloNode(result, self._exponentiation_root_factorial()) + result = ModuloNode(result, self._exponentiation_root()) elif self._token.type == TokenType.OPENING_BRACKET: result = MultiplicationNode(result, self._literal_polarity()) else: @@ -64,7 +65,7 @@ def _multiplication_division_modulo(self): return result - def _exponentiation_root_factorial(self): + def _exponentiation_root(self): result = self._literal_polarity() while self._token is not None: if self._token.type == TokenType.POWER_OPERATOR: @@ -73,9 +74,6 @@ def _exponentiation_root_factorial(self): elif self._token.type == TokenType.SQRT_OPERATOR: self._iterate_token() result = RootNode(result, self._literal_polarity()) - elif self._token.type == TokenType.FACTORIAL_OPERATOR: - self._iterate_token() - result = RootNode(result, self._literal_polarity) else: break return result diff --git a/mathterpreter/nodes.py b/mathterpreter/nodes.py index 637abae..45b2497 100644 --- a/mathterpreter/nodes.py +++ b/mathterpreter/nodes.py @@ -111,17 +111,8 @@ class ModuloNode(OperationNode): def __repr__(self): return f"({self.first_operand}%{self.second_operand})" - def evaluate(self): + def evaluate(self) -> float: return self.first_operand.evaluate() % self.second_operand.evaluate() -@dataclass -class SingleOperandNode(Node): - operand: Node -@dataclass -class FactorialNode(SingleOperandNode): - def __repr__(self): - return f"({self.operand}!)" - def evaluate(self): - return math.factorial(self.operand.evaluate()) diff --git a/mathterpreter/tokens.py b/mathterpreter/tokens.py index 41c35a0..72a2d02 100644 --- a/mathterpreter/tokens.py +++ b/mathterpreter/tokens.py @@ -14,8 +14,7 @@ class TokenType: POWER_OPERATOR = 7 OPENING_BRACKET = 8 CLOSING_BRACKET = 9 - FACTORIAL_OPERATOR = 10 - MODULO_OPERATOR = 11 + MODULO_OPERATOR = 10 FORMATS = { @@ -30,7 +29,6 @@ class TokenType: TokenType.POWER_OPERATOR: "^", TokenType.OPENING_BRACKET: "(", TokenType.CLOSING_BRACKET: ")", - TokenType.FACTORIAL_OPERATOR: "!", TokenType.MODULO_OPERATOR: "%", }