Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Constante com declaracao tipos #555

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 27 additions & 25 deletions fontes/interpretador/interpretador-base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ import primitivasTexto from '../bibliotecas/primitivas-texto';
import primitivasVetor from '../bibliotecas/primitivas-vetor';
import tiposDeSimbolos from '../tipos-de-simbolos/delegua';
import { ArgumentoInterface } from './argumento-interface';
import tipoDeDadosPrimitivos from '../tipos-de-dados/primitivos'
import tipoDeDadosDelegua from '../tipos-de-dados/delegua'

/**
* O Interpretador visita todos os elementos complexos gerados pelo avaliador sintático (_parser_),
Expand Down Expand Up @@ -223,7 +225,7 @@ export class InterpretadorBase implements InterpretadorInterface {
const mensagem = '> ';
if (expressao.argumento instanceof Literal) {
let valor = expressao.argumento.valor;
if (typeof valor === 'string') {
if (typeof valor === tipoDeDadosPrimitivos.TEXTO) {
return new Promise((resolucao) =>
this.interfaceEntradaSaida.question(mensagem, (resposta: any) => {
resolucao(
Expand Down Expand Up @@ -256,7 +258,7 @@ export class InterpretadorBase implements InterpretadorInterface {
let textoFinal = texto;

variaveis.forEach((elemento) => {
if (elemento?.valor?.tipo === 'lógico') {
if (elemento?.valor?.tipo === tipoDeDadosDelegua.LOGICO) {
textoFinal = textoFinal.replace('${' + elemento.variavel + '}', this.paraTexto(elemento?.valor?.valor));
} else {
textoFinal = textoFinal.replace(
Expand Down Expand Up @@ -319,7 +321,7 @@ export class InterpretadorBase implements InterpretadorInterface {

eVerdadeiro(objeto: any): boolean {
if (objeto === null) return false;
if (typeof objeto === 'boolean') return Boolean(objeto);
if (typeof objeto === tipoDeDadosPrimitivos.BOOLEANO) return Boolean(objeto);
if (objeto.hasOwnProperty('valor')) {
return Boolean(objeto.valor);
}
Expand All @@ -328,7 +330,7 @@ export class InterpretadorBase implements InterpretadorInterface {
}

protected verificarOperandoNumero(operador: SimboloInterface, operando: any): void {
if (typeof operando === 'number' || operando.tipo === 'número') return;
if (typeof operando === tipoDeDadosPrimitivos.NUMERO || operando.tipo === tipoDeDadosDelegua.NUMERO) return;
throw new ErroEmTempoDeExecucao(operador, 'Operando precisa ser um número.', Number(operador.linha));
}

Expand Down Expand Up @@ -388,7 +390,7 @@ export class InterpretadorBase implements InterpretadorInterface {
const tipoConteudo: string = conteudo.hasOwnProperty('tipo') ? conteudo.tipo : typeof conteudo;

resultado = valorConteudo;
if (['número', 'number'].includes(tipoConteudo) && declaracao.casasDecimais > 0) {
if ([tipoDeDadosDelegua.NUMERO, tipoDeDadosPrimitivos.NUMERO].includes(tipoConteudo) && declaracao.casasDecimais > 0) {
resultado = valorConteudo.toLocaleString('pt', { maximumFractionDigits: declaracao.casasDecimais });
}

Expand Down Expand Up @@ -418,13 +420,13 @@ export class InterpretadorBase implements InterpretadorInterface {
direita: VariavelInterface | any,
esquerda: VariavelInterface | any
): void {
const tipoDireita: string = direita.tipo ? direita.tipo : typeof direita === 'number' ? 'número' : String(NaN);
const tipoDireita: string = direita.tipo ? direita.tipo : typeof direita === tipoDeDadosPrimitivos.NUMERO ? tipoDeDadosDelegua.NUMERO : String(NaN);
const tipoEsquerda: string = esquerda.tipo
? esquerda.tipo
: typeof esquerda === 'number'
? 'número'
: typeof esquerda === tipoDeDadosPrimitivos.NUMERO
? tipoDeDadosDelegua.NUMERO
: String(NaN);
if (tipoDireita === 'número' && tipoEsquerda === 'número') return;
if (tipoDireita === tipoDeDadosDelegua.NUMERO && tipoEsquerda === tipoDeDadosDelegua.NUMERO) return;
throw new ErroEmTempoDeExecucao(operador, 'Operadores precisam ser números.', operador.linha);
}

Expand All @@ -442,7 +444,7 @@ export class InterpretadorBase implements InterpretadorInterface {
return Math.pow(valorEsquerdo, valorDireito);

case tiposDeSimbolos.MAIOR:
if (tipoEsquerdo === 'número' && tipoDireito === 'número') {
if (tipoEsquerdo === tipoDeDadosDelegua.NUMERO && tipoDireito === tipoDeDadosDelegua.NUMERO) {
return Number(valorEsquerdo) > Number(valorDireito);
} else {
return String(valorEsquerdo) > String(valorDireito);
Expand All @@ -453,7 +455,7 @@ export class InterpretadorBase implements InterpretadorInterface {
return Number(valorEsquerdo) >= Number(valorDireito);

case tiposDeSimbolos.MENOR:
if (tipoEsquerdo === 'número' && tipoDireito === 'número') {
if (tipoEsquerdo === tipoDeDadosDelegua.NUMERO && tipoDireito === tipoDeDadosDelegua.NUMERO) {
return Number(valorEsquerdo) < Number(valorDireito);
} else {
return String(valorEsquerdo) < String(valorDireito);
Expand All @@ -470,7 +472,7 @@ export class InterpretadorBase implements InterpretadorInterface {

case tiposDeSimbolos.ADICAO:
case tiposDeSimbolos.MAIS_IGUAL:
if (['número', 'inteiro'].includes(tipoEsquerdo) && ['número', 'inteiro'].includes(tipoDireito)) {
if ([tipoDeDadosDelegua.NUMERO, 'inteiro'].includes(tipoEsquerdo) && [tipoDeDadosDelegua.NUMERO, 'inteiro'].includes(tipoDireito)) {
return Number(valorEsquerdo) + Number(valorDireito);
} else {
return String(valorEsquerdo) + String(valorDireito);
Expand All @@ -488,15 +490,15 @@ export class InterpretadorBase implements InterpretadorInterface {

case tiposDeSimbolos.MULTIPLICACAO:
case tiposDeSimbolos.MULTIPLICACAO_IGUAL:
if (tipoEsquerdo === 'texto' || tipoDireito === 'texto') {
if (tipoEsquerdo === tipoDeDadosDelegua.TEXTO || tipoDireito === tipoDeDadosDelegua.TEXTO) {
// Sem ambos os valores resolvem como texto, multiplica normal.
// Se apenas um resolve como texto, o outro repete o
// texto n vezes, sendo n o valor do outro.
if (tipoEsquerdo === 'texto' && tipoDireito === 'texto') {
if (tipoEsquerdo === tipoDeDadosDelegua.TEXTO && tipoDireito === tipoDeDadosDelegua.TEXTO) {
return Number(valorEsquerdo) * Number(valorDireito);
}

if (tipoEsquerdo === 'texto') {
if (tipoEsquerdo === tipoDeDadosDelegua.TEXTO) {
return valorEsquerdo.repeat(Number(valorDireito));
}

Expand Down Expand Up @@ -653,7 +655,7 @@ export class InterpretadorBase implements InterpretadorInterface {

// A função chamada pode ser de uma biblioteca JavaScript.
// Neste caso apenas testamos se o tipo é uma função.
if (typeof entidadeChamada === 'function') {
if (typeof entidadeChamada === tipoDeDadosPrimitivos.FUNCAO) {
let objeto = null;
if (expressao.entidadeChamada.objeto) {
objeto = await this.avaliar(expressao.entidadeChamada.objeto);
Expand Down Expand Up @@ -704,7 +706,7 @@ export class InterpretadorBase implements InterpretadorInterface {
if (expressao.operador.tipo === tiposDeSimbolos.EM) {
const direita = await this.avaliar(expressao.direita);

if (Array.isArray(direita) || typeof direita === 'string') {
if (Array.isArray(direita) || typeof direita === tipoDeDadosPrimitivos.TEXTO) {
return direita.includes(esquerda);
} else if (direita.constructor === Object) {
return esquerda in direita;
Expand Down Expand Up @@ -1217,7 +1219,7 @@ export class InterpretadorBase implements InterpretadorInterface {
objeto instanceof DeleguaModulo
) {
return objeto[valorIndice] || null;
} else if (typeof objeto === 'string') {
} else if (typeof objeto === tipoDeDadosPrimitivos.TEXTO) {
if (!Number.isInteger(valorIndice)) {
return Promise.reject(
new ErroEmTempoDeExecucao(
Expand Down Expand Up @@ -1354,13 +1356,13 @@ export class InterpretadorBase implements InterpretadorInterface {

// Função tradicional do JavaScript.
// Normalmente executa quando uma biblioteca é importada.
if (typeof objeto[expressao.simbolo.lexema] === 'function') {
if (typeof objeto[expressao.simbolo.lexema] === tipoDeDadosPrimitivos.FUNCAO) {
return objeto[expressao.simbolo.lexema];
}

// Objeto tradicional do JavaScript.
// Normalmente executa quando uma biblioteca é importada.
if (typeof objeto[expressao.simbolo.lexema] === 'object') {
if (typeof objeto[expressao.simbolo.lexema] === tipoDeDadosPrimitivos.OBJETO) {
return objeto[expressao.simbolo.lexema];
}

Expand All @@ -1374,7 +1376,7 @@ export class InterpretadorBase implements InterpretadorInterface {
}

switch (tipoObjeto) {
case 'texto':
case tipoDeDadosDelegua.TEXTO:
const metodoDePrimitivaTexto: Function = primitivasTexto[expressao.simbolo.lexema];
if (metodoDePrimitivaTexto) {
return new MetodoPrimitiva(objeto, metodoDePrimitivaTexto);
Expand Down Expand Up @@ -1473,8 +1475,8 @@ export class InterpretadorBase implements InterpretadorInterface {
}

paraTexto(objeto: any) {
if (objeto === null || objeto === undefined) return 'nulo';
if (typeof objeto === 'boolean') {
if (objeto === null || objeto === undefined) return tipoDeDadosDelegua.NULO;
if (typeof objeto === tipoDeDadosPrimitivos.BOOLEANO) {
return objeto ? 'verdadeiro' : 'falso';
}

Expand All @@ -1490,7 +1492,7 @@ export class InterpretadorBase implements InterpretadorInterface {
if (objeto.valor instanceof ObjetoPadrao) return objeto.valor.paraTexto();
// TODO: Idealmente isso deveria devolver um texto estruturado representando o objeto.
if (objeto instanceof ObjetoDeleguaClasse) return objeto.toString();
if (typeof objeto === 'object') return JSON.stringify(objeto);
if (typeof objeto === tipoDeDadosPrimitivos.OBJETO) return JSON.stringify(objeto);

return objeto.toString();
}
Expand All @@ -1506,7 +1508,7 @@ export class InterpretadorBase implements InterpretadorInterface {
if (mostrarResultado) {
this.funcaoDeRetorno(this.paraTexto(resultado));
}
if (resultado || typeof resultado === 'boolean') {
if (resultado || typeof resultado === tipoDeDadosPrimitivos.BOOLEANO) {
this.resultadoInterpretador.push(this.paraTexto(resultado));
}
return resultado;
Expand Down
6 changes: 6 additions & 0 deletions fontes/tipos-de-dados/delegua.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export default {
NUMERO: 'número',
TEXTO: 'texto',
LOGICO: 'lógico',
NULO: 'nulo'
};
5 changes: 5 additions & 0 deletions fontes/tipos-de-dados/listas-delegua.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export default {
LISTA_NUMEROS: 'número[]',
LISTA_TEXTOS: 'texto[]',
LISTA_LOGICOS: 'lógico[]'
};
4 changes: 4 additions & 0 deletions fontes/tipos-de-dados/listas-primitivos.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export default {
LISTA_NUMEROS: 'number[]',
LISTA_TEXTO: 'string[]'
};
15 changes: 15 additions & 0 deletions fontes/tipos-de-dados/primitivos.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
export default {
NUMERO: 'number',
TEXTO: 'string',
BOOLEANO: 'boolean',
OBJETO: 'object',
DATA: 'Date',
NULO: null,
INDEFINIDO: undefined,
FUNCAO: 'function',
MAPA: 'Map',
PROMESSA: 'Promise',
REGEX: 'RegExp',
SIMBOLO: 'symbol',
QUALQUER: 'any',
};
Loading