Ott
30
La notazione polacca inversa (RPN) è una sintassi utilizzata per scrivere formule matematiche. Sostuisce all’uso delle parentesi e delle regole sulla precedenza degli operatori della notazione infissa una forma postfissa, ovvero che post pone agli operandi gli operatori. Ad es:
5 * 2 corrisponde a 5 2 *
(10 * 6) + 4 corrisponde a 10 6 * 4 + oppure 4 10 6 * +
Come piccolo esercizio per un esame ho scritto questo semplice parser RPN, che fa uso delle pile per sviluppare la formula matematica:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | import re class stack(list): def __init__(self): self.Elementi = [] def push(self, Elemento, index = None): if(index == None): self.Elementi.append(Elemento) else: self.Elementi.insert(index, Elemento) def pop(self, index = 0): return self.Elementi.pop(index) def index(self, value): return self.Elementi.index(value) def count(self): indice = 0 for element in self.Elementi: indice += 1 return indice def EVuota(self): return (self.Elementi == []) class ParserRPN(): def __init__(self): self.Stack = stack() def analizza(self, espressione): #lista degli operatori ListaToken = re.findall("[^0-9s]", espressione) for element in espressione.split(): try: self.Stack.push(float(element)) except: self.Stack.push(element) for Token in ListaToken: #trovo la posizione dell'operatore nello stack TokenIndex = self.Stack.index(Token) #calcolo la posizione dei due operandi e rimuovo #l'operatore dallo stack a = self.Stack.pop(TokenIndex - 2) b = self.Stack.pop(TokenIndex - 2) self.Stack.pop(TokenIndex - 2) #eseguo l'operazione if(Token == "+"): Risultato = a + b elif(Token == "*"): Risultato = a * b elif(Token == "-"): Risultato = a - b elif(Token == "/"): Risultato = a / b self.Stack.push(float(Risultato), TokenIndex - 2) return self.Stack.pop() |
Commenti
Scrivi un commento
