From cde79a5669627f0265aa28fe667dd14aedf7cade Mon Sep 17 00:00:00 2001 From: Samuel Vaz Date: Thu, 8 Feb 2024 22:25:56 -0300 Subject: [PATCH] Melhorias em tipo e subtipos --- .../visualg/avaliador-sintatico-visualg.ts | 8 --- .../pilha-escopos-execucao-interface.ts | 2 +- .../dialetos/birl/interpretador-birl.ts | 7 +-- .../interpretador-portugol-ipt.ts | 7 +-- fontes/interpretador/interpretador-base.ts | 28 ++--------- .../interpretador/pilha-escopos-execucao.ts | 50 ++++++++++++------- 6 files changed, 40 insertions(+), 62 deletions(-) diff --git a/fontes/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.ts b/fontes/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.ts index 9394cc55..645c8c6d 100644 --- a/fontes/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.ts +++ b/fontes/avaliador-sintatico/dialetos/visualg/avaliador-sintatico-visualg.ts @@ -48,13 +48,6 @@ import { InicioAlgoritmo } from '../../../declaracoes/inicio-algoritmo'; export class AvaliadorSintaticoVisuAlg extends AvaliadorSintaticoBase { blocoPrincipalIniciado: boolean; - dicionarioTiposPrimitivos = { - caracter: 'texto', - caractere: 'texto', - inteiro: 'número', - logico: 'lógico', - real: 'número', - }; constructor() { super(); @@ -226,7 +219,6 @@ export class AvaliadorSintaticoVisuAlg extends AvaliadorSintaticoBase { Number(dadosVariaveis.simbolo.linha), this.criarVetorNDimensional(dimensoes) ), - // this.dicionarioTiposPrimitivos[simboloTipo.lexema.toLowerCase()] 'vetor' ) ); diff --git a/fontes/interfaces/pilha-escopos-execucao-interface.ts b/fontes/interfaces/pilha-escopos-execucao-interface.ts index 621f3c37..b79e2cae 100644 --- a/fontes/interfaces/pilha-escopos-execucao-interface.ts +++ b/fontes/interfaces/pilha-escopos-execucao-interface.ts @@ -7,7 +7,7 @@ import { VariavelInterface } from './variavel-interface'; export interface PilhaEscoposExecucaoInterface extends PilhaInterface { atribuirVariavel(simbolo: SimboloInterface, valor: any): void; atribuirVariavelEm(distancia: number, simbolo: SimboloInterface, valor: any): void; - definirConstante(nomeConstante: string, valor: any, subtipo?: string): void; + definirConstante(nomeConstante: string, valor: any, tipo?: string): void; definirVariavel(nomeVariavel: string, valor: any, tipo?: string): void; elementos(): number; naPosicao(posicao: number): EscopoExecucao; diff --git a/fontes/interpretador/dialetos/birl/interpretador-birl.ts b/fontes/interpretador/dialetos/birl/interpretador-birl.ts index 9e8679ec..98fb32d0 100644 --- a/fontes/interpretador/dialetos/birl/interpretador-birl.ts +++ b/fontes/interpretador/dialetos/birl/interpretador-birl.ts @@ -706,12 +706,7 @@ export class InterpretadorBirl extends InterpretadorBase implements Interpretado async visitarDeclaracaoVar(declaracao: Var): Promise { const valorFinal = await this.avaliacaoDeclaracaoVarOuConst(declaracao); - let tipo; - if (declaracao.tipo !== undefined && declaracao.tipo !== null) { - tipo = declaracao.tipo; - } - - this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolo.lexema, valorFinal, tipo); + this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolo.lexema, valorFinal, declaracao.tipo); return null; } diff --git a/fontes/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.ts b/fontes/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.ts index 89bb0b5a..39f27987 100644 --- a/fontes/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.ts +++ b/fontes/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.ts @@ -448,12 +448,7 @@ export class InterpretadorPortugolIpt implements InterpretadorInterface { async visitarDeclaracaoVar(declaracao: Var): Promise { const valorFinal = await this.avaliacaoDeclaracaoVar(declaracao); - let tipo; - if (declaracao.tipo !== undefined && declaracao.tipo !== null) { - tipo = declaracao.tipo; - } - - this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolo.lexema, valorFinal, tipo); + this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolo.lexema, valorFinal, declaracao.tipo); return null; } diff --git a/fontes/interpretador/interpretador-base.ts b/fontes/interpretador/interpretador-base.ts index de516fb4..7e44ae68 100644 --- a/fontes/interpretador/interpretador-base.ts +++ b/fontes/interpretador/interpretador-base.ts @@ -1172,12 +1172,7 @@ export class InterpretadorBase implements InterpretadorInterface { async visitarDeclaracaoConst(declaracao: Const): Promise { const valorFinal = await this.avaliacaoDeclaracaoVarOuConst(declaracao); - let subtipo; - if (declaracao.tipo !== undefined) { - subtipo = declaracao.tipo; - } - - this.pilhaEscoposExecucao.definirConstante(declaracao.simbolo.lexema, valorFinal, subtipo); + this.pilhaEscoposExecucao.definirConstante(declaracao.simbolo.lexema, valorFinal, declaracao.tipo); return null; } @@ -1191,12 +1186,7 @@ export class InterpretadorBase implements InterpretadorInterface { const valoresFinais: any[] = await this.avaliacaoDeclaracaoVarOuConst(declaracao); for (let [indice, valor] of valoresFinais.entries()) { - let subtipo; - if (declaracao.tipo !== undefined) { - subtipo = declaracao.tipo; - } - - this.pilhaEscoposExecucao.definirConstante(declaracao.simbolos[indice].lexema, valor, subtipo); + this.pilhaEscoposExecucao.definirConstante(declaracao.simbolos[indice].lexema, valor, declaracao.tipo); } return null; @@ -1569,12 +1559,7 @@ export class InterpretadorBase implements InterpretadorInterface { async visitarDeclaracaoVar(declaracao: Var): Promise { const valorFinal = await this.avaliacaoDeclaracaoVarOuConst(declaracao); - let tipo; - if (declaracao.tipo !== undefined && declaracao.tipo !== null) { - tipo = declaracao.tipo; - } - - this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolo.lexema, valorFinal, tipo); + this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolo.lexema, valorFinal, declaracao.tipo); return null; } @@ -1588,12 +1573,7 @@ export class InterpretadorBase implements InterpretadorInterface { const valoresFinais: any[] = await this.avaliacaoDeclaracaoVarOuConst(declaracao); for (let [indice, valor] of valoresFinais.entries()) { - let tipo; - if (declaracao.tipo !== undefined) { - tipo = declaracao.tipo; - } - - this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolos[indice].lexema, valor, tipo); + this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolos[indice].lexema, valor, declaracao.tipo); } return null; diff --git a/fontes/interpretador/pilha-escopos-execucao.ts b/fontes/interpretador/pilha-escopos-execucao.ts index da878498..3970b7a1 100644 --- a/fontes/interpretador/pilha-escopos-execucao.ts +++ b/fontes/interpretador/pilha-escopos-execucao.ts @@ -5,6 +5,7 @@ import { EscopoExecucao } from '../interfaces/escopo-execucao'; import { PilhaEscoposExecucaoInterface } from '../interfaces/pilha-escopos-execucao-interface'; import { Simbolo } from '../lexador'; import { inferirTipoVariavel } from './inferenciador'; +import tipoDeDadosDelegua from '../tipos-de-dados/delegua'; export class PilhaEscoposExecucao implements PilhaEscoposExecucaoInterface { pilha: EscopoExecucao[]; @@ -54,37 +55,43 @@ export class PilhaEscoposExecucao implements PilhaEscoposExecucaoInterface { } } - definirConstante(nomeConstante: string, valor: any, subtipo?: string): void { + definirConstante(nomeConstante: string, valor: any, tipo?: string): void { const constante = this.pilha[this.pilha.length - 1].ambiente.valores[nomeConstante]; - let tipo; - if (subtipo !== null && subtipo !== undefined) { - tipo = subtipo; + + let tipoConstante; + if (constante && constante.hasOwnProperty('tipo')) { + tipoConstante = constante.tipo + } else if (tipo) { + tipoConstante = tipo } else { - tipo = constante && constante.hasOwnProperty('tipo') ? constante.tipo : inferirTipoVariavel(valor); + tipoConstante = inferirTipoVariavel(valor); } let elementoAlvo: VariavelInterface = { valor: this.converterValor(tipo, valor), - tipo: tipo, + tipo: tipoConstante, subtipo: undefined, imutavel: true, }; - if (subtipo !== undefined) { + if ([tipoDeDadosDelegua.VETOR, tipoDeDadosDelegua.TUPLA].includes(tipoConstante)) { + let subtipo = ''; + if (valor instanceof Array) { + // TODO: verificar tipo lógico e outros possíveis tipos + let numeros = valor.some(v => typeof v === 'number') + let textos = valor.some(v => typeof v === 'string') + if (numeros && textos) subtipo = tipoDeDadosDelegua.QUALQUER; + else if (numeros) subtipo = tipoDeDadosDelegua.NUMERO; + else subtipo = tipoDeDadosDelegua.TEXTO; + } (elementoAlvo.subtipo as any) = subtipo; } this.pilha[this.pilha.length - 1].ambiente.valores[nomeConstante] = elementoAlvo; } - definirVariavel(nomeVariavel: string, valor: any, tipo?: string, imutavel: boolean = false) { + definirVariavel(nomeVariavel: string, valor: any, tipo?: string) { const variavel = this.pilha[this.pilha.length - 1].ambiente.valores[nomeVariavel]; - // TODO: Dois testes no VisuAlg falham por causa disso. - /* if (subtipo !== null && subtipo !== undefined) { - tipo = subtipo; - } else { - tipo = variavel && variavel.hasOwnProperty('tipo') ? variavel.tipo : inferirTipoVariavel(valor); - } */ let tipoVariavel; if (variavel && variavel.hasOwnProperty('tipo')) { @@ -99,11 +106,20 @@ export class PilhaEscoposExecucao implements PilhaEscoposExecucaoInterface { valor: this.converterValor(tipo, valor), tipo: tipoVariavel, subtipo: undefined, - imutavel, + imutavel: false, }; - if (tipo !== undefined) { - (elementoAlvo.subtipo as any) = inferirTipoVariavel(valor); + if ([tipoDeDadosDelegua.VETOR, tipoDeDadosDelegua.TUPLA].includes(tipoVariavel)) { + let subtipo = ''; + if (valor instanceof Array) { + // TODO: verificar tipo lógico e outros possíveis tipos + let numeros = valor.some(v => typeof v === 'number') + let textos = valor.some(v => typeof v === 'string') + if (numeros && textos) subtipo = tipoDeDadosDelegua.QUALQUER; + else if (numeros) subtipo = tipoDeDadosDelegua.NUMERO; + else subtipo = tipoDeDadosDelegua.TEXTO; + } + (elementoAlvo.subtipo as any) = subtipo; } this.pilha[this.pilha.length - 1].ambiente.valores[nomeVariavel] = elementoAlvo;