|
|
|
from Pile import Pile_chaine as Pile
|
|
|
|
from math import *
|
|
|
|
|
|
|
|
class Expression:
|
|
|
|
def __init__(self, racine, gauche, droit):
|
|
|
|
"""initialisation d'un objet 'Expression'"""
|
|
|
|
self.racine = racine
|
|
|
|
self.gauche = gauche
|
|
|
|
self.droit = droit
|
|
|
|
|
|
|
|
def evalue(self):
|
|
|
|
"""renvoie la valeur de l'expression
|
|
|
|
si 1 seul argument alors on prend le fils gauche"""
|
|
|
|
#fonction unaires
|
|
|
|
if self.racine == "sin":
|
|
|
|
return sin(self.gauche.evalue())
|
|
|
|
if self.racine == "cos":
|
|
|
|
return cos(self.gauche.evalue())
|
|
|
|
if self.racine == "tan":
|
|
|
|
return tan(self.gauche.evalue())
|
|
|
|
#fonctions binaires
|
|
|
|
if self.racine == "+":
|
|
|
|
return self.gauche.evalue() + self.droit.evalue()
|
|
|
|
if self.racine == "-":
|
|
|
|
return self.gauche.evalue() - self.droit.evalue()
|
|
|
|
if self.racine == "*":
|
|
|
|
return self.gauche.evalue() * self.droit.evalue()
|
|
|
|
if self.racine == "/":
|
|
|
|
return self.gauche.evalue() / self.droit.evalue()
|
|
|
|
if self.racine == "^":
|
|
|
|
return self.gauche.evalue() ** self.droit.evalue()
|
|
|
|
|
|
|
|
|
|
|
|
if "." in self.racine:
|
|
|
|
return float(self.racine)
|
|
|
|
return int(self.racine)
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
"""affiche l'expression"""
|
|
|
|
#temporaire
|
|
|
|
if self.racine in ["+", "*", "-", "/", "^"]:
|
|
|
|
return "(" + str(self.gauche) + self.racine + str(self.droit) + ")"
|
|
|
|
if self.racine in ["sin","cos","tan"]:
|
|
|
|
return self.racine + "(" + str(self.gauche) + ")"
|
|
|
|
return str(self.racine)
|
|
|
|
|
|
|
|
|
|
|
|
def npi2tree(liste_en_npi):
|
|
|
|
"""conversion d'une liste en NPI en un arbre"""
|
|
|
|
pile_expr = Pile()
|
|
|
|
for element in liste_en_npi:
|
|
|
|
if element in ["+", "*","-","/", "^"]:
|
|
|
|
pile_expr.empiler(Expression(element, pile_expr.depiler(),pile_expr.depiler()))
|
|
|
|
elif element in ["sin","cos","tan"]:
|
|
|
|
pile_expr.empiler(Expression(element, pile_expr.depiler(),None))
|
|
|
|
else:
|
|
|
|
pile_expr.empiler(Expression(element, None, None))
|
|
|
|
return pile_expr.sommet()
|