Skip to content

Commit

Permalink
🐛 corrigindo funcao inicio inexistente (fix #715) (#798)
Browse files Browse the repository at this point in the history
* 🐛 corrigindo funcao inicio inexistente (fix #715)

* adicionando testes

* marcando codigo do usuario

* Excecao para erro de funcao inicial
  • Loading branch information
AdsonEsteves committed Oct 29, 2020
1 parent 2a12511 commit 3a7f1b2
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public ResultadoAnalise analisar(String codigo)
{
ObservadorAnaliseAlgoritmo observadorAnaliseAlgoritmo = new ObservadorAnaliseAlgoritmo();
AnalisadorSintatico analisadorSintatico = new AnalisadorSintatico();
AnalisadorSemantico analisadorSemantico = new AnalisadorSemantico();
AnalisadorSemantico analisadorSemantico = new AnalisadorSemantico(codigo);
AnalisadorStringInvalida asi = new AnalisadorStringInvalida();

analisadorSintatico.adicionarObservador(observadorAnaliseAlgoritmo);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
public final class AnalisadorSemantico implements VisitanteASA
{
private static final List<String> FUNCOES_RESERVADAS = getLista();

private String codigoFonte;

private final Memoria memoria;
private final List<ObservadorAnaliseSemantica> observadores;
Expand All @@ -61,8 +63,9 @@ public final class AnalisadorSemantico implements VisitanteASA
private int totalVetoresDeclarados = 0;
private int totalMatrizesDeclaradas = 0;

public AnalisadorSemantico()
public AnalisadorSemantico(String codigoFonte)
{
this.codigoFonte = codigoFonte;
memoria = new Memoria();
metaDadosBibliotecas = new TreeMap<>();
observadores = new ArrayList<>();
Expand Down Expand Up @@ -195,14 +198,24 @@ public Object visitar(ASAPrograma asap) throws ExcecaoVisitaASA
{

List<NoDeclaracao> declaracoes = asap.getListaDeclaracoesGlobais(true);
boolean possuiFuncaoInicio = false;

// itera somente nas declarações de funções para colocá-las na tabela de símbolos
for (NoDeclaracao declaracao : declaracoes) {
if (declaracao instanceof NoDeclaracaoFuncao) {
if(((NoDeclaracaoFuncao)declaracao).getNome().equals("inicio"))
{
possuiFuncaoInicio = true;
}
registraFuncaoNaTabelaDeSimbolos((NoDeclaracaoFuncao)declaracao);
}
}

if(!possuiFuncaoInicio)
{
notificarErroSemantico(new ErroFuncaoInicioInexistente(codigoFonte.length()));
}

for (NoDeclaracao declaracao : declaracoes) {
declaracao.aceitar(this);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package br.univali.portugol.nucleo.analise.semantica.erros;

import br.univali.portugol.nucleo.asa.NoDeclaracaoFuncao;
import br.univali.portugol.nucleo.asa.TrechoCodigoFonte;
import br.univali.portugol.nucleo.mensagens.ErroSemantico;

/**
*
* @author noschang
*/
public class ErroFuncaoInicioInexistente extends ErroSemantico
{

private String codigo = "ErroSemantico.ErroFuncaoInicioInexistente";

public ErroFuncaoInicioInexistente(int tamanhoTotalCodigo)
{
super(montarTrechoCodigoFonte(tamanhoTotalCodigo));
super.setCodigo(codigo);
}

private static TrechoCodigoFonte montarTrechoCodigoFonte(int tamanhoTotalCodigo)
{
return new TrechoCodigoFonte(1, 1, tamanhoTotalCodigo);
}

@Override
protected String construirMensagem()
{
StringBuilder construtorMensagem = new StringBuilder();

construtorMensagem.append("A função \"");
construtorMensagem.append("inicio");
construtorMensagem.append("\" não existe no seu código. Ela é necessária pois será a primeira a ser chamada na execução do código");

return construtorMensagem.toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import br.univali.portugol.nucleo.programa.Programa;
import br.univali.portugol.nucleo.analise.ResultadoAnalise;
import br.univali.portugol.nucleo.analise.semantica.erros.ErroExpressaoTamanhoVetorMatriz;
import br.univali.portugol.nucleo.analise.semantica.erros.ErroFuncaoInicioInexistente;
import br.univali.portugol.nucleo.analise.semantica.erros.ErroInclusaoBiblioteca;
import br.univali.portugol.nucleo.analise.semantica.erros.ErroSimboloNaoDeclarado;
import br.univali.portugol.nucleo.analise.semantica.erros.ErroSimboloNaoInicializado;
Expand Down Expand Up @@ -38,6 +39,27 @@ public void testVariavelDeclaradaNoFinalDoCodigo() throws ErroCompilacao {

}

@Test
public void testFuncaoInicioInexistente() throws ErroCompilacao {
try {
Portugol.compilarParaAnalise(
"programa " +
" { " +
" funcao teste() " +
" { " +
" escreva(\"Olá Mundo\") " +
" } " +
" } "
);
}
catch(ErroCompilacao e) {
ResultadoAnalise resultado = e.getResultadoAnalise();
Assert.assertTrue("era esperado um erro de compilação", resultado.getErros().size() == 1);
Assert.assertEquals("Erro no tipo de exceção reportada", ErroFuncaoInicioInexistente.class.getName(), resultado.getErros().get(0).getClass().getName());
}

}

@Test
public void testVetorComTamanhoExpressao() throws ErroCompilacao {
try {
Expand Down Expand Up @@ -154,7 +176,7 @@ public void testInclusaoBibliotecaDuplicada() throws ErroCompilacao {
+ "{"
+ " inclua biblioteca Graficos"
+ " inclua biblioteca Graficos"
+ " "
+ " funcao inicio(){}"
+ "}"
);
}
Expand All @@ -173,6 +195,7 @@ public void testFuncaoComNomeDeVariavelGlobal() throws ErroCompilacao {
+ "programa { "
+ " inteiro teste "
+ " funcao teste() {} "
+ " funcao inicio() {} "
+ "} "
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import br.univali.portugol.nucleo.Portugol;
import br.univali.portugol.nucleo.programa.Programa;
import br.univali.portugol.nucleo.analise.ResultadoAnalise;
import br.univali.portugol.nucleo.analise.semantica.erros.ErroFuncaoInicioInexistente;
import br.univali.portugol.nucleo.analise.sintatica.erros.ErroEscapeUnico;
import br.univali.portugol.nucleo.analise.sintatica.erros.ErroExpressoesForaEscopoPrograma;
import br.univali.portugol.nucleo.asa.TrechoCodigoFonte;
Expand Down Expand Up @@ -168,6 +169,12 @@ public void notificarErrosAvisos(ResultadoAnalise resultadoAnalise, RSyntaxDocum
notice.setShowInEditor(true);
resultado.addNotice(notice);
}
else if(erro instanceof ErroFuncaoInicioInexistente)
{
DefaultParserNotice notice = (DefaultParserNotice) adicionarErroAviso(raiz, erro.getTrechoCodigoFonte(), erro.getMensagem());
notice.setShowInEditor(true);
resultado.addNotice(notice);
}
}

for (AvisoAnalise aviso : resultadoAnalise.getAvisos())
Expand Down

0 comments on commit 3a7f1b2

Please sign in to comment.