Skip to content

Commit

Permalink
Resolução recursiva de valores de matriz.
Browse files Browse the repository at this point in the history
  • Loading branch information
leonelsanchesdasilva committed Apr 8, 2024
1 parent d3ebb5b commit 0167f46
Show file tree
Hide file tree
Showing 6 changed files with 49 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
6 changes: 3 additions & 3 deletions fontes/construtos/matriz.ts
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -17,6 +17,6 @@ export class Matriz implements Construto {
}

async aceitar(visitante: VisitanteComumInterface): Promise<any> {
return await (visitante as any).visitarExpressaoVetor(this);
return await (visitante as InterpretadorPortugolStudio).visitarExpressaoMatriz(this);
}
}
}
29 changes: 29 additions & 0 deletions fontes/interpretador/comum.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 } = {
Expand Down Expand Up @@ -123,3 +125,30 @@ export async function visitarExpressaoLeiaComum(
pilhaEscoposExecucao.definirVariavel(simbolo.lexema, valorLido);
}
}

export async function visitarExpressaoMatrizComum(
interpretador: InterpretadorPortugolStudio,
expressao: Matriz
): Promise<any> {
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;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -28,6 +29,10 @@ export class InterpretadorPortugolStudioComDepuracao extends InterpretadorComDep
return comum.visitarExpressaoLeiaComum(this.interfaceEntradaSaida, this.pilhaEscoposExecucao, expressao);
}

async visitarExpressaoMatriz(expressao: Matriz): Promise<any> {
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
Expand Down
5 changes: 5 additions & 0 deletions fontes/interpretador/interpretador-portugol-studio.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down Expand Up @@ -35,4 +36,8 @@ export class InterpretadorPortugolStudio extends InterpretadorBase {
async visitarExpressaoLeia(expressao: Leia): Promise<any> {
return comum.visitarExpressaoLeiaComum(this.interfaceEntradaSaida, this.pilhaEscoposExecucao, expressao);
}

async visitarExpressaoMatriz(expressao: Matriz): Promise<any> {
return comum.visitarExpressaoMatrizComum(this, expressao);
}
}
6 changes: 6 additions & 0 deletions testes/interpretador.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -441,6 +441,11 @@ describe('Interpretador (Portugol Studio)', () => {
});

it('Matrizes', async () => {
let _saidas = "";
interpretador.funcaoDeRetornoMesmaLinha = (saida: string) => {
_saidas += saida;
}

const retornoLexador = lexador.mapear([
'programa',
'{',
Expand Down Expand Up @@ -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);
});
});
});
Expand Down

0 comments on commit 0167f46

Please sign in to comment.