From f2f8e9b546b3c5e1b81a869e32ea7791921686a5 Mon Sep 17 00:00:00 2001 From: Leonel Sanches da Silva <53848829+leonelsanchesdasilva@users.noreply.github.com> Date: Mon, 29 Jan 2024 10:11:10 -0800 Subject: [PATCH] =?UTF-8?q?Separa=C3=A7=C3=A3o=20da=20inicializa=C3=A7?= =?UTF-8?q?=C3=A3o=20do=20bloco=20`Para`=20do=20VisuAlg=20(que=20deveria?= =?UTF-8?q?=20ocorrer=20s=C3=B3=20uma=20vez,=20mas=20estava=20ocorrendo=20?= =?UTF-8?q?todas=20as=20vezes)=20da=20l=C3=B3gica=20de=20adi=C3=A7=C3=A3o?= =?UTF-8?q?=20do=20incremento=20ao=20final=20do=20bloco=20de=20execu=C3=A7?= =?UTF-8?q?=C3=A3o.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interpretador-visualg-com-depuracao.ts | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.ts b/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.ts index fe8cb449..eb278b82 100644 --- a/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.ts +++ b/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.ts @@ -150,15 +150,24 @@ export class InterpretadorVisuAlgComDepuracao extends InterpretadorComDepuracao } async visitarDeclaracaoPara(declaracao: Para): Promise { + if (!declaracao.inicializada && declaracao.inicializador !== null) { + await this.avaliar(declaracao.inicializador as any); + if (declaracao.incrementar !== null) { + await comum.resolverIncrementoPara(this, declaracao); + } + } + + declaracao.inicializada = true; + + // Aqui precisamos clonar a declaração `Para` porque inserimos + // ao final dela o incremento. Diferente de declarações `Para` de + // outros dialetos, o incremento dessa declaração é implícito. const cloneDeclaracao = _.cloneDeep(declaracao) as Para; const corpoExecucao = cloneDeclaracao.corpo as Bloco; - if (cloneDeclaracao.inicializador !== null) { - await this.avaliar(cloneDeclaracao.inicializador as any); - // O incremento vai ao final do bloco de escopo. - if (cloneDeclaracao.incrementar !== null) { - await comum.resolverIncrementoPara(this, cloneDeclaracao); - corpoExecucao.declaracoes.push(cloneDeclaracao.incrementar); - } + // O incremento vai ao final do bloco de escopo. + if (cloneDeclaracao.incrementar !== null) { + await comum.resolverIncrementoPara(this, cloneDeclaracao); + corpoExecucao.declaracoes.push(cloneDeclaracao.incrementar); } const escopoAtual = this.pilhaEscoposExecucao.topoDaPilha();