class Impressao(object):
def Visita_soma(self, soma):
#visitar expressão da esquerda.
#print (soma.expressao_esquerda.aceita(self))
#print(soma.expressao_direita.aceita(self))
print('( %s + %s )' %(soma.expressao_esquerda.aceita(self), soma.expressao_direita.aceita(self)))
def Visita_subtracao(self, subtracao):
# visitar expressão da esquerda.
#print(subtracao.expressao_esquerda.aceita(self))
#print(subtracao.expressao_direita.aceita(self))
print ('( %s - %s )' %(subtracao.expressao_esquerda.aceita(self), subtracao.expressao_direita.aceita(self)))
def Visita_multiplicacao(self, multiplica):
# visitar expressão da esquerda.
#print(multiplica.expressao_esquerda.aceita(self))
#print(multiplica.expressao_direita.aceita(self))
print('( %s * %s )' %(multiplica.expressao_esquerda.aceita(self), multiplica.expressao_direita.aceita(self)))
def Visita_divisao(self, divisao):
# visitar expressão da esquerda.
#print(divisao.expressao_esquerda.aceita(self))
#print(divisao.expressao_direita.aceita(self))
print('( %s / %s )' %(divisao.expressao_esquerda.aceita(self), divisao.expressao_direita.aceita(self)))
def Visita_numero(self, numero):
print (numero.avalia(),)
class Subtracao(object):
def __init__(self, expressao_esquerda, expressao_direita):
self.__expressao_esquerda = expressao_esquerda
self.__expressao_direita = expressao_direita
@property
def expressao_esquerda(self):
return self.__expressao_esquerda
@property
def expressao_direita(self):
return self.__expressao_direita
def avalia(self):
return self.__expressao_esquerda.avalia() - self.__expressao_direita.avalia()
def aceita(self, visitor):
visitor.Visita_subtracao(self)
class Soma(object):
def __init__(self, expressao_esquerda, expressao_direita):
self.__expressao_esquerda = expressao_esquerda
self.__expressao_direita = expressao_direita
@property
def expressao_esquerda(self):
return self.__expressao_esquerda
@property
def expressao_direita(self):
return self.__expressao_direita
def avalia(self):
return self.__expressao_esquerda.avalia() + self.__expressao_direita.avalia()
def aceita(self, visitor):
visitor.Visita_soma(self)
class Divisao(object):
def __init__(self, expressao_esquerda, expressao_direita):
self.__expressao_esquerda = expressao_esquerda
self.__expressao_direita = expressao_direita
@property
def expressao_esquerda(self):
return self.__expressao_esquerda
@property
def expressao_direita(self):
return self.__expressao_direita
def avalia(self):
return self.__expressao_esquerda.avalia() / self.__expressao_direita.avalia()
def aceita(self, visitor):
visitor.Visita_divisao(self)
class Multiplicacao(object):
def __init__(self, expressao_esquerda, expressao_direita):
self.__expressao_esquerda = expressao_esquerda
self.__expressao_direita = expressao_direita
@property
def expressao_esquerda(self):
return self.__expressao_esquerda
@property
def expressao_direita(self):
return self.__expressao_direita
def avalia(self):
return self.__expressao_esquerda.avalia() * self.__expressao_direita.avalia()
def aceita(self, visitor):
visitor.Visita_multiplicacao(self)
Ao executar o código abaixo:
Saida:
2
3
( None + None )
4
2
( None / None )
( None - None )
Código:
class Numero(object):
def __init__(self, numero):
self.__numero = numero
def avalia(self):
return self.__numero
def aceita(self, visitor):
visitor.Visita_numero(self)
if __name__ == '__main__':
#Calculando a expressão "(2+3)-4/2".
expressao_esquerda = Soma(Numero(2), Numero(3))
expressao_direita = Divisao(Numero(4), Numero(2))
expressao_conta = Subtracao(expressao_esquerda, expressao_direita)
#print (expressao_conta.avalia())
#Mostra os parenteses e sinais dos operadores
# da expressão (2+3)-4/2
impresao = Impressao()
expressao_conta.aceita(impresao)