From f41e9b59eaccc463efe9c82d611c2fb4f2a7ffea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20Renan=20Gon=C3=A7alves=20Vaz?= Date: Sun, 25 Feb 2024 12:42:34 -0300 Subject: [PATCH] =?UTF-8?q?Resolve=20problema=20na=20declara=C3=A7=C3=A3o?= =?UTF-8?q?=20de=20`escreva`=20sem=20par=C3=A2metros=20(#667)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../analisador-semantico/analisador-semantico.ts | 7 +++++++ fontes/avaliador-sintatico/avaliador-sintatico.ts | 9 ++++++--- testes/analisador-semantico.test.ts | 14 +++++++++++++- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/fontes/analisador-semantico/analisador-semantico.ts b/fontes/analisador-semantico/analisador-semantico.ts index a0cad4ee..602a3340 100644 --- a/fontes/analisador-semantico/analisador-semantico.ts +++ b/fontes/analisador-semantico/analisador-semantico.ts @@ -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[]) { diff --git a/fontes/avaliador-sintatico/avaliador-sintatico.ts b/fontes/avaliador-sintatico/avaliador-sintatico.ts index a4838b98..de99d509 100644 --- a/fontes/avaliador-sintatico/avaliador-sintatico.ts +++ b/fontes/avaliador-sintatico/avaliador-sintatico.ts @@ -622,9 +622,12 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface { 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;", @@ -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(...)\''); + }); }); }); });