rmayormartins commited on
Commit
7d3d895
1 Parent(s): f108f62

Subindo arquivos21

Browse files
Files changed (1) hide show
  1. app.py +113 -42
app.py CHANGED
@@ -52,6 +52,24 @@ def verificar_tipo(var_name, valor, tipos_variaveis, linha):
52
  return f"# Atenção: Possível atribuição de valor real à variável inteira '{var_name}' na linha: {linha}"
53
  return None
54
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
  def traduzir_para_python(portugol_code):
56
  portugol_code = preprocessar_codigos(portugol_code)
57
  lines = portugol_code.splitlines()
@@ -89,13 +107,13 @@ def traduzir_para_python(portugol_code):
89
  if var_name in tipos_variaveis:
90
  tipo = tipos_variaveis[var_name]
91
  if tipo == "INTEIRO":
92
- codigo_python.append(f"{var_name} = int(input('Digite um valor para {var_name}: '))")
93
  elif tipo == "REAL":
94
- codigo_python.append(f"{var_name} = float(input('Digite um valor para {var_name}: '))")
95
  else:
96
- codigo_python.append(f"{var_name} = input('Digite um valor para {var_name}: ')")
97
  else:
98
- codigo_python.append(f"{var_name} = input('Digite um valor para {var_name}: ')")
99
 
100
  elif line.upper().startswith("SE"):
101
  condicao = line[2:].split("THEN")[0].strip()
@@ -186,50 +204,103 @@ def traduzir_para_python(portugol_code):
186
 
187
  return "\n".join(codigo_python), avisos
188
 
189
- def interpretador(portugol_code):
190
- codigo_python = "# Código Python não gerado devido a um erro"
191
- try:
192
- codigo_python, avisos = traduzir_para_python(portugol_code)
193
- codigo_python = re.sub(r"\bAND\b", "and", codigo_python)
194
-
195
- output = io.StringIO()
196
- with contextlib.redirect_stdout(output):
197
- exec(codigo_python, globals())
198
-
199
- # INICIALIZE resultado COMO UMA STRING VAZIA
200
- resultado = ""
201
-
202
- # DESCOMENTE A LINHA ABAIXO PARA MOSTRAR O CÓDIGO PYTHON GERADO
203
- # resultado += f"Código Python Gerado:\n{codigo_python}\n\n"
204
-
205
- if avisos:
206
- resultado += "Avisos:\n" + "\n".join(avisos) + "\n\n"
207
-
208
- resultado += f"Saída:\n{output.getvalue().strip()}"
209
- return resultado
210
- except Exception as e:
211
- error_traceback = traceback.format_exc()
212
- # VOCÊ PODE OPTAR POR NÃO MOSTRAR O CÓDIGO PYTHON GERADO EM CASO DE ERRO
213
- # DESCOMENTANDO A LINHA ABAIXO E COMENTANDO A LINHA SEGUINTE
214
- # return f"Erro durante a execução:\n{error_traceback}"
215
- return f"Erro durante a execução:\n{error_traceback}\n\nCódigo Python Gerado:\n{codigo_python}"
216
-
217
- def interpretar(portugol_code):
218
- return interpretador(portugol_code)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
219
 
220
  description_html = """
221
- <p>Interpretador de pseudocodigo:</p>
222
  <p>Ramon Mayor Martins: <a href="https://rmayormartins.github.io/" target="_blank">Website</a> | <a href="https://huggingface.co/rmayormartins" target="_blank">Spaces</a></p>
223
  <p><a href="https://huggingface.co/spaces/rmayormartins/pseudocodelab/blob/main/Manual_PseudocodeLab.pdf" target="_blank">Clique aqui para visualizar o Manual do PseudocodeLab</a></p>
224
  """
225
 
226
- iface = gr.Interface(
227
- fn=interpretar,
228
- inputs=gr.Textbox(lines=20, label="Pseudocodigo"),
229
- outputs="text",
230
- title="PseudocodeLab",
231
- description=description_html
232
- )
233
 
234
  if __name__ == "__main__":
235
  iface.launch(debug=True)
 
52
  return f"# Atenção: Possível atribuição de valor real à variável inteira '{var_name}' na linha: {linha}"
53
  return None
54
 
55
+ def identificar_variaveis_entrada(portugol_code):
56
+ lines = portugol_code.splitlines()
57
+ variaveis_entrada = []
58
+ tipos_variaveis = {}
59
+
60
+ for line in lines:
61
+ line = line.strip()
62
+ if ":" in line and not line.upper().startswith("CASO"):
63
+ var_name, var_type = line.split(":", 1)
64
+ var_name = var_name.strip().lower() # Convertendo para minúsculas
65
+ var_type = var_type.strip().upper()
66
+ tipos_variaveis[var_name] = var_type
67
+ elif line.upper().startswith("LEIA"):
68
+ var_name = line.split("(")[1].split(")")[0].strip().lower() # Convertendo para minúsculas
69
+ variaveis_entrada.append((var_name, tipos_variaveis.get(var_name, "STRING")))
70
+
71
+ return variaveis_entrada
72
+
73
  def traduzir_para_python(portugol_code):
74
  portugol_code = preprocessar_codigos(portugol_code)
75
  lines = portugol_code.splitlines()
 
107
  if var_name in tipos_variaveis:
108
  tipo = tipos_variaveis[var_name]
109
  if tipo == "INTEIRO":
110
+ codigo_python.append(f"{var_name} = int(input_values['{var_name.lower()}'])")
111
  elif tipo == "REAL":
112
+ codigo_python.append(f"{var_name} = float(input_values['{var_name.lower()}'])")
113
  else:
114
+ codigo_python.append(f"{var_name} = input_values['{var_name.lower()}']")
115
  else:
116
+ codigo_python.append(f"{var_name} = input_values['{var_name.lower()}']")
117
 
118
  elif line.upper().startswith("SE"):
119
  condicao = line[2:].split("THEN")[0].strip()
 
204
 
205
  return "\n".join(codigo_python), avisos
206
 
207
+ def interpretador(portugol_code, **input_values):
208
+ codigo_python, avisos = traduzir_para_python(portugol_code)
209
+
210
+ # Adicionando input_values ao escopo de execução
211
+ locals_dict = {'input_values': input_values}
212
+
213
+ output = io.StringIO()
214
+ with contextlib.redirect_stdout(output):
215
+ exec(codigo_python, globals(), locals_dict)
216
+
217
+ resultado = f"Saída:\n{output.getvalue().strip()}"
218
+ if avisos:
219
+ resultado = "Avisos:\n" + "\n".join(avisos) + "\n\n" + resultado
220
+
221
+ return resultado
222
+
223
+ def interpretar(portugol_code, **kwargs):
224
+ variaveis_entrada = identificar_variaveis_entrada(portugol_code)
225
+ input_values = {var[0]: kwargs.get(var[0], '') for var in variaveis_entrada}
226
+ return interpretador(portugol_code, **input_values)
227
+
228
+ def execute_code(code, *args):
229
+ variaveis_entrada = identificar_variaveis_entrada(code)
230
+ input_values = {var[0]: arg for var, arg in zip(variaveis_entrada, args) if arg}
231
+ return interpretar(code, **input_values)
232
+
233
+ def criar_interface():
234
+ with gr.Blocks() as iface:
235
+ gr.Markdown(description_html)
236
+
237
+ with gr.Row():
238
+ with gr.Column(scale=2):
239
+ portugol_code = gr.Textbox(lines=20, label="Pseudocódigo")
240
+
241
+ with gr.Column(visible=False) as input_column:
242
+ input_boxes = [gr.Textbox(visible=False, label=f"Entrada {i+1}") for i in range(10)]
243
+
244
+ run_button = gr.Button("Executar")
245
+ exemplo_button = gr.Button("Carregar Exemplo de Fatorial")
246
+
247
+ with gr.Column(scale=1):
248
+ output = gr.Textbox(label="Saída", lines=20)
249
+
250
+ def update_interface(portugol_code):
251
+ variaveis_entrada = identificar_variaveis_entrada(portugol_code)
252
+ return [gr.update(visible=True, label=f"Valor para {var_name} ({var_type})") for var_name, var_type in variaveis_entrada] + \
253
+ [gr.update(visible=False) for _ in range(10 - len(variaveis_entrada))]
254
+
255
+ exemplo_code = """VARIAVEIS
256
+ n: INTEIRO
257
+ fat: INTEIRO
258
+ INICIO
259
+ LEIA (n)
260
+ fat = 1
261
+ ENQUANTO n > 1
262
+ fat = fat * n
263
+ n = n - 1
264
+ FIM-ENQUANTO
265
+ ESCREVA fat
266
+ FIM"""
267
+
268
+ portugol_code.change(
269
+ update_interface,
270
+ inputs=[portugol_code],
271
+ outputs=input_boxes
272
+ ).then(
273
+ lambda: gr.update(visible=True),
274
+ outputs=[input_column]
275
+ )
276
+
277
+ exemplo_button.click(
278
+ lambda: exemplo_code,
279
+ outputs=[portugol_code]
280
+ ).then(
281
+ update_interface,
282
+ inputs=[portugol_code],
283
+ outputs=input_boxes
284
+ ).then(
285
+ lambda: gr.update(visible=True),
286
+ outputs=[input_column]
287
+ )
288
+
289
+ run_button.click(
290
+ execute_code,
291
+ inputs=[portugol_code] + input_boxes,
292
+ outputs=output
293
+ )
294
+
295
+ return iface
296
 
297
  description_html = """
298
+ <p>Interpretador de pseudocódigo:</p>
299
  <p>Ramon Mayor Martins: <a href="https://rmayormartins.github.io/" target="_blank">Website</a> | <a href="https://huggingface.co/rmayormartins" target="_blank">Spaces</a></p>
300
  <p><a href="https://huggingface.co/spaces/rmayormartins/pseudocodelab/blob/main/Manual_PseudocodeLab.pdf" target="_blank">Clique aqui para visualizar o Manual do PseudocodeLab</a></p>
301
  """
302
 
303
+ iface = criar_interface()
 
 
 
 
 
 
304
 
305
  if __name__ == "__main__":
306
  iface.launch(debug=True)