Spaces:
Sleeping
Sleeping
rmayormartins
commited on
Commit
•
7d3d895
1
Parent(s):
f108f62
Subindo arquivos21
Browse files
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(
|
93 |
elif tipo == "REAL":
|
94 |
-
codigo_python.append(f"{var_name} = float(
|
95 |
else:
|
96 |
-
codigo_python.append(f"{var_name} =
|
97 |
else:
|
98 |
-
codigo_python.append(f"{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 =
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
219 |
|
220 |
description_html = """
|
221 |
-
<p>Interpretador de
|
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 =
|
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)
|