From c68c18779b36210e706d3941203748e35dd50ef5 Mon Sep 17 00:00:00 2001 From: "alexandre.aboulin" Date: Wed, 1 Feb 2023 11:35:39 +0100 Subject: [PATCH] shutting yard --- main.py | 4 ++-- reader.py | 38 +++++++++++++++----------------------- 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/main.py b/main.py index 60ac061..ffc3123 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,4 @@ from reader import * -cal = input("Entrez votre calcul en NPI : ") -print(npi2tree(tokenize(cal)).evalue()) \ No newline at end of file +cal = str(input("Entrez votre calcul en NPI : ")) +print(npi2tree(shutting_yard(tokenize(cal))).evalue()) \ No newline at end of file diff --git a/reader.py b/reader.py index 916922b..fe95253 100644 --- a/reader.py +++ b/reader.py @@ -2,7 +2,7 @@ from expression import Token, Expression from lib.Pile import Pile_chaine as Pile from lib.File import File_chaine as File -def tokenize(text): +def tokenize(text: str) -> list: buffer = "" tokens = [] for char in text: @@ -12,7 +12,6 @@ def tokenize(text): else: #PUSH if buffer != "": - print("a") tokens.append(Token(Token.NUMBER, buffer)) buffer = "" #SINGLE CHAR @@ -23,11 +22,9 @@ def tokenize(text): tokens.append(Token(Token.OPERATOR, char)) if buffer != "": tokens.append(Token(Token.NUMBER, buffer)) - for token in tokens: - print(token.type, ":", token.val) return tokens -def shutting_yard(tokens): +def shutting_yard(tokens: list) -> File: output = File() opertator = Pile() for token in tokens: @@ -36,44 +33,39 @@ def shutting_yard(tokens): elif token.type == Token.FUNCTION: opertator.empiler(token) elif token.type == Token.OPERATOR: - if not opertator.est_vide(): - o2 = opertator.sommet() - a = o2 != "(" - print(o2.val) - b = Token.getPrecedence(o2.val) > Token.getPrecedence(token.val) - c = Token.getPrecedence(token.val) == Token.getPrecedence(o2.val) - - while a and (b or (c)): #and d)) - output.enfiler(opertator.depiler()) + while (not opertator.est_vide() and opertator.sommet().val != "(") and (Token.getPrecedence(opertator.sommet().val) > Token.getPrecedence(token.val) or (Token.getPrecedence(token.val) == Token.getPrecedence(opertator.sommet().val) and token.val != "^")): + output.enfiler(opertator.depiler()) opertator.empiler(token) elif token.val == "(": opertator.empiler(token) elif token.val == ")": - while opertator.sommet() != "(": + while not opertator.est_vide() and opertator.sommet().val != "(": assert not opertator.est_vide() output.enfiler(opertator.depiler()) - assert opertator.sommet() == "(" + assert opertator.sommet().val == "(" opertator.depiler() if opertator.sommet().type == Token.FUNCTION: output.enfiler(opertator.depiler()) while not opertator.est_vide(): - assert opertator.sommet != "(" + assert opertator.sommet().val != "(" output.enfiler(opertator.depiler()) return output -def npi2tree(tokens): +def npi2tree(tokens: File) -> Expression: pile = Pile() - for token in tokens: - if token in ["+", "-", "*", "/"]: - exp = Expression(token, pile.depiler(), pile.depiler()) + while not tokens.est_vide(): + token = tokens.defiler() + if token.val in ["+", "-", "*", "/"]: + exp = Expression(token.val, pile.depiler(), pile.depiler()) pile.empiler(exp) else: - pile.empiler(Expression(token)) + pile.empiler(Expression(token.val)) return pile.depiler() if __name__ == "__main__": - print(shutting_yard(tokenize("2+44(4+21)"))) + a = npi2tree(shutting_yard(tokenize("2+44*(4+21)"))).evalue() + print(a) #print(npi2tree(tokenize("6 4 3 + *"))) \ No newline at end of file