fork download
  1. import IPython
  2.  
  3. TabVar = []
  4. TabVal = []
  5.  
  6. def split(str): #recebe uma string e devolve uma lista com suas palavras separadas
  7. wlist = []
  8. currw = "" #current word
  9. for i in range (0, len(str)):
  10. ch = str[i]
  11. if (ch.isspace() == False): #se não for um espaço
  12. if (ch.isalnum()): #se for um identificador
  13. if(currw.isalnum()): #se a palavra atual for um identificador
  14. currw = currw + ch
  15. elif(currw != ""):#se a palavra atual for um símbolo
  16. wlist.append(currw)
  17. currw = ch
  18. else: #se a palavra atual estiver vazia
  19. currw = ch
  20.  
  21. else: #se for um símbolo
  22. if(currw != ""): #se a palavra atual não estiver vazia
  23. if (currw.isalnum()): #se a palavra atual for um identificador
  24. wlist.append(currw)
  25. currw = ch
  26. elif(currw.isspace()):
  27. currw = ch
  28. else: #se for um símbolo
  29. if currw == "*" and ch == "*":
  30. currw = currw + ch
  31. elif ch == '+' and str[i+1].isalnum(): #operador unário
  32. wlist.append(currw)
  33. currw = '#'
  34. elif ch == '-' and str[i+1].isalnum(): #operador unário
  35. wlist.append(currw)
  36. currw = '_'
  37. else:
  38. wlist.append(currw)
  39. currw = ch
  40. else:
  41. if ch == '+' and not wlist[-1].isalnum() and str[i+1].isalnum():#operador unário
  42. currw = '#'
  43. elif ch == '-' and not wlist[-1].isalnum() and str[i+1].isalnum():#operador unário
  44. currw = '_'
  45. else:
  46. currw = ch
  47. else: #se for um espaço
  48. if(currw.isspace() == False and currw != ""):wlist.append(currw)
  49. currw = ""
  50. if (currw != ""): wlist.append(currw)
  51. return wlist
  52.  
  53. def TraduzPosFixa(exp):
  54. stack = []
  55. posfixa = []
  56. prioridade = {'_' : '5', '#' : '5', '**' : '4', '/' : '3', '*': '3',
  57. '+' : '2', '-' : '2', '=' : '1', '(' : '0'} #hash table com as prioridades
  58. try:
  59. for c in exp:
  60. if c.isalnum():
  61. posfixa.append(c)
  62. else:
  63. if (c == "("):
  64. stack.append(c)
  65. elif (c == ")"): #parenteses mudam a prioridade
  66. op = stack.pop()
  67. while (op != "("):
  68. posfixa.append(op)
  69. op = stack.pop()
  70. else:
  71. while len(stack) != 0 and prioridade[c] <= prioridade[stack[-1]]:
  72. posfixa.append(stack.pop())
  73. stack.append(c)
  74.  
  75.  
  76. while len(stack) != 0:
  77. posfixa.append(stack.pop())
  78. except:
  79. return posfixa, False
  80. return posfixa, True
  81.  
  82. def CalcPosFixa(listaexp):
  83. try:
  84. global TabVal
  85. global TabVar
  86. if listaexp[-1] == '=':
  87. for i in range(1,len(listaexp)): #substituição de variáveis pelos seus valores
  88. symbol = listaexp[i]
  89. if symbol.isdigit():
  90. listaexp[i] = float(symbol)
  91. elif symbol.isalpha():
  92. index = TabVar.index(symbol)
  93. listaexp[i] = TabVal[index]
  94. else:
  95. for i in range(0,len(listaexp)): #substituição de variáveis pelos seus valores
  96. symbol = listaexp[i]
  97. if symbol.isdigit():
  98. listaexp[i] = float(symbol)
  99. elif symbol.isalpha():
  100. index = TabVar.index(symbol)
  101. listaexp[i] = TabVal[index]
  102.  
  103. while len(listaexp) > 1:
  104. for i in range(len(listaexp)):
  105. symbol = listaexp[i]
  106. num = 0.0
  107. if isinstance(symbol, str) and not symbol.isalnum():
  108. if symbol == "_":
  109. listaexp[i-1] = -listaexp[i-1]
  110. listaexp.remove('_')
  111. break
  112. elif symbol == "#":
  113. listaexp[i-1] = +listaexp[i-1]
  114. listaexp.remove('#')
  115. break
  116. elif symbol == "+":
  117. num = listaexp[i-2] + listaexp[i-1]
  118. elif symbol == "-":
  119. num = listaexp[i-2] - listaexp[i-1]
  120. elif symbol == "**":
  121. num = listaexp[i-2] ** listaexp[i-1]
  122. elif symbol == "*":
  123. num = listaexp[i-2] * listaexp[i-1]
  124. elif symbol == "/":
  125. num = listaexp[i-2] / listaexp[i-1]
  126. elif symbol == '=':
  127. var = listaexp[i-2]
  128. val = listaexp[i-1]
  129. try:
  130. varindex = TabVar.index(var)
  131. except:
  132. TabVar.append(var)
  133. TabVal.append(val)
  134. varindex = TabVar.index(var)
  135. TabVal[varindex] = val
  136. return val
  137.  
  138. listaexp[i-2] = '?' #muda-se o conteúdo para usar remove,
  139. listaexp[i-1] = '?' #dessa forma não há risco de deletar o item errado por acidente
  140. listaexp[i] = num
  141. listaexp.remove('?')
  142. listaexp.remove('?')
  143. break
  144. return listaexp[0]
  145. except:
  146. return None
  147.  
  148.  
  149.  
  150.  
  151. while True:
  152. #escrever o prompt, ler input
  153. expr = input(">>> ")
  154. #separar os termos da entrada em uma lista
  155. expr_infixa = split(expr)
  156. expr_posfixa = TraduzPosFixa(expr_infixa)
  157. if expr_posfixa[1] == True:
  158. output = CalcPosFixa(expr_posfixa[0])
  159. if output != None:
  160. print(output)
  161. else:
  162. print("Ocorreu um erro no cálculo")
  163. else:
  164. print("Ocorreu um erro na sintaxe")
  165. # your code goes here
Runtime error #stdin #stdout #stderr 0.01s 7252KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Traceback (most recent call last):
  File "prog.py", line 1, in <module>
ImportError: No module named IPython