From 0167f4668c47f53551ee4d387e4c4a020295249b Mon Sep 17 00:00:00 2001 From: Leonel Sanches da Silva <53848829+leonelsanchesdasilva@users.noreply.github.com> Date: Mon, 8 Apr 2024 13:57:48 -0700 Subject: [PATCH] =?UTF-8?q?Resolu=C3=A7=C3=A3o=20recursiva=20de=20valores?= =?UTF-8?q?=20de=20matriz.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../avaliador-sintatico-portugol-studio.ts | 1 + fontes/construtos/matriz.ts | 6 ++-- fontes/interpretador/comum.ts | 29 +++++++++++++++++++ ...rpretador-portugol-studio-com-depuracao.ts | 5 ++++ .../interpretador-portugol-studio.ts | 5 ++++ testes/interpretador.test.ts | 6 ++++ 6 files changed, 49 insertions(+), 3 deletions(-) diff --git a/fontes/avaliador-sintatico/avaliador-sintatico-portugol-studio.ts b/fontes/avaliador-sintatico/avaliador-sintatico-portugol-studio.ts index 4f5e836..cc04ce2 100644 --- a/fontes/avaliador-sintatico/avaliador-sintatico-portugol-studio.ts +++ b/fontes/avaliador-sintatico/avaliador-sintatico-portugol-studio.ts @@ -579,6 +579,7 @@ export class AvaliadorSintaticoPortugolStudio extends AvaliadorSintaticoBase { 'Esperado chave direita após valores de vetor em lado direito da atribuição de vetor.' ); + // TODO: Recolocar. /* if (dimensoes !== valores.length) { throw this.erro( simboloInteiro, diff --git a/fontes/construtos/matriz.ts b/fontes/construtos/matriz.ts index 3f95ee9..8925d4c 100644 --- a/fontes/construtos/matriz.ts +++ b/fontes/construtos/matriz.ts @@ -1,7 +1,7 @@ import { VisitanteComumInterface } from "@designliquido/delegua"; import { Construto } from "@designliquido/delegua/construtos"; -import { AvaliadorSintaticoPortugolStudio } from "fontes/avaliador-sintatico"; +import { InterpretadorPortugolStudio } from "../interpretador"; export class Matriz implements Construto { linha: number; @@ -17,6 +17,6 @@ export class Matriz implements Construto { } async aceitar(visitante: VisitanteComumInterface): Promise { - return await (visitante as any).visitarExpressaoVetor(this); + return await (visitante as InterpretadorPortugolStudio).visitarExpressaoMatriz(this); } -} \ No newline at end of file +} diff --git a/fontes/interpretador/comum.ts b/fontes/interpretador/comum.ts index 1b49d96..a186383 100644 --- a/fontes/interpretador/comum.ts +++ b/fontes/interpretador/comum.ts @@ -8,6 +8,8 @@ import * as calendario from '../bibliotecas/calendario'; import * as matematica from '../bibliotecas/matematica'; import * as texto from '../bibliotecas/texto'; import * as util from '../bibliotecas/util'; +import { Matriz } from 'fontes/construtos/matriz'; +import { InterpretadorPortugolStudio } from './interpretador-portugol-studio'; function carregarBibliotecaCalendario(): DeleguaModulo { const metodos: { [nome: string]: FuncaoPadrao } = { @@ -123,3 +125,30 @@ export async function visitarExpressaoLeiaComum( pilhaEscoposExecucao.definirVariavel(simbolo.lexema, valorLido); } } + +export async function visitarExpressaoMatrizComum( + interpretador: InterpretadorPortugolStudio, + expressao: Matriz +): Promise { + return await resolverValoresMatriz(interpretador, expressao.valores); +} + +/** + * Função recursiva que visita todos os valores de uma matriz. + * @param interpretador A instância do interpretador. + * @param valores A matriz de valores das dimensões ainda não resolvidas. + */ +async function resolverValoresMatriz(interpretador: InterpretadorPortugolStudio, valores: any[]) { + const valoresResolvidos = []; + if (valores && valores.length > 0) { + for (let i = 0; i < valores.length; i++) { + if (Array.isArray(valores[i])) { + valoresResolvidos.push(await resolverValoresMatriz(interpretador, valores[i])); + } else { + valoresResolvidos.push(await interpretador.avaliar(valores[i])); + } + } + } + + return valoresResolvidos; +} \ No newline at end of file diff --git a/fontes/interpretador/interpretador-portugol-studio-com-depuracao.ts b/fontes/interpretador/interpretador-portugol-studio-com-depuracao.ts index 984b7c5..bdff142 100644 --- a/fontes/interpretador/interpretador-portugol-studio-com-depuracao.ts +++ b/fontes/interpretador/interpretador-portugol-studio-com-depuracao.ts @@ -3,6 +3,7 @@ import { InterpretadorComDepuracao } from '@designliquido/delegua/interpretador/ import { PilhaEscoposExecucaoPortugolStudio } from './pilha-escopos-execucao-portugol-studio'; import { DeleguaModulo } from '@designliquido/delegua/estruturas'; +import { Matriz } from '../construtos/matriz'; import * as comum from './comum'; export class InterpretadorPortugolStudioComDepuracao extends InterpretadorComDepuracao { @@ -28,6 +29,10 @@ export class InterpretadorPortugolStudioComDepuracao extends InterpretadorComDep return comum.visitarExpressaoLeiaComum(this.interfaceEntradaSaida, this.pilhaEscoposExecucao, expressao); } + async visitarExpressaoMatriz(expressao: Matriz): Promise { + return comum.visitarExpressaoMatrizComum(this, expressao); + } + /** * No Portugol Studio, como o bloco de execução da função `inicio` é criado * pelo avaliador sintático, precisamos ter uma forma aqui de avançar o diff --git a/fontes/interpretador/interpretador-portugol-studio.ts b/fontes/interpretador/interpretador-portugol-studio.ts index e2612b4..6f0fafc 100644 --- a/fontes/interpretador/interpretador-portugol-studio.ts +++ b/fontes/interpretador/interpretador-portugol-studio.ts @@ -4,6 +4,7 @@ import { EscopoExecucao } from '@designliquido/delegua/interfaces/escopo-execuca import { EspacoVariaveis } from '@designliquido/delegua/espaco-variaveis'; import { DeleguaModulo } from '@designliquido/delegua/estruturas'; +import { Matriz } from '../construtos/matriz'; import { PilhaEscoposExecucaoPortugolStudio } from './pilha-escopos-execucao-portugol-studio'; import * as comum from './comum'; @@ -35,4 +36,8 @@ export class InterpretadorPortugolStudio extends InterpretadorBase { async visitarExpressaoLeia(expressao: Leia): Promise { return comum.visitarExpressaoLeiaComum(this.interfaceEntradaSaida, this.pilhaEscoposExecucao, expressao); } + + async visitarExpressaoMatriz(expressao: Matriz): Promise { + return comum.visitarExpressaoMatrizComum(this, expressao); + } } diff --git a/testes/interpretador.test.ts b/testes/interpretador.test.ts index 89dde05..b083a9e 100644 --- a/testes/interpretador.test.ts +++ b/testes/interpretador.test.ts @@ -441,6 +441,11 @@ describe('Interpretador (Portugol Studio)', () => { }); it('Matrizes', async () => { + let _saidas = ""; + interpretador.funcaoDeRetornoMesmaLinha = (saida: string) => { + _saidas += saida; + } + const retornoLexador = lexador.mapear([ 'programa', '{', @@ -481,6 +486,7 @@ describe('Interpretador (Portugol Studio)', () => { const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes); expect(retornoInterpretador.erros).toHaveLength(0); + expect(_saidas.length).toBeGreaterThanOrEqual(4); }); }); });