Skip to content

Commit

Permalink
Resolve problema na declaração de escreva sem parâmetros (#667)
Browse files Browse the repository at this point in the history
  • Loading branch information
samuelrvg authored Feb 25, 2024
1 parent 0daa287 commit f41e9b5
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 4 deletions.
7 changes: 7 additions & 0 deletions fontes/analisador-semantico/analisador-semantico.ts
Original file line number Diff line number Diff line change
Expand Up @@ -435,6 +435,13 @@ export class AnalisadorSemantico extends AnalisadorSemanticoBase {
}

visitarDeclaracaoEscreva(declaracao: Escreva) {
if (declaracao.argumentos.length === 0) {
const { linha, hashArquivo } = declaracao;
const simbolo: SimboloInterface<''> = { literal: '', tipo:'', lexema: 'escreva', linha, hashArquivo }
this.erro(simbolo, `É preciso ter um ou mais parametros para 'escreva(...)'`);
return Promise.resolve();
}

const variaveis = declaracao.argumentos.filter((arg) => arg instanceof Variavel);

for (let variavel of variaveis as Variavel[]) {
Expand Down
9 changes: 6 additions & 3 deletions fontes/avaliador-sintatico/avaliador-sintatico.ts
Original file line number Diff line number Diff line change
Expand Up @@ -622,9 +622,12 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface<SimboloIn

const argumentos: Construto[] = [];

do {
argumentos.push(this.expressao());
} while (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.VIRGULA));
if (!this.verificarTipoSimboloAtual(tiposDeSimbolos.PARENTESE_DIREITO)) {
do {
argumentos.push(this.expressao());
} while (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.VIRGULA));
}


this.consumir(tiposDeSimbolos.PARENTESE_DIREITO, "Esperado ')' após os valores em escreva.");

Expand Down
14 changes: 13 additions & 1 deletion testes/analisador-semantico.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -841,7 +841,7 @@ describe('Analisador semântico', () => {
expect(retornoAnalisadorSemantico.diagnosticos.filter(item => item.severidade === DiagnosticoSeveridade.AVISO)).toHaveLength(1);
});

it('Sucesso - variável tipo texto não inicializada', () => {
it('Aviso - variável tipo texto não inicializada', () => {
const retornoLexador = lexador.mapear([
"classe Teste {}",
"var teste: Texto;",
Expand All @@ -853,6 +853,18 @@ describe('Analisador semântico', () => {
expect(retornoAnalisadorSemantico.diagnosticos).toHaveLength(1);
expect(retornoAnalisadorSemantico.diagnosticos.filter(item => item.severidade === DiagnosticoSeveridade.AVISO)).toHaveLength(1);
});

it('Erro - escreva sem parametro', () => {
const retornoLexador = lexador.mapear([
"escreva(); ",
], -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.ERRO)).toHaveLength(1);
expect(retornoAnalisadorSemantico.diagnosticos[0].mensagem).toBe('É preciso ter um ou mais parametros para \'escreva(...)\'');
});
});
});
});
Expand Down

0 comments on commit f41e9b5

Please sign in to comment.