Skip to content

Commit

Permalink
Métodos comuns matriz VisuAlg (#578)
Browse files Browse the repository at this point in the history
* Métodos comuns matriz VisuAlg
* Passando interpretador para funções comum de matriz
  • Loading branch information
samuelrvg authored Jan 17, 2024
1 parent bbc3f05 commit 011f5de
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 196 deletions.
104 changes: 104 additions & 0 deletions fontes/interpretador/dialetos/visualg/comum.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import {
AcessoElementoMatriz,
AcessoIndiceVariavel,
AtribuicaoPorIndicesMatriz,
Binario,
Construto,
FimPara,
Expand Down Expand Up @@ -287,3 +289,105 @@ export async function resolverIncrementoPara(interpretador: InterpretadorBase, d
}
}
}

export async function visitarExpressaoAcessoElementoMatriz(interpretador: InterpretadorBase, expressao: AcessoElementoMatriz): Promise<any> {
const promises = await Promise.all([
avaliar(interpretador, expressao.entidadeChamada),
avaliar(interpretador, expressao.indicePrimario),
avaliar(interpretador, expressao.indiceSecundario),
]);

const variavelObjeto: VariavelInterface = promises[0];
const indicePrimario = promises[1];
const indiceSecundario = promises[2];

const objeto = variavelObjeto.hasOwnProperty('valor') ? variavelObjeto.valor : variavelObjeto;
let valorIndicePrimario = indicePrimario.hasOwnProperty('valor') ? indicePrimario.valor : indicePrimario;
let valorIndiceSecundario = indiceSecundario.hasOwnProperty('valor') ? indiceSecundario.valor : indiceSecundario;

if (Array.isArray(objeto)) {
if (!Number.isInteger(valorIndicePrimario) || !Number.isInteger(valorIndiceSecundario)) {
return Promise.reject(
new ErroEmTempoDeExecucao(
expressao.simboloFechamento,
'Somente inteiros podem ser usados para indexar um vetor.',
expressao.linha
)
);
}

if (valorIndicePrimario < 0 && objeto.length !== 0) {
while (valorIndicePrimario < 0) {
valorIndicePrimario += objeto.length;
}
}
if (valorIndiceSecundario < 0 && objeto.length !== 0) {
while (valorIndiceSecundario < 0) {
valorIndiceSecundario += objeto.length;
}
}

if (valorIndicePrimario >= objeto.length || valorIndiceSecundario >= objeto.length) {
return Promise.reject(
new ErroEmTempoDeExecucao(
expressao.simboloFechamento,
'Índice do vetor fora do intervalo.',
expressao.linha
)
);
}
return objeto[valorIndicePrimario][valorIndiceSecundario];
}
return Promise.reject(
new ErroEmTempoDeExecucao(
expressao.entidadeChamada.valor,
'Somente listas, dicionários, classes e objetos podem ser mudados por sobrescrita.',
expressao.linha
)
);
}

export async function visitarExpressaoAtribuicaoPorIndicesMatriz(interpretador: InterpretadorBase, expressao: AtribuicaoPorIndicesMatriz): Promise<any> {
const promises = await Promise.all([
avaliar(interpretador, expressao.objeto),
avaliar(interpretador, expressao.indicePrimario),
avaliar(interpretador, expressao.indiceSecundario),
avaliar(interpretador, expressao.valor),
]);

let objeto = promises[0];
let indicePrimario = promises[1];
let indiceSecundario = promises[2];
const valor = promises[3];

objeto = objeto.hasOwnProperty('valor') ? objeto.valor : objeto;
indicePrimario = indicePrimario.hasOwnProperty('valor') ? indicePrimario.valor : indicePrimario;
indiceSecundario = indiceSecundario.hasOwnProperty('valor') ? indiceSecundario.valor : indiceSecundario;

if (Array.isArray(objeto)) {
if (indicePrimario < 0 && objeto.length !== 0) {
while (indicePrimario < 0) {
indicePrimario += objeto.length;
}
}
if (indiceSecundario < 0 && objeto.length !== 0) {
while (indiceSecundario < 0) {
indiceSecundario += objeto.length;
}
}

while (objeto.length < indicePrimario || objeto.length < indiceSecundario) {
objeto.push(null);
}

objeto[indicePrimario][indiceSecundario] = valor;
return Promise.resolve();
}
return Promise.reject(
new ErroEmTempoDeExecucao(
expressao.objeto.nome,
'Somente listas, dicionários, classes e objetos podem ser mudados por sobrescrita.',
expressao.linha
)
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ import { AcessoElementoMatriz, AtribuicaoPorIndicesMatriz, Binario, Construto, F
import { EscrevaMesmaLinha, Escreva, Fazer, Leia, Const, Para, Bloco } from '../../../declaracoes';
import { ContinuarQuebra, Quebra, SustarQuebra } from '../../../quebras';
import { InterpretadorComDepuracao } from '../../interpretador-com-depuracao';
import { ErroEmTempoDeExecucao } from '../../../excecoes';
import { VariavelInterface } from '../../../interfaces';
import * as comum from './comum';

/**
Expand All @@ -31,105 +29,11 @@ export class InterpretadorVisuAlgComDepuracao extends InterpretadorComDepuracao
}

async visitarExpressaoAcessoElementoMatriz(expressao: AcessoElementoMatriz): Promise<any> {
const promises = await Promise.all([
this.avaliar(expressao.entidadeChamada),
this.avaliar(expressao.indicePrimario),
this.avaliar(expressao.indiceSecundario),
]);

const variavelObjeto: VariavelInterface = promises[0];
const indicePrimario = promises[1];
const indiceSecundario = promises[2];

const objeto = variavelObjeto.hasOwnProperty('valor') ? variavelObjeto.valor : variavelObjeto;
let valorIndicePrimario = indicePrimario.hasOwnProperty('valor') ? indicePrimario.valor : indicePrimario;
let valorIndiceSecundario = indiceSecundario.hasOwnProperty('valor') ? indiceSecundario.valor : indiceSecundario;

if (Array.isArray(objeto)) {
if (!Number.isInteger(valorIndicePrimario) || !Number.isInteger(valorIndiceSecundario)) {
return Promise.reject(
new ErroEmTempoDeExecucao(
expressao.simboloFechamento,
'Somente inteiros podem ser usados para indexar um vetor.',
expressao.linha
)
);
}

if (valorIndicePrimario < 0 && objeto.length !== 0) {
while (valorIndicePrimario < 0) {
valorIndicePrimario += objeto.length;
}
}
if (valorIndiceSecundario < 0 && objeto.length !== 0) {
while (valorIndiceSecundario < 0) {
valorIndiceSecundario += objeto.length;
}
}

if (valorIndicePrimario >= objeto.length || valorIndiceSecundario >= objeto.length) {
return Promise.reject(
new ErroEmTempoDeExecucao(
expressao.simboloFechamento,
'Índice do vetor fora do intervalo.',
expressao.linha
)
);
}
return objeto[valorIndicePrimario][valorIndiceSecundario];
}
return Promise.reject(
new ErroEmTempoDeExecucao(
expressao.entidadeChamada.valor,
'Somente listas, dicionários, classes e objetos podem ser mudados por sobrescrita.',
expressao.linha
)
);
return await comum.visitarExpressaoAcessoElementoMatriz(this, expressao);
}

async visitarExpressaoAtribuicaoPorIndicesMatriz(expressao: AtribuicaoPorIndicesMatriz): Promise<any> {
const promises = await Promise.all([
this.avaliar(expressao.objeto),
this.avaliar(expressao.indicePrimario),
this.avaliar(expressao.indiceSecundario),
this.avaliar(expressao.valor),
]);

let objeto = promises[0];
let indicePrimario = promises[1];
let indiceSecundario = promises[2];
const valor = promises[3];

objeto = objeto.hasOwnProperty('valor') ? objeto.valor : objeto;
indicePrimario = indicePrimario.hasOwnProperty('valor') ? indicePrimario.valor : indicePrimario;
indiceSecundario = indiceSecundario.hasOwnProperty('valor') ? indiceSecundario.valor : indiceSecundario;

if (Array.isArray(objeto)) {
if (indicePrimario < 0 && objeto.length !== 0) {
while (indicePrimario < 0) {
indicePrimario += objeto.length;
}
}
if (indiceSecundario < 0 && objeto.length !== 0) {
while (indiceSecundario < 0) {
indiceSecundario += objeto.length;
}
}

while (objeto.length < indicePrimario || objeto.length < indiceSecundario) {
objeto.push(null);
}

objeto[indicePrimario][indiceSecundario] = valor;
return Promise.resolve();
}
return Promise.reject(
new ErroEmTempoDeExecucao(
expressao.objeto.nome,
'Somente listas, dicionários, classes e objetos podem ser mudados por sobrescrita.',
expressao.linha
)
);
return await comum.visitarExpressaoAtribuicaoPorIndicesMatriz(this, expressao);
}

private async avaliarArgumentosEscrevaVisuAlg(argumentos: Construto[]): Promise<string> {
Expand Down
100 changes: 2 additions & 98 deletions fontes/interpretador/dialetos/visualg/interpretador-visualg.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ import { InterpretadorBase } from '../..';
import { ContinuarQuebra, Quebra, SustarQuebra } from '../../../quebras';
import { registrarBibliotecaNumericaVisuAlg } from '../../../bibliotecas/dialetos/visualg/numerica';
import { registrarBibliotecaCaracteresVisuAlg } from '../../../bibliotecas/dialetos/visualg';
import { ErroEmTempoDeExecucao } from '../../../excecoes';
import { VariavelInterface } from '../../../interfaces';
import * as comum from './comum';

/**
Expand Down Expand Up @@ -35,105 +33,11 @@ export class InterpretadorVisuAlg extends InterpretadorBase {
}

async visitarExpressaoAcessoElementoMatriz(expressao: AcessoElementoMatriz): Promise<any> {
const promises = await Promise.all([
this.avaliar(expressao.entidadeChamada),
this.avaliar(expressao.indicePrimario),
this.avaliar(expressao.indiceSecundario),
]);

const variavelObjeto: VariavelInterface = promises[0];
const indicePrimario = promises[1];
const indiceSecundario = promises[2];

const objeto = variavelObjeto.hasOwnProperty('valor') ? variavelObjeto.valor : variavelObjeto;
let valorIndicePrimario = indicePrimario.hasOwnProperty('valor') ? indicePrimario.valor : indicePrimario;
let valorIndiceSecundario = indiceSecundario.hasOwnProperty('valor') ? indiceSecundario.valor : indiceSecundario;

if (Array.isArray(objeto)) {
if (!Number.isInteger(valorIndicePrimario) || !Number.isInteger(valorIndiceSecundario)) {
return Promise.reject(
new ErroEmTempoDeExecucao(
expressao.simboloFechamento,
'Somente inteiros podem ser usados para indexar um vetor.',
expressao.linha
)
);
}

if (valorIndicePrimario < 0 && objeto.length !== 0) {
while (valorIndicePrimario < 0) {
valorIndicePrimario += objeto.length;
}
}
if (valorIndiceSecundario < 0 && objeto.length !== 0) {
while (valorIndiceSecundario < 0) {
valorIndiceSecundario += objeto.length;
}
}

if (valorIndicePrimario >= objeto.length || valorIndiceSecundario >= objeto.length) {
return Promise.reject(
new ErroEmTempoDeExecucao(
expressao.simboloFechamento,
'Índice do vetor fora do intervalo.',
expressao.linha
)
);
}
return objeto[valorIndicePrimario][valorIndiceSecundario];
}
return Promise.reject(
new ErroEmTempoDeExecucao(
expressao.entidadeChamada.valor,
'Somente listas, dicionários, classes e objetos podem ser mudados por sobrescrita.',
expressao.linha
)
);
return await comum.visitarExpressaoAcessoElementoMatriz(this, expressao);
}

async visitarExpressaoAtribuicaoPorIndicesMatriz(expressao: AtribuicaoPorIndicesMatriz): Promise<any> {
const promises = await Promise.all([
this.avaliar(expressao.objeto),
this.avaliar(expressao.indicePrimario),
this.avaliar(expressao.indiceSecundario),
this.avaliar(expressao.valor),
]);

let objeto = promises[0];
let indicePrimario = promises[1];
let indiceSecundario = promises[2];
const valor = promises[3];

objeto = objeto.hasOwnProperty('valor') ? objeto.valor : objeto;
indicePrimario = indicePrimario.hasOwnProperty('valor') ? indicePrimario.valor : indicePrimario;
indiceSecundario = indiceSecundario.hasOwnProperty('valor') ? indiceSecundario.valor : indiceSecundario;

if (Array.isArray(objeto)) {
if (indicePrimario < 0 && objeto.length !== 0) {
while (indicePrimario < 0) {
indicePrimario += objeto.length;
}
}
if (indiceSecundario < 0 && objeto.length !== 0) {
while (indiceSecundario < 0) {
indiceSecundario += objeto.length;
}
}

while (objeto.length < indicePrimario || objeto.length < indiceSecundario) {
objeto.push(null);
}

objeto[indicePrimario][indiceSecundario] = valor;
return Promise.resolve();
}
return Promise.reject(
new ErroEmTempoDeExecucao(
expressao.objeto.nome,
'Somente listas, dicionários, classes e objetos podem ser mudados por sobrescrita.',
expressao.linha
)
);
return await comum.visitarExpressaoAtribuicaoPorIndicesMatriz(this, expressao);
}

private async avaliarArgumentosEscrevaVisuAlg(argumentos: Construto[]): Promise<string> {
Expand Down

0 comments on commit 011f5de

Please sign in to comment.