Change "instances" class variables of Smybols and children of Symbols to Dict instead of List. Start expand.py (not completed)

This commit is contained in:
Clément Barthélemy 2024-02-20 01:33:03 +01:00
parent 77c8973eb7
commit 1738fa5d4c
6 changed files with 41 additions and 27 deletions

View file

@ -24,6 +24,10 @@ class Tree(ABC):
self.depth_first_order = depth_first_order
self.children = children if children else []
@property
def is_leaf(self) -> bool:
return not self.children
def __repr__(self) -> str:
return f'Tree({self.value}, {self.children})' if self.children else f'Tree({self.value})'

View file

@ -7,18 +7,22 @@ class Operator(Symbols):
"""
Represent an operator, like +, *, sin, anything that can be applied to an expression
"""
instances = []
instances = {}
def __init__(self, name: str, precedence: int, call: Callable):
def __init__(self, name: str, precedence: int, call: Callable, repeated_op: Operator = None):
"""
:param name of the operator
:param precedence: precedence of the operator, higher is better
:param call: function to apply the operator
:param repeated_op: if you repeat the operator what do you get ?
for exemple a+a+a+a -> 4*a, the repeated_op of Add is Mul
"""
super().__init__(name)
self.precedence = precedence
self.call = call
Operator.instances.append(self)
self.repeated_op = repeated_op
Operator.instances[name] = self
def __repr__(self):
return f'{self.name}'
@ -29,11 +33,11 @@ class UnaryOperator(Operator):
Represent a unary operator, like sin, cos, - etc...
all operators that take only one argument
"""
instances = []
instances = {}
def __init__(self, name: str, precedence: int, call: Callable):
UnaryOperator.instances.append(self)
super().__init__(name, precedence, call)
def __init__(self, name: str, precedence: int, call: Callable, repeated_op: Operator = None):
UnaryOperator.instances[name] = self
super().__init__(name, precedence, call, repeated_op)
def apply(self, expr):
return self.call(expr)
@ -77,11 +81,11 @@ class BinOperator(Operator):
"""
# Used to store all the instances of BinOperator, used in the parser
instances = []
instances = {}
def __init__(self, name: str, precedence: int, properties: BinProperties, call: Callable):
BinOperator.instances.append(self)
super().__init__(name, precedence, call)
def __init__(self, name: str, precedence: int, properties: BinProperties, call: Callable, repeated_op: Operator = None ):
BinOperator.instances[name] = self
super().__init__(name, precedence, call, repeated_op)
self.properties = properties
def apply(self, left, right):

View file

@ -1,16 +1,16 @@
from __future__ import annotations
class Symbols:
"""
All maths things (other than number) that will be parsed need to be of "Symbols" class
All maths things (other than integers) that will be parsed need to be of "Symbols" class
"""
instances = []
instances = {}
def __init__(self, name):
assert name not in Symbols.instances, f'Symbol with name {name} already exists'
self.name = name
Symbols.instances.append(self)
Symbols.instances[name] = self
def __repr__(self):
return self.name
@ -39,10 +39,10 @@ class Var(Symbols):
"""
variable, like 'x' in x+2
"""
instances = []
instances = {}
def __init__(self, name):
super().__init__(name)
self.__class__.instances.append(self)
self.__class__.instances[name] = self

View file

@ -11,16 +11,11 @@ ParenthesisRight = Symbols(')')
Number = Union[int, float, Fraction]
name_to_symbol = {sy.name:sy for sy in Symbols.instances}
name_to_symbol = Symbols.instances
def update_symbols_dict():
global name_to_symbol
name_to_symbol = {sy.name:sy for sy in Symbols.instances}
"""
example1 = "a + b * c + d"
-
@ -37,7 +32,7 @@ def preprocess(expr: str) -> List:
:param expr: string expression
:return: list of symbols and numbers
"""
update_symbols_dict()
return_list = []
expr = expr.strip()
expr = expr.replace(' ', '')

View file

@ -0,0 +1,14 @@
from python_symb.Expressions.expr import Expr
from python_symb.MathTypes.symbols import Var
from python_symb.MathTypes.operator_file import Operator, BinOperator, Add, Mul
def expand(expr: Expr) -> Expr:
"""
Expand an expression
:param expr: expression to expand
:return: expanded expression
"""
if expr.is_leaf:
return expr

View file

@ -1,7 +1,6 @@
import tkinter as tk
from python_symb.Expressions.expr import Expr
from python_symb.MathTypes.symbols import Var
from python_symb.Parsing.parse import update_symbols_dict
class Visual:
@ -72,8 +71,6 @@ class Visual:
if v not in Var.instances:
Var(v)
# Update the symbols dict
update_symbols_dict()
def show_tree(self):