Skip to content

Commit

Permalink
Permitindo retorno dicionario literal (#654)
Browse files Browse the repository at this point in the history
  • Loading branch information
Aristidescosta authored Feb 18, 2024
1 parent db0d1bc commit f6e73f3
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 10 deletions.
11 changes: 6 additions & 5 deletions fontes/avaliador-sintatico/avaliador-sintatico.ts
Original file line number Diff line number Diff line change
Expand Up @@ -819,6 +819,7 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface<SimboloIn
tiposDeSimbolos.SUPER,
tiposDeSimbolos.TEXTO,
tiposDeSimbolos.VERDADEIRO,
tiposDeSimbolos.CHAVE_ESQUERDA
].includes(this.simbolos[this.atual].tipo)
) {
valor = this.expressao();
Expand Down Expand Up @@ -1091,13 +1092,13 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface<SimboloIn
this.consumir(tiposDeSimbolos.CHAVE_ESQUERDA, "Esperado chave esquerda para abertura de bloco em declaração 'tendo'.");
const blocoCorpo = this.blocoEscopo();
return new TendoComo(
simboloTendo.linha,
simboloTendo.hashArquivo,
simboloNomeVariavel,
expressaoInicializacao,
simboloTendo.linha,
simboloTendo.hashArquivo,
simboloNomeVariavel,
expressaoInicializacao,
new Bloco(
simboloTendo.linha,
simboloTendo.hashArquivo,
simboloTendo.hashArquivo,
blocoCorpo
)
);
Expand Down
4 changes: 2 additions & 2 deletions fontes/interpretador/interpretador-base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -528,7 +528,7 @@ export class InterpretadorBase implements InterpretadorInterface {
return Math.pow(valorEsquerdo, valorDireito);

case tiposDeSimbolos.MAIOR:
if (tipoEsquerdo === tipoDeDadosDelegua.NUMERO && tipoDireito === tipoDeDadosDelegua.NUMERO) {
if ((tipoEsquerdo === tipoDeDadosDelegua.NUMERO) || (tipoEsquerdo === tipoDeDadosDelegua.NÚMERO) && (tipoDireito === tipoDeDadosDelegua.NUMERO) || (tipoDireito === tipoDeDadosDelegua.NÚMERO)) {
return Number(valorEsquerdo) > Number(valorDireito);
}

Expand All @@ -539,7 +539,7 @@ export class InterpretadorBase implements InterpretadorInterface {
return Number(valorEsquerdo) >= Number(valorDireito);

case tiposDeSimbolos.MENOR:
if (tipoEsquerdo === tipoDeDadosDelegua.NUMERO && tipoDireito === tipoDeDadosDelegua.NUMERO) {
if ((tipoEsquerdo === tipoDeDadosDelegua.NUMERO) || (tipoEsquerdo === tipoDeDadosDelegua.NÚMERO) && (tipoDireito === tipoDeDadosDelegua.NUMERO) || (tipoDireito === tipoDeDadosDelegua.NÚMERO)) {
return Number(valorEsquerdo) < Number(valorDireito);
}

Expand Down
21 changes: 18 additions & 3 deletions testes/analisador-semantico.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,21 @@ describe('Analisador semântico', () => {
expect(retornoAnalisadorSemantico.diagnosticos[0].mensagem).toBe('A função não pode ter nenhum tipo de retorno.');
});

it('Função retorna Dicionario literal', async () => {
const retornoLexador = lexador.mapear(
[
'funcao executar() {',
' retorna { "chave": 100 }',
'}',
'escreva(executar())',
],
-1
);
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);

expect(retornoAvaliadorSintatico.erros.length).toBeGreaterThanOrEqual(0);
});

it('Não retornando o tipo que a função definiu - texto', () => {
const retornoLexador = lexador.mapear([
"funcao executar(valor1, valor2): texto {",
Expand Down Expand Up @@ -769,10 +784,10 @@ describe('Analisador semântico', () => {
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
const retornoAnalisadorSemantico = analisadorSemantico.analisar(retornoAvaliadorSintatico.declaracoes);
expect(retornoAnalisadorSemantico).toBeTruthy();
expect(retornoAnalisadorSemantico.diagnosticos.filter(item=> item.severidade === DiagnosticoSeveridade.AVISO)).toHaveLength(1);
expect(retornoAnalisadorSemantico.diagnosticos.filter(item => item.severidade === DiagnosticoSeveridade.AVISO)).toHaveLength(1);
expect(retornoAnalisadorSemantico.diagnosticos).toHaveLength(1);
});
});
});
});

describe('Cenários variáveis não inicializada', () => {
Expand Down Expand Up @@ -840,7 +855,7 @@ describe('Analisador semântico', () => {
expect(retornoAnalisadorSemantico.diagnosticos).toHaveLength(1);
expect(retornoAnalisadorSemantico.diagnosticos.filter(item => item.severidade === DiagnosticoSeveridade.AVISO)).toHaveLength(1);
});

it('Sucesso - variável tipo texto não inicializada', () => {
const retornoLexador = lexador.mapear([
"classe Teste {}",
Expand Down

0 comments on commit f6e73f3

Please sign in to comment.