Skip to content

Commit

Permalink
[delegua] analisador semântico para o método falhar
Browse files Browse the repository at this point in the history
  • Loading branch information
pablotdv committed Nov 7, 2023
1 parent 2a1fa8f commit 1910d5a
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 2 deletions.
19 changes: 17 additions & 2 deletions fontes/analisador-semantico/analisador-semantico.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
Escreva,
EscrevaMesmaLinha,
Expressao,
Falhar,
Fazer,
FuncaoDeclaracao,
Importar,
Expand Down Expand Up @@ -124,7 +125,7 @@ export class AnalisadorSemantico implements AnalisadorSemanticoInterface {
}

private verificarTipoDe(valor: Construto): Promise<any> {
if (valor instanceof Binario ) {
if (valor instanceof Binario) {
this.verificarTipoDe(valor.direita);
this.verificarTipoDe(valor.esquerda);
}
Expand All @@ -137,7 +138,21 @@ export class AnalisadorSemantico implements AnalisadorSemanticoInterface {
return Promise.resolve();
}

visitarExpressaoFalhar(expressao: any): Promise<any> {
visitarExpressaoFalhar(expressao: Falhar): Promise<any> {
return this.verificarFalhar(expressao.explicacao);
}

private verificarFalhar(valor: Construto): Promise<any> {
if (valor instanceof Binario) {
this.verificarFalhar(valor.direita);
this.verificarFalhar(valor.esquerda);
}
if (valor instanceof Agrupamento) {
return this.verificarFalhar(valor.expressao);
}
if (valor instanceof Variavel) {
return this.verificarVariavel(valor);
}
return Promise.resolve();
}

Expand Down
50 changes: 50 additions & 0 deletions testes/analisador-semantico.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -716,5 +716,55 @@ describe('Analisador semântico', () => {
});

});

describe('Cenários falhar', () => {
describe('Cenários de sucesso', () => {
it('Sucesso - falhar com variável definida com valor válido', () => {
const retornoLexador = lexador.mapear([
"const valor = 'teste' ",
"falhar 'falhar ' + valor ",
], -1);
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
const retornoAnalisadorSemantico = analisadorSemantico.analisar(retornoAvaliadorSintatico.declaracoes);
expect(retornoAnalisadorSemantico).toBeTruthy();
expect(retornoAnalisadorSemantico.erros).toHaveLength(0);
});

it('Sucesso - falhar tipo de binario com variável não definida e agrupamento', () => {
const retornoLexador = lexador.mapear([
"const a = 1 ",
"const b = 1 ",
"falhar (a + b) ",
], -1);
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
const retornoAnalisadorSemantico = analisadorSemantico.analisar(retornoAvaliadorSintatico.declaracoes);
expect(retornoAnalisadorSemantico).toBeTruthy();
expect(retornoAnalisadorSemantico.erros).toHaveLength(0);
});
});
describe('Cenários de falha', () => {
it('Falhar com variável não definida', () => {
const retornoLexador = lexador.mapear([
"falhar 'falhar ' + valor ",
], -1);
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
const retornoAnalisadorSemantico = analisadorSemantico.analisar(retornoAvaliadorSintatico.declaracoes);
expect(retornoAnalisadorSemantico).toBeTruthy();
expect(retornoAnalisadorSemantico.erros).toHaveLength(1);
});

it('Falhar tipo de binario com variável não definida e agrupamento', () => {
const retornoLexador = lexador.mapear([
"const a = 1 ",
"falhar (a + b) ",
], -1);
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
const retornoAnalisadorSemantico = analisadorSemantico.analisar(retornoAvaliadorSintatico.declaracoes);
expect(retornoAnalisadorSemantico).toBeTruthy();
expect(retornoAnalisadorSemantico.erros).toHaveLength(1);
});
});

});
});
});

0 comments on commit 1910d5a

Please sign in to comment.