Skip to content

Commit

Permalink
Merge pull request #552 from DesignLiquido/analisador-semantico-aviso…
Browse files Browse the repository at this point in the history
…-variavel

[delegua] analisador semântico - aviso variável não inicializada
  • Loading branch information
samuelrvg authored Nov 9, 2023
2 parents 6eb8cfe + 45a8f0f commit ce54a8d
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 1 deletion.
8 changes: 7 additions & 1 deletion fontes/analisador-semantico/analisador-semantico.ts
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,10 @@ export class AnalisadorSemantico implements AnalisadorSemanticoInterface {
if (valor.imutavel) {
this.erro(expressao.simbolo, `Constante ${expressao.simbolo.lexema} não pode ser modificada.`);
return Promise.resolve();
} else {
if (this.variaveis[expressao.simbolo.lexema]) {
this.variaveis[expressao.simbolo.lexema].valor = expressao.valor;
}
}
}

Expand Down Expand Up @@ -475,6 +479,9 @@ export class AnalisadorSemantico implements AnalisadorSemanticoInterface {
if (!this.variaveis[variavel.simbolo.lexema]) {
this.erro(variavel.simbolo, `Variável '${variavel.simbolo.lexema}' não existe.`)
}
if (this.variaveis[variavel.simbolo.lexema]?.valor === undefined) {
this.aviso(variavel.simbolo, `Variável '${variavel.simbolo.lexema}' não foi inicializada.`)
}
}

return Promise.resolve();
Expand Down Expand Up @@ -509,7 +516,6 @@ export class AnalisadorSemantico implements AnalisadorSemanticoInterface {
}

virificarTipoDeclaracaoConst(declaracao: Const): Promise<any> {

if (declaracao.inicializador instanceof Binario) {
// verificar tipos iguais no lado esquerdo e direito
const binario = declaracao.inicializador as Binario;
Expand Down
81 changes: 81 additions & 0 deletions testes/analisador-semantico.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -792,5 +792,86 @@ describe('Analisador semântico', () => {
});
});
});

describe('Cenários variáveis não inicializada', () => {
describe('Cenários de sucesso', () => {
it('Sucesso - variável de classe inicializada na declaração', () => {
const retornoLexador = lexador.mapear([
"classe Teste {}",
"var teste: Teste = Teste();",
"escreva(teste); ",
], -1);
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
const retornoAnalisadorSemantico = analisadorSemantico.analisar(retornoAvaliadorSintatico.declaracoes);
expect(retornoAnalisadorSemantico).toBeTruthy();
expect(retornoAnalisadorSemantico.diagnosticos).toHaveLength(0);
});

it('Sucesso - variável de classe inicializada após declaração', () => {
const retornoLexador = lexador.mapear([
"classe Teste {}",
"var teste: Teste;",
"teste = Teste();",
"escreva(teste); ",
], -1);
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
const retornoAnalisadorSemantico = analisadorSemantico.analisar(retornoAvaliadorSintatico.declaracoes);
expect(retornoAnalisadorSemantico).toBeTruthy();
expect(retornoAnalisadorSemantico.diagnosticos).toHaveLength(0);
});

it('Sucesso - variável tipo texto inicializada na declaração', () => {
const retornoLexador = lexador.mapear([
"classe Teste {}",
"var teste: Texto = 'abc';",
"escreva(teste); ",
], -1);
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
const retornoAnalisadorSemantico = analisadorSemantico.analisar(retornoAvaliadorSintatico.declaracoes);
expect(retornoAnalisadorSemantico).toBeTruthy();
expect(retornoAnalisadorSemantico.diagnosticos).toHaveLength(0);
});

it('Sucesso - variável tipo texto inicializada após declaração', () => {
const retornoLexador = lexador.mapear([
"classe Teste {}",
"var teste: Texto;",
"teste = 'abc';",
"escreva(teste); ",
], -1);
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
const retornoAnalisadorSemantico = analisadorSemantico.analisar(retornoAvaliadorSintatico.declaracoes);
expect(retornoAnalisadorSemantico).toBeTruthy();
expect(retornoAnalisadorSemantico.diagnosticos).toHaveLength(0);
});
});
describe('Cenários de falha', () => {
it('Aviso - variável de classe não inicializada', () => {
const retornoLexador = lexador.mapear([
"classe Teste {}",
"var teste: Teste;",
"escreva(teste); ",
], -1);
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
const retornoAnalisadorSemantico = analisadorSemantico.analisar(retornoAvaliadorSintatico.declaracoes);
expect(retornoAnalisadorSemantico).toBeTruthy();
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 {}",
"var teste: Texto;",
"escreva(teste); ",
], -1);
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
const retornoAnalisadorSemantico = analisadorSemantico.analisar(retornoAvaliadorSintatico.declaracoes);
expect(retornoAnalisadorSemantico).toBeTruthy();
expect(retornoAnalisadorSemantico.diagnosticos).toHaveLength(1);
expect(retornoAnalisadorSemantico.diagnosticos.filter(item => item.severidade === DiagnosticoSeveridade.AVISO)).toHaveLength(1);
});
});
});
});
});

0 comments on commit ce54a8d

Please sign in to comment.