# Calculadora prefija
# + 1 3 -> 4


def calcula(opr, op1, op2):
	"""Calcula una expresión inmediata, como + 2 4"""
	toret = 0
	
	if opr == '+':
		toret = op1 + op2
	elif opr == '-':
		toret = op1 - op2
	elif opr == '*':
		toret = op1 * op2
	elif opr == '/':
		toret = op1 / op2
	elif opr == '^':
		toret = op1 ** op2
	else:
		raise Exception("operando no reconocido")
		
	return toret


def parse(s):
	"""Retorna los operadores y operandos, como una lista de texto."""


	def inserta_operando():
		nonlocal operando
		
		toret.append(float(operando))
		operando = ""
	
	operando = ""
	toret = []	
	operadores = "+-*/^"
	pos = 0
	
	for ch in s:
		if ch in operadores:
			if operando:
				inserta_operando()
			toret.append(ch)
		elif ch.isdigit() or ch =='.':
			operando += ch
		else:
			inserta_operando()
	
	if operando:
		inserta_operando()
		
	return toret


def opera(eltos, pos):	
	"""Función recursiva que calcula una expresión compleja"""
	
	opr = ""
	op1 = 0.0
	op2 = 0.0
	
	# Leer el operador
	elto = eltos[pos]
	if isinstance(elto, str):
		opr = elto
	else:
		raise Exception("se esperaba un operador")
	
	# Leer el operando 1
	pos += 1
	elto = eltos[pos]
	if isinstance(elto, str):
		# Es un operador
		pos, op1 = opera(eltos, pos)
	else:
		op1 = elto
		
	# Leer el operando 2
	pos += 1
	elto = eltos[pos]
	if isinstance(elto, str):
		# Es un operador
		pos, op2 = opera(eltos, pos)
	else:
		op2 = elto
	
	return pos, calcula(opr, op1, op2)


if __name__ == "__main__":
	s = input("Dame una expresión prefija: ")
	print("\nResultado:", opera(parse(s), 0)[1])
