From e08188a6d6ce8cc7f5ddf0c9489f49b77c9d8a8c Mon Sep 17 00:00:00 2001 From: Aristidescosta Date: Thu, 23 Nov 2023 13:01:40 +0100 Subject: [PATCH 1/5] feat: adicionando as constantes de tipos de dados --- fontes/tipos-de-dados/comum.ts | 17 +++++++++++++++++ fontes/tipos-de-dados/listas.ts | 4 ++++ 2 files changed, 21 insertions(+) create mode 100644 fontes/tipos-de-dados/comum.ts create mode 100644 fontes/tipos-de-dados/listas.ts diff --git a/fontes/tipos-de-dados/comum.ts b/fontes/tipos-de-dados/comum.ts new file mode 100644 index 00000000..f13f2ae7 --- /dev/null +++ b/fontes/tipos-de-dados/comum.ts @@ -0,0 +1,17 @@ +export default { + NUMERO: 'number', + TEXTO: 'string', + BOOLEANO: 'boolean', + OBJETO: 'object', + ARRAY_NUMEROS: 'number[]', + ARRAY_TEXTO: 'string[]', + DATA: 'Date', + NULO: 'null', + INDEFINIDO: 'undefined', + FUNCAO: 'function', + MAPA: 'Map', + PROMESSA: 'Promise', + REGEX: 'RegExp', + SIMBOLO: 'symbol', + QUALQUER: 'any', +}; \ No newline at end of file diff --git a/fontes/tipos-de-dados/listas.ts b/fontes/tipos-de-dados/listas.ts new file mode 100644 index 00000000..77a660cb --- /dev/null +++ b/fontes/tipos-de-dados/listas.ts @@ -0,0 +1,4 @@ +export default { + LISTA_NUMEROS: 'number[]', + LISTA_TEXTO: 'string[]', +}; \ No newline at end of file From 072305cd1577c6b1e1f2277ad754ae4c59dccc16 Mon Sep 17 00:00:00 2001 From: Aristidescosta Date: Thu, 23 Nov 2023 13:17:56 +0100 Subject: [PATCH 2/5] refactor: removendo tipos repetidos --- fontes/tipos-de-dados/comum.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/fontes/tipos-de-dados/comum.ts b/fontes/tipos-de-dados/comum.ts index f13f2ae7..64342e75 100644 --- a/fontes/tipos-de-dados/comum.ts +++ b/fontes/tipos-de-dados/comum.ts @@ -3,8 +3,6 @@ export default { TEXTO: 'string', BOOLEANO: 'boolean', OBJETO: 'object', - ARRAY_NUMEROS: 'number[]', - ARRAY_TEXTO: 'string[]', DATA: 'Date', NULO: 'null', INDEFINIDO: 'undefined', From 61a144ba77cf17bcbbc3e8775f0274e6c17a4224 Mon Sep 17 00:00:00 2001 From: Aristidescosta Date: Thu, 23 Nov 2023 13:56:07 +0100 Subject: [PATCH 3/5] refactor: adicionando tipagem para vetores --- fontes/tipos-de-dados/comum.ts | 6 ++++-- fontes/tipos-de-dados/listas.ts | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/fontes/tipos-de-dados/comum.ts b/fontes/tipos-de-dados/comum.ts index 64342e75..c753dd93 100644 --- a/fontes/tipos-de-dados/comum.ts +++ b/fontes/tipos-de-dados/comum.ts @@ -1,6 +1,6 @@ export default { NUMERO: 'number', - TEXTO: 'string', + TEXTO: 'string' || 'texto', BOOLEANO: 'boolean', OBJETO: 'object', DATA: 'Date', @@ -11,5 +11,7 @@ export default { PROMESSA: 'Promise', REGEX: 'RegExp', SIMBOLO: 'symbol', - QUALQUER: 'any', + QUALQUER: 'any' || 'qualquer', + INTEIRO: 'inteiro', + VETOR: 'vetor' }; \ No newline at end of file diff --git a/fontes/tipos-de-dados/listas.ts b/fontes/tipos-de-dados/listas.ts index 77a660cb..34ccf64c 100644 --- a/fontes/tipos-de-dados/listas.ts +++ b/fontes/tipos-de-dados/listas.ts @@ -1,4 +1,5 @@ export default { LISTA_NUMEROS: 'number[]', - LISTA_TEXTO: 'string[]', + LISTA_TEXTO: 'string[]' || 'texto[]', + LISTA_INTEIRO: 'inteiro[]', }; \ No newline at end of file From 084bf03333a21c64af4f3958dcf298d5c648339f Mon Sep 17 00:00:00 2001 From: Aristidescosta Date: Thu, 23 Nov 2023 14:51:38 +0100 Subject: [PATCH 4/5] refactor: reajustando os tipos de dados --- fontes/tipos-de-dados/delegua.ts | 5 +++++ fontes/tipos-de-dados/listas-delegua.ts | 5 +++++ fontes/tipos-de-dados/listas-primitivos.ts | 4 ++++ fontes/tipos-de-dados/listas.ts | 5 ----- fontes/tipos-de-dados/{comum.ts => primitivos.ts} | 10 ++++------ 5 files changed, 18 insertions(+), 11 deletions(-) create mode 100644 fontes/tipos-de-dados/delegua.ts create mode 100644 fontes/tipos-de-dados/listas-delegua.ts create mode 100644 fontes/tipos-de-dados/listas-primitivos.ts delete mode 100644 fontes/tipos-de-dados/listas.ts rename fontes/tipos-de-dados/{comum.ts => primitivos.ts} (57%) diff --git a/fontes/tipos-de-dados/delegua.ts b/fontes/tipos-de-dados/delegua.ts new file mode 100644 index 00000000..6dcf8c4e --- /dev/null +++ b/fontes/tipos-de-dados/delegua.ts @@ -0,0 +1,5 @@ +export default { + NUMERO: 'número', + TEXTO: 'texto', + BOOLEANO: 'lógico', +}; \ No newline at end of file diff --git a/fontes/tipos-de-dados/listas-delegua.ts b/fontes/tipos-de-dados/listas-delegua.ts new file mode 100644 index 00000000..937aa610 --- /dev/null +++ b/fontes/tipos-de-dados/listas-delegua.ts @@ -0,0 +1,5 @@ +export default { + LISTA_NUMEROS: 'número[]', + LISTA_TEXTOS: 'texto[]', + LISTA_LOGICOS: 'lógico[]' +}; \ No newline at end of file diff --git a/fontes/tipos-de-dados/listas-primitivos.ts b/fontes/tipos-de-dados/listas-primitivos.ts new file mode 100644 index 00000000..0da08af5 --- /dev/null +++ b/fontes/tipos-de-dados/listas-primitivos.ts @@ -0,0 +1,4 @@ +export default { + LISTA_NUMEROS: 'number[]', + LISTA_TEXTO: 'string[]' +}; \ No newline at end of file diff --git a/fontes/tipos-de-dados/listas.ts b/fontes/tipos-de-dados/listas.ts deleted file mode 100644 index 34ccf64c..00000000 --- a/fontes/tipos-de-dados/listas.ts +++ /dev/null @@ -1,5 +0,0 @@ -export default { - LISTA_NUMEROS: 'number[]', - LISTA_TEXTO: 'string[]' || 'texto[]', - LISTA_INTEIRO: 'inteiro[]', -}; \ No newline at end of file diff --git a/fontes/tipos-de-dados/comum.ts b/fontes/tipos-de-dados/primitivos.ts similarity index 57% rename from fontes/tipos-de-dados/comum.ts rename to fontes/tipos-de-dados/primitivos.ts index c753dd93..b0169779 100644 --- a/fontes/tipos-de-dados/comum.ts +++ b/fontes/tipos-de-dados/primitivos.ts @@ -1,17 +1,15 @@ export default { NUMERO: 'number', - TEXTO: 'string' || 'texto', + TEXTO: 'string', BOOLEANO: 'boolean', OBJETO: 'object', DATA: 'Date', - NULO: 'null', - INDEFINIDO: 'undefined', + NULO: null, + INDEFINIDO: undefined, FUNCAO: 'function', MAPA: 'Map', PROMESSA: 'Promise', REGEX: 'RegExp', SIMBOLO: 'symbol', - QUALQUER: 'any' || 'qualquer', - INTEIRO: 'inteiro', - VETOR: 'vetor' + QUALQUER: 'any', }; \ No newline at end of file From ac79343cb35c6461cde96cf23116458431544fb0 Mon Sep 17 00:00:00 2001 From: Aristidescosta Date: Thu, 23 Nov 2023 14:59:50 +0100 Subject: [PATCH 5/5] refactor: implementado o uso dos tipos de dados --- fontes/interpretador/interpretador-base.ts | 52 +++++++++++----------- fontes/tipos-de-dados/delegua.ts | 3 +- 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/fontes/interpretador/interpretador-base.ts b/fontes/interpretador/interpretador-base.ts index fba573c0..f961ed0f 100644 --- a/fontes/interpretador/interpretador-base.ts +++ b/fontes/interpretador/interpretador-base.ts @@ -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_), @@ -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( @@ -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( @@ -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); } @@ -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)); } @@ -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 }); } @@ -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); } @@ -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); @@ -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); @@ -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); @@ -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)); } @@ -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); @@ -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; @@ -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( @@ -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]; } @@ -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); @@ -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'; } @@ -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(); } @@ -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; diff --git a/fontes/tipos-de-dados/delegua.ts b/fontes/tipos-de-dados/delegua.ts index 6dcf8c4e..978c7396 100644 --- a/fontes/tipos-de-dados/delegua.ts +++ b/fontes/tipos-de-dados/delegua.ts @@ -1,5 +1,6 @@ export default { NUMERO: 'número', TEXTO: 'texto', - BOOLEANO: 'lógico', + LOGICO: 'lógico', + NULO: 'nulo' }; \ No newline at end of file