from expression import Token, Expression from lib.Pile import Pile_chaine as Pile from lib.File import File_chaine as File def tokenize(text): buffer = "" tokens = [] for char in text: #NUMBER if Token.isNumber(char) or char == ".": buffer += char else: #PUSH if buffer != "": print("a") tokens.append(Token(Token.NUMBER, buffer)) buffer = "" #SINGLE CHAR if char != " ": if char == "(" or char == ")": tokens.append(Token(Token.PARENTHESE, char)) else: 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): output = File() opertator = Pile() for token in tokens: if token.type == Token.NUMBER: output.enfiler(token) 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()) opertator.empiler(token) elif token.val == "(": opertator.empiler(token) elif token.val == ")": while opertator.sommet() != "(": assert not opertator.est_vide() output.enfiler(opertator.depiler()) assert opertator.sommet() == "(" opertator.depiler() if opertator.sommet().type == Token.FUNCTION: output.enfiler(opertator.depiler()) while not opertator.est_vide(): assert opertator.sommet != "(" output.enfiler(opertator.depiler()) return output def npi2tree(tokens): pile = Pile() for token in tokens: if token in ["+", "-", "*", "/"]: exp = Expression(token, pile.depiler(), pile.depiler()) pile.empiler(exp) else: pile.empiler(Expression(token)) return pile.depiler() if __name__ == "__main__": print(shutting_yard(tokenize("2+44(4+21)"))) #print(npi2tree(tokenize("6 4 3 + *")))