From 766e88538c01ce337bf4eddae1a07ed6700a73c0 Mon Sep 17 00:00:00 2001 From: Samuel Vaz Date: Sun, 25 Feb 2024 00:22:27 -0300 Subject: [PATCH 1/2] =?UTF-8?q?#643=20resolve=20problema=20na=20declara?= =?UTF-8?q?=C3=A7=C3=A3o=20de=20escreva=20sem=20parametros.?= 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..39392041 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: '', 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(...)\''); + }); }); }); }); From ca89a3f524d9515309cf57d507d8733267317c16 Mon Sep 17 00:00:00 2001 From: Samuel Vaz Date: Sun, 25 Feb 2024 00:47:17 -0300 Subject: [PATCH 2/2] lexema escreva --- fontes/analisador-semantico/analisador-semantico.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fontes/analisador-semantico/analisador-semantico.ts b/fontes/analisador-semantico/analisador-semantico.ts index 39392041..602a3340 100644 --- a/fontes/analisador-semantico/analisador-semantico.ts +++ b/fontes/analisador-semantico/analisador-semantico.ts @@ -437,7 +437,7 @@ export class AnalisadorSemantico extends AnalisadorSemanticoBase { visitarDeclaracaoEscreva(declaracao: Escreva) { if (declaracao.argumentos.length === 0) { const { linha, hashArquivo } = declaracao; - const simbolo: SimboloInterface<''> = { literal: '', tipo:'', lexema: '', linha, hashArquivo } + const simbolo: SimboloInterface<''> = { literal: '', tipo:'', lexema: 'escreva', linha, hashArquivo } this.erro(simbolo, `É preciso ter um ou mais parametros para 'escreva(...)'`); return Promise.resolve(); }