Repository: DesignLiquido/delegua
Pull request #313 (2023-04-06 21:39:33)

Várias correções em diferentes dialetos quanto a atribuição de vetores
`leia()` do VisuAlg nunca chama `visitarExpressaoAtribuicaoSobrescrita` porque a variável que recebe o valor é passada por argumento;
- Ajustes no avaliador sintático quanto ao número de iterações de uma instrução `para` no VisuAlg;
- Remoção temporária de lógica de resolução de chamada em `avaliarArgumentosEscreva` (avaliar remover completamente mais futuramente);
- Demais remoções de lógicas que foram reescritas no Avaliador Sintático de Delégua.


Patch:
diff --git a/fontes/avaliador-sintatico/avaliador-sintatico.ts b/fontes/avaliador-sintatico/avaliador-sintatico.ts
index 087d4aa1..a61a7431 100644
--- a/fontes/avaliador-sintatico/avaliador-sintatico.ts
+++ b/fontes/avaliador-sintatico/avaliador-sintatico.ts
@@ -225,84 +225,6 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface {
                 this.avancarEDevolverAnterior();
                 return new Literal(this.hashArquivo, Number(simboloAtual.linha), true);
         }
-        
-        /*if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.SUPER)) {
-            const simboloChave = this.simbolos[this.atual - 1];
-            this.consumir(tiposDeSimbolos.PONTO, "Esperado '.' após 'super'.");
-            const metodo = this.consumir(tiposDeSimbolos.IDENTIFICADOR, 'Esperado nome do método da Superclasse.');
-            return new Super(this.hashArquivo, simboloChave, metodo);
-        }*/
-
-        /* if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.COLCHETE_ESQUERDO)) {
-            const valores = [];
-
-            if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.COLCHETE_DIREITO)) {
-                return new Vetor(this.hashArquivo, Number(simboloAtual.linha), []);
-            }
-
-            while (!this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.COLCHETE_DIREITO)) {
-                const valor = this.atribuir();
-                valores.push(valor);
-                if (this.simbolos[this.atual].tipo !== tiposDeSimbolos.COLCHETE_DIREITO) {
-                    this.consumir(tiposDeSimbolos.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
-                }
-            }
-
-            return new Vetor(this.hashArquivo, Number(simboloAtual.linha), valores);
-        } */
-
-        /* if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.CHAVE_ESQUERDA)) {
-            const chaves = [];
-            const valores = [];
-
-            if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.CHAVE_DIREITA)) {
-                return new Dicionario(this.hashArquivo, Number(simboloAtual.linha), [], []);
-            }
-
-            while (!this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.CHAVE_DIREITA)) {
-                const chave = this.atribuir();
-                this.consumir(tiposDeSimbolos.DOIS_PONTOS, "Esperado ':' entre chave e valor.");
-                const valor = this.atribuir();
-
-                chaves.push(chave);
-                valores.push(valor);
-
-                if (this.simbolos[this.atual].tipo !== tiposDeSimbolos.CHAVE_DIREITA) {
-                    this.consumir(tiposDeSimbolos.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
-                }
-            }
-
-            return new Dicionario(this.hashArquivo, Number(simboloAtual.linha), chaves, valores);
-        } */
-
-        /* if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.FUNÇÃO, tiposDeSimbolos.FUNCAO))
-            return this.corpoDaFuncao(this.simbolos[this.atual - 1].lexema);
-        if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.FALSO))
-            return new Literal(this.hashArquivo, Number(simboloAtual.linha), false);
-        if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.VERDADEIRO))
-            return new Literal(this.hashArquivo, Number(simboloAtual.linha), true);
-        if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.NULO))
-            return new Literal(this.hashArquivo, Number(simboloAtual.linha), null);
-        if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.ISTO))
-            return new Isto(this.hashArquivo, Number(simboloAtual.linha), this.simbolos[this.atual - 1]); */
-
-        /* if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.NUMERO, tiposDeSimbolos.TEXTO)) {
-            const simboloAnterior: SimboloInterface = this.simbolos[this.atual - 1];
-            return new Literal(this.hashArquivo, Number(simboloAnterior.linha), simboloAnterior.literal);
-        }
-
-        if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.IDENTIFICADOR)) {
-            return new Variavel(this.hashArquivo, this.simbolos[this.atual - 1]);
-        }
-
-        if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.PARENTESE_ESQUERDO)) {
-            const expressao = this.expressao();
-            this.consumir(tiposDeSimbolos.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
-
-            return new Agrupamento(this.hashArquivo, Number(simboloAtual.linha), expressao);
-        }
-
-        if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.IMPORTAR)) return this.declaracaoImportar(); */
 
         throw this.erro(this.simbolos[this.atual], 'Esperado expressão.');
     }
@@ -549,7 +471,7 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface {
             return new Atribuir(this.hashArquivo, (expressao.esquerda as Variavel).simbolo, expressao);
         } else if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.IGUAL)) {
             const igual = this.simbolos[this.atual - 1];
-            const valor = this.atribuir();
+            const valor = this.expressao();
 
             if (expressao instanceof Variavel) {
                 const simbolo = expressao.simbolo;
@@ -932,21 +854,6 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface {
                 return this.declaracaoTente();
             
         }
-        // if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.FAZER)) return this.declaracaoFazer();
-        // if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.TENTE)) return this.declaracaoTente();
-        // if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.ESCOLHA)) return this.declaracaoEscolha();
-        // if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.RETORNA)) return this.declaracaoRetorna();
-        // if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.CONTINUA)) return this.declaracaoContinua();
-        /* if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.PAUSA, tiposDeSimbolos.SUSTAR))
-            return this.declaracaoSustar(); */
-        // if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.PARA)) return this.declaracaoPara();
-        // if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.ENQUANTO)) return this.declaracaoEnquanto();
-        // if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.SE)) return this.declaracaoSe();
-        // if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.ESCREVA)) return this.declaracaoEscreva();
-        /* if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.CHAVE_ESQUERDA)) {
-            const simboloInicioBloco: SimboloInterface = this.simbolos[this.atual - 1];
-            return new Bloco(simboloInicioBloco.hashArquivo, Number(simboloInicioBloco.linha), this.blocoEscopo());
-        } */
 
         const simboloAtual = this.simbolos[this.atual];
         if (simboloAtual.tipo === tiposDeSimbolos.IDENTIFICADOR) {
@@ -1086,6 +993,7 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface {
             return this.resolverDeclaracao();
         } catch (erro: any) {
             this.sincronizar();
+            this.erros.push(erro);
             return null;
         }
     }
diff --git a/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-visualg.ts b/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-visualg.ts
index ac1cbc90..c30b4840 100644
--- a/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-visualg.ts
+++ b/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-visualg.ts
@@ -48,7 +48,7 @@ export class AvaliadorSintaticoVisuAlg extends AvaliadorSintaticoBase {
             const dimensao = dimensoes[0] + 1;
             const resto = dimensoes.slice(1);
             const novoArray = Array(dimensao);
-            for (let i = 0; i < dimensao; i++) {
+            for (let i = 0; i <= dimensao; i++) {
                 novoArray[i] = this.criarVetorNDimensional(resto);
             }
             return novoArray;
@@ -723,7 +723,7 @@ export class AvaliadorSintaticoVisuAlg extends AvaliadorSintaticoBase {
             new Binario(
                 this.hashArquivo,
                 new Variavel(this.hashArquivo, variavelIteracao),
-                new Simbolo(tiposDeSimbolos.MENOR, '', '', Number(simboloPara.linha), this.hashArquivo),
+                new Simbolo(tiposDeSimbolos.MENOR_IGUAL, '', '', Number(simboloPara.linha), this.hashArquivo),
                 new Literal(this.hashArquivo, Number(simboloPara.linha), numeroFim.literal)
             ),
             new Atribuir(
diff --git a/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.ts b/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.ts
index 76552fa2..50b0f5cc 100644
--- a/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.ts
+++ b/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.ts
@@ -2,7 +2,7 @@ import {
     registrarBibliotecaNumericaVisuAlg,
     registrarBibliotecaCaracteresVisuAlg,
 } from '../../../bibliotecas/dialetos/visualg';
-import { Binario, Construto, Logico, Variavel } from '../../../construtos';
+import { AcessoIndiceVariavel, Binario, Construto, Logico, Variavel } from '../../../construtos';
 import { EscrevaMesmaLinha, Escreva, Fazer, Leia } from '../../../declaracoes';
 import { ContinuarQuebra, Quebra } from '../../../quebras';
 import { InterpretadorComDepuracao } from '../../interpretador-com-depuracao';
@@ -37,7 +37,7 @@ export class InterpretadorVisuAlgComDepuracao extends InterpretadorComDepuracao
     }
 
     /**
-     * No VisuAlg, o bloco de condição executa se falso.
+     * No VisuAlg, o bloco executa se a condição for falsa.
      * Por isso a reimplementação aqui.
      * @param declaracao A declaração `Fazer`
      * @returns Só retorna em caso de erro na execução, e neste caso, o erro.
@@ -97,6 +97,32 @@ export class InterpretadorVisuAlgComDepuracao extends InterpretadorComDepuracao
         }
     }
 
+    async atribuirVariavel(expressao: Construto, valor: any): Promise<any> {
+        if (expressao instanceof Variavel) {
+            this.pilhaEscoposExecucao.atribuirVariavel(expressao.simbolo, valor);
+            return;
+        }
+
+        if (expressao instanceof AcessoIndiceVariavel) {
+            const promises = await Promise.all([
+                this.avaliar(expressao.entidadeChamada),
+                this.avaliar(expressao.indice)
+            ]);
+
+            let alvo = promises[0];
+            let indice = promises[1];
+            if (alvo.hasOwnProperty('valor')) {
+                alvo = alvo.valor;
+            }
+
+            if (indice.hasOwnProperty('valor')) {
+                indice = indice.valor;
+            }
+
+            alvo[indice] = valor;
+        }
+    }
+
     /**
      * Execução da leitura de valores da entrada configurada no
      * início da aplicação.
@@ -114,7 +140,7 @@ export class InterpretadorVisuAlgComDepuracao extends InterpretadorComDepuracao
                 );
 
             const valorLido = await promessaLeitura();
-            this.pilhaEscoposExecucao.atribuirVariavel((<Variavel>argumento).simbolo, valorLido);
+            await this.atribuirVariavel(argumento, valorLido);
         }
     }
 
diff --git a/fontes/interpretador/interpretador-base.ts b/fontes/interpretador/interpretador-base.ts
index bee44d54..48db4f1d 100644
--- a/fontes/interpretador/interpretador-base.ts
+++ b/fontes/interpretador/interpretador-base.ts
@@ -917,15 +917,21 @@ export class InterpretadorBase implements InterpretadorInterface {
                     expressao.linha
                 )
             );
-        }
+        }        
     }
 
     async visitarExpressaoAcessoIndiceVariavel(expressao: AcessoIndiceVariavel | any): Promise<any> {
-        const variavelObjeto: VariavelInterface = await this.avaliar(expressao.entidadeChamada);
-        const objeto = variavelObjeto.hasOwnProperty('valor') ? variavelObjeto.valor : variavelObjeto;
+        const promises = await Promise.all([
+            this.avaliar(expressao.entidadeChamada),
+            this.avaliar(expressao.indice)
+        ]);
 
-        const indice = await this.avaliar(expressao.indice);
+        const variavelObjeto: VariavelInterface = promises[0];
+        const indice = promises[1];
+
+        const objeto = variavelObjeto.hasOwnProperty('valor') ? variavelObjeto.valor : variavelObjeto;
         let valorIndice = indice.hasOwnProperty('valor') ? indice.valor : indice;
+        
         if (Array.isArray(objeto)) {
             if (!Number.isInteger(valorIndice)) {
                 return Promise.reject(
diff --git a/fontes/interpretador/interpretador-com-depuracao.ts b/fontes/interpretador/interpretador-com-depuracao.ts
index f80469e6..1be207eb 100644
--- a/fontes/interpretador/interpretador-com-depuracao.ts
+++ b/fontes/interpretador/interpretador-com-depuracao.ts
@@ -159,7 +159,7 @@ export class InterpretadorComDepuracao
         let formatoTexto: string = '';
 
         for (const argumento of argumentos) {
-            let resultadoAvaliacao: any;
+            /* let resultadoAvaliacao: any;
             if (argumento instanceof Chamada) {
                 const escopoAtual = this.pilhaEscoposExecucao.topoDaPilha();
                 const idChamadaComArgumentos = await this.gerarIdResolucaoChamada(argumento);
@@ -170,11 +170,11 @@ export class InterpretadorComDepuracao
                     resultadoAvaliacao = await this.avaliar(argumento);
                 }
             } else {
-                resultadoAvaliacao = await this.avaliar(argumento);
-            }
+                
+            } */
 
+            const resultadoAvaliacao = await this.avaliar(argumento);
             let valor = resultadoAvaliacao?.hasOwnProperty('valor') ? resultadoAvaliacao.valor : resultadoAvaliacao;
-
             formatoTexto += `${this.paraTexto(valor)} `;
         }
 


Test patch:
diff --git a/testes/tradutores/tradutor-visualg.test.ts b/testes/tradutores/tradutor-visualg.test.ts
index de80dbf3..c122e7a0 100644
--- a/testes/tradutores/tradutor-visualg.test.ts
+++ b/testes/tradutores/tradutor-visualg.test.ts
@@ -57,7 +57,7 @@ describe('Tradutor Reverso JavaScript -> Delégua', () => {
             const resultado = tradutor.traduzir(codigo);
             expect(resultado).toBeTruthy();
             expect(resultado).toMatch(/var i = 0/i);
-            expect(resultado).toMatch(/para \(i = 1 ;i < 10; i = i \+ 1\)/i);
+            expect(resultado).toMatch(/para \(i = 1 ;i <= 10; i = i \+ 1\)/i);
         })
 
         it('cálculo imc com se/senão', () => {