Skip to content

Commit

Permalink
Melhorias em tipo e subtipos
Browse files Browse the repository at this point in the history
  • Loading branch information
samuelrvg committed Feb 9, 2024
1 parent 177314f commit cde79a5
Show file tree
Hide file tree
Showing 6 changed files with 40 additions and 62 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -226,7 +219,6 @@ export class AvaliadorSintaticoVisuAlg extends AvaliadorSintaticoBase {
Number(dadosVariaveis.simbolo.linha),
this.criarVetorNDimensional(dimensoes)
),
// this.dicionarioTiposPrimitivos[simboloTipo.lexema.toLowerCase()]
'vetor'
)
);
Expand Down
2 changes: 1 addition & 1 deletion fontes/interfaces/pilha-escopos-execucao-interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { VariavelInterface } from './variavel-interface';
export interface PilhaEscoposExecucaoInterface extends PilhaInterface<EscopoExecucao> {
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;
Expand Down
7 changes: 1 addition & 6 deletions fontes/interpretador/dialetos/birl/interpretador-birl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -706,12 +706,7 @@ export class InterpretadorBirl extends InterpretadorBase implements Interpretado
async visitarDeclaracaoVar(declaracao: Var): Promise<any> {
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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -448,12 +448,7 @@ export class InterpretadorPortugolIpt implements InterpretadorInterface {
async visitarDeclaracaoVar(declaracao: Var): Promise<any> {
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;
}
Expand Down
28 changes: 4 additions & 24 deletions fontes/interpretador/interpretador-base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1172,12 +1172,7 @@ export class InterpretadorBase implements InterpretadorInterface {
async visitarDeclaracaoConst(declaracao: Const): Promise<any> {
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;
}
Expand All @@ -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;
Expand Down Expand Up @@ -1569,12 +1559,7 @@ export class InterpretadorBase implements InterpretadorInterface {
async visitarDeclaracaoVar(declaracao: Var): Promise<any> {
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;
}
Expand All @@ -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;
Expand Down
50 changes: 33 additions & 17 deletions fontes/interpretador/pilha-escopos-execucao.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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[];
Expand Down Expand Up @@ -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')) {
Expand All @@ -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;
Expand Down

0 comments on commit cde79a5

Please sign in to comment.