Skip to content

Commit

Permalink
🐛 corrigindo mensagem de erro com reais com virgulas (fix #308) (#878)
Browse files Browse the repository at this point in the history
* 🐛 corrigindo mensagem de erro com reais com virgulas (fix #308)

* 🐛 corrigindo outras possibilidades

* verificando novas possibilidades de erros

* resolvendo retorno de reais com virgula
  • Loading branch information
AdsonEsteves authored Nov 27, 2020
1 parent 05f9bdc commit baffee2
Show file tree
Hide file tree
Showing 5 changed files with 251 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -166,19 +166,23 @@ protected void reportUnwantedToken(Parser recognizer) {
@Override
protected void reportFailedPredicate(Parser recognizer, FailedPredicateException e) {
beginErrorCondition(recognizer);
Token t = recognizer.getCurrentToken();
IntervalSet expecting = getExpectedTokens(recognizer);
Token t = e.getOffendingToken();
IntervalSet expecting = e.getExpectedTokens();
String msg = "Expressão " +getTokenErrorDisplay(t)+ " não faz sentido, era esperado o token "+expecting.toString(recognizer.getVocabulary())+".";
throw new RecognitionException(msg, recognizer, recognizer.getInputStream(), recognizer.getContext());
RecognitionException ex = new RecognitionException(msg, recognizer, recognizer.getInputStream(), recognizer.getContext());
ex.initCause(e);
throw ex;
}

@Override
protected void reportNoViableAlternative(Parser recognizer, NoViableAltException e) {
beginErrorCondition(recognizer);
Token t = recognizer.getCurrentToken();
IntervalSet expecting = getExpectedTokens(recognizer);
Token t = e.getOffendingToken();
IntervalSet expecting = e.getExpectedTokens();
String msg = "Expressão " +getTokenErrorDisplay(t)+ " não faz sentido, era esperado o token "+expecting.toString(recognizer.getVocabulary())+".";
throw new RecognitionException(msg, recognizer, recognizer.getInputStream(), recognizer.getContext());
RecognitionException ex = new RecognitionException(msg, recognizer, recognizer.getInputStream(), recognizer.getContext());
ex.initCause(e);
throw ex;
}
});

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package br.univali.portugol.nucleo.analise.sintatica.erros;

import br.univali.portugol.nucleo.analise.sintatica.AnalisadorSintatico;
import br.univali.portugol.nucleo.mensagens.ErroSintatico;

/**
* Erro gerado pelo analisador sintático quando uma expressão lógica ou aritmética está
* incompleta.
* <p>
* Exemplo:
* <code><pre>
*
* funcao exemploExpressaoIncompleta()
* {
* inteiro var1 = 23 + // Gera este erro
* inteiro var2 = ( + 12) // Gera este erro
*
* se (var 1 < ) // Gera este erro
* {
*
* }
* }
*
* </pre></code>
*
* @author Luiz Fernando Noschang
* @version 1.0
*
* @see AnalisadorSintatico
*/

public final class ErroChaveDeVetorMatrizMalPosicionada extends ErroSintatico
{
/**
*
* @param linha a linha onde o erro ocorreu.
* @param coluna a coluna onde o erro ocorreu.
* @since 1.0
*/
public ErroChaveDeVetorMatrizMalPosicionada(int linha, int coluna)
{
super(linha, coluna,"ErroSintatico.ErroExpressaoIncompleta");
}

/**
* {@inheritDoc }
*/
@Override
protected String construirMensagem()
{
return "O formato de Vetor/Matriz está errado. As chaves devem ser posicionadas no nome da variavel. \nex: inteiro a[] = {2, 3}";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package br.univali.portugol.nucleo.analise.sintatica.erros;

import br.univali.portugol.nucleo.analise.sintatica.AnalisadorSintatico;
import br.univali.portugol.nucleo.mensagens.ErroSintatico;

/**
* Erro gerado pelo analisador sintático quando uma expressão lógica ou aritmética está
* incompleta.
* <p>
* Exemplo:
* <code><pre>
*
* funcao exemploExpressaoIncompleta()
* {
* inteiro var1 = 23 + // Gera este erro
* inteiro var2 = ( + 12) // Gera este erro
*
* se (var 1 < ) // Gera este erro
* {
*
* }
* }
*
* </pre></code>
*
* @author Luiz Fernando Noschang
* @version 1.0
*
* @see AnalisadorSintatico
*/

public final class ErroRealComVirgula extends ErroSintatico
{
/**
*
* @param linha a linha onde o erro ocorreu.
* @param coluna a coluna onde o erro ocorreu.
* @since 1.0
*/
public ErroRealComVirgula(int linha, int coluna)
{
super(linha, coluna,"ErroSintatico.ErroExpressaoIncompleta");
}

/**
* {@inheritDoc }
*/
@Override
protected String construirMensagem()
{
return "A expressão foi formada utilizando vírgulas. Valores reais devem ser expressados utilizando pontos. ex: 2.75 ";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package br.univali.portugol.nucleo.analise.sintatica.erros;

import br.univali.portugol.nucleo.analise.sintatica.AnalisadorSintatico;
import br.univali.portugol.nucleo.mensagens.ErroSintatico;

/**
* Erro gerado pelo analisador sintático quando o nome do símbolo não é informado
* na declaração.
* <p>
* Exemplo:
* <code><pre>
*
* /*
* * Esta declaração de função gera erro, pois o nome do
* * primeiro parãmetro está faltando.
* *&#47;
*
* funcao exemploSimboloFaltando(inteiro , real param2)
* {
* inteiro = 56 // Esta declaração de variável também gera erro, pois falta o nome da variável
* }
*
* </pre></code>
*
* @author Luiz Fernando Noschang
* @version 1.0
*
* @see AnalisadorSintatico
*/
public final class ErroSimboloFaltandoOuRealComVirgula extends ErroSintatico
{
private String contexto;
private String codigo = "ErroSintatico.ErroNomeSimboloEstaFaltando.";

/**
*
* @param linha a linha onde o erro ocorreu.
* @param coluna a coluna onde o erro ocorreu.
* @param contexto o contexto em que o analisador sintático se encontrava no momento do erro.
* @since 1.0
*/
public ErroSimboloFaltandoOuRealComVirgula(int linha, int coluna, String contexto)
{
super(linha, coluna);
this.contexto = contexto;
}

/**
* {@inheritDoc }
*/
@Override
protected String construirMensagem()
{
if (contexto.equals("parametro"))
{
super.setCodigo(codigo+"1");
return "Uma vírgula foi mal colocada. O nome do parâmetro da função não foi informado ou o número real não foi escrito com pontos.";
}
else if (contexto.equals("declaracaoFuncao"))
{
super.setCodigo(codigo+"2");
return "Uma vírgula foi mal colocada. O nome da função não foi informado ou o número real não foi escrito com pontos.";
}
else
{
super.setCodigo(codigo+"3");
return "Uma vírgula foi mal colocada. O nome da variável não foi informado ou o número real não foi escrito com pontos.";
}
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package br.univali.portugol.nucleo.analise.sintatica.tradutores;

import br.univali.portugol.nucleo.analise.sintatica.AnalisadorSintatico;
import br.univali.portugol.nucleo.analise.sintatica.antlr4.PortugolLexer;
import br.univali.portugol.nucleo.analise.sintatica.erros.ErroCadeiaIncompleta;
import br.univali.portugol.nucleo.analise.sintatica.erros.ErroChaveDeVetorMatrizMalPosicionada;
import br.univali.portugol.nucleo.analise.sintatica.erros.ErroComandoEsperado;
import br.univali.portugol.nucleo.analise.sintatica.erros.ErroEscapeUnico;
import br.univali.portugol.nucleo.analise.sintatica.erros.ErroEscopo;
import br.univali.portugol.nucleo.analise.sintatica.erros.ErroExpressaoEsperada;
import br.univali.portugol.nucleo.analise.sintatica.erros.ErroExpressaoForaEscopoFuncao;
Expand All @@ -18,19 +17,21 @@
import br.univali.portugol.nucleo.analise.sintatica.erros.ErroParametrosNaoTipados;
import br.univali.portugol.nucleo.analise.sintatica.erros.ErroParentesis;
import br.univali.portugol.nucleo.analise.sintatica.erros.ErroParsingNaoTratado;
import br.univali.portugol.nucleo.analise.sintatica.erros.ErroRealComVirgula;
import br.univali.portugol.nucleo.analise.sintatica.erros.ErroRetornoVetorMatriz;
import br.univali.portugol.nucleo.analise.sintatica.erros.ErroSenaoInesperado;
import br.univali.portugol.nucleo.analise.sintatica.erros.ErroSimboloFaltandoOuRealComVirgula;
import br.univali.portugol.nucleo.analise.sintatica.erros.ErroTipoDeDadoEstaFaltando;
import br.univali.portugol.nucleo.analise.sintatica.erros.ErroTokenFaltando;
import br.univali.portugol.nucleo.mensagens.ErroSintatico;
import java.util.ArrayList;
import java.util.List;
import org.antlr.runtime.MismatchedTokenException;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.RecognitionException;
import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.RuleContext;
import org.antlr.v4.runtime.Vocabulary;
import org.antlr.v4.runtime.misc.Interval;
import org.antlr.v4.runtime.misc.IntervalSet;


Expand Down Expand Up @@ -61,18 +62,27 @@ public ErroSintatico traduzirErroParsing(RecognitionException erro, String mensa
String contextoAtual = contextos.getContextoAtual();

String token = TradutorUtils.getToken(erro).getText();

String contextoDaCausa = null;
String tokenDaCausa = null;
String textoErroDoContexto = ((ParserRuleContext)erro.getCtx()).getText();

// if(tokensEsperados.size()>1)
// {
// PortugolLexer lexer = new PortugolLexer(CharStreams.fromString(codigoFonte));
// for (Token token = lexer.nextToken(); token.getType() != Token.EOF; token = lexer.nextToken())
// {
//// if(token.getType() == PortugolLexer.INVALID_ESCAPE)
//// {
//// return new ErroEscapeUnico(token.getLine(), token.getCharPositionInLine(), "\\", token.getText());
//// }
// }
// }
if(erro.getCause() != null)
{
RecognitionException exception = (RecognitionException)erro.getCause();
tokenDaCausa = exception.getOffendingToken().getText();
contextoDaCausa = exception.getRecognizer().getRuleNames()[exception.getCtx().getRuleIndex()];
if(contextoDaCausa.equals("comando") && tokenDaCausa.equals(","))
{
return new ErroSimboloFaltandoOuRealComVirgula(linha, coluna, contextoAtual);
}
}
try
{
if(token.matches("[0-9]*"))
if(getFullText((ParserRuleContext)erro.getCtx(), 2, 0).matches("[0-9]*,[0-9]*"))
return new ErroSimboloFaltandoOuRealComVirgula(linha, coluna, contextoAtual);
}catch(Exception e){}

if(erro.getMessage().contains("Remove-lo pode solucionar o problema"))
{
Expand Down Expand Up @@ -105,6 +115,12 @@ public ErroSintatico traduzirErroParsing(RecognitionException erro, String mensa
{
return new ErroParametrosNaoTipados(linha, coluna, token);
}

if(token.equals(",") && textoErroDoContexto.matches(".*retorne([0-9])*"))
{
return new ErroRealComVirgula(linha, coluna);
}

return new ErroExpressaoInesperada(linha, coluna, token);
}

Expand All @@ -124,6 +140,11 @@ public ErroSintatico traduzirErroParsing(RecognitionException erro, String mensa
return new ErroExpressaoIncompleta(linha, coluna);
}

if(token.equals(","))
{
return new ErroRealComVirgula(linha, coluna);
}

if (erro.getMessage() != null && erro.getMessage().contains("<EOF>")) {
return new ErroCadeiaIncompleta(linha, coluna, mensagemPadrao);
}
Expand All @@ -133,16 +154,24 @@ public ErroSintatico traduzirErroParsing(RecognitionException erro, String mensa
ContextSet contextoPara = contextos;
if (erro.getCause() != null) {
contextoPara = new ContextSet((RecognitionException)erro.getCause());
if(token.equals(",") && contextoDaCausa.equals("expressao"))
{
return new ErroRealComVirgula(linha, coluna);
}
}
return traduzirErrosPara(linha, coluna, erro, tokensEsperados, contextoPara);
}

// função, variável ou parâmetro sem nome
if (contextoAtual.startsWith("declaracao") || contextoAtual.equals("parametro")) {
if(token.equals("["))
if(token.equals("[") && contextoAtual.equals("declaracaoFuncao"))
{
return new ErroRetornoVetorMatriz(linha, coluna, contextoAtual);
}
else if(token.equals("["))
{
return new ErroChaveDeVetorMatrizMalPosicionada(linha, coluna);
}
if (tokensEsperados.contains("ID")){
return new ErroNomeSimboloEstaFaltando(linha, coluna, contextoAtual);
}
Expand Down Expand Up @@ -219,5 +248,24 @@ private ErroSintatico traduzirErrosEscape()
private int numeroPontoVirgula(String string) {
return string.split(";", -1).length-1;
}


public static boolean isInteger(String s) {
try {
Integer.parseInt(s);
} catch(NumberFormatException e) {
return false;
} catch(NullPointerException e) {
return false;
}
// only got here if we didn't return false
return true;
}

public String getFullText(ParserRuleContext ctx, int offsetBackwards, int offsetFrontwards)
{
int a = ctx.start.getStartIndex();
int b = a-offsetBackwards+offsetFrontwards;
Interval interval = new Interval(b,a);
return ctx.start.getInputStream().getText(interval);
}
}

0 comments on commit baffee2

Please sign in to comment.