Skip to content

Commit

Permalink
🐛 corrigindo Parser ignora tokens indesejados (fix #834 fix #759 fix #…
Browse files Browse the repository at this point in the history
…867 fix #810 fix #759 fix #190) (#871)

* Capturando tokens que não deveriam estar no codigo.

* corrigindo problemas do senao

* capturando erros em parametros de funcao

* Update BuscadorDeSimbolo.java, AnalisadorDeclaracaoTamanhoVetorMatriz.java, and 9 more files...

* capturando erros de retorno de vetores e matrizes

* corrigindo null em parametros de funcao

* corrigindo texto do erro de cadeia
  • Loading branch information
AdsonEsteves committed Nov 14, 2020
1 parent 3a7f1b2 commit 49103fb
Show file tree
Hide file tree
Showing 28 changed files with 1,159 additions and 626 deletions.
12 changes: 8 additions & 4 deletions core/src/main/antlr/Portugol.g4
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,10 @@ tamanhoArray
: expressao; // aceita inteiro ou variável como tamanho do array, o semântico verifica se a variável é constante

declaracaoFuncao
: FUNCAO TIPO? ID ABRE_PARENTESES listaParametros? FECHA_PARENTESES
ABRE_CHAVES comando* FECHA_CHAVES ;
: FUNCAO TIPO? ID parametroFuncao ABRE_CHAVES comando* FECHA_CHAVES ;

parametroFuncao
: ABRE_PARENTESES listaParametros? FECHA_PARENTESES ;
listaParametros
: parametro (VIRGULA parametro)* ;

Expand All @@ -58,7 +59,7 @@ parametroMatriz

comando
: listaDeclaracoes
| se
| se
| enquanto
| facaEnquanto
| para
Expand All @@ -84,7 +85,10 @@ retorne
: RETORNE expressao? ;

se
: SE ABRE_PARENTESES expressao FECHA_PARENTESES listaComandos (SENAO listaComandos)? ;
: SE ABRE_PARENTESES expressao FECHA_PARENTESES listaComandos (senao)? ;

senao
: SENAO listaComandos ;

enquanto
: ENQUANTO ABRE_PARENTESES expressao FECHA_PARENTESES listaComandos ;
Expand Down
2 changes: 1 addition & 1 deletion core/src/main/antlr/PortugolLexico.g4
Original file line number Diff line number Diff line change
Expand Up @@ -111,4 +111,4 @@ VIRGULA : ',';
PONTOVIRGULA : ';';
DOISPONTOS : ':';
DOISPONTOS : ':';
Original file line number Diff line number Diff line change
Expand Up @@ -677,4 +677,14 @@ public Object visitar(NoTitulo noTitulo) throws ExcecaoVisitaASA {
public Object visitar(NoVaPara noVaPara) throws ExcecaoVisitaASA {
return null;
}

@Override
public Object visitar(NoSenao noSenao) throws ExcecaoVisitaASA {
return null;
}

@Override
public Object visitar(NoParametroFuncao noParametroFuncao) throws ExcecaoVisitaASA {
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,13 +51,15 @@
import br.univali.portugol.nucleo.asa.NoOperacaoSoma;
import br.univali.portugol.nucleo.asa.NoOperacaoSubtracao;
import br.univali.portugol.nucleo.asa.NoPara;
import br.univali.portugol.nucleo.asa.NoParametroFuncao;
import br.univali.portugol.nucleo.asa.NoPare;
import br.univali.portugol.nucleo.asa.NoReal;
import br.univali.portugol.nucleo.asa.NoReferenciaMatriz;
import br.univali.portugol.nucleo.asa.NoReferenciaVariavel;
import br.univali.portugol.nucleo.asa.NoReferenciaVetor;
import br.univali.portugol.nucleo.asa.NoRetorne;
import br.univali.portugol.nucleo.asa.NoSe;
import br.univali.portugol.nucleo.asa.NoSenao;
import br.univali.portugol.nucleo.asa.NoTitulo;
import br.univali.portugol.nucleo.asa.NoVaPara;
import br.univali.portugol.nucleo.asa.NoVetor;
Expand Down Expand Up @@ -406,4 +408,14 @@ public Object visitar(NoDeclaracaoParametro noDeclaracaoParametro) throws Exceca
public Object visitar(NoInclusaoBiblioteca noInclusaoBiblioteca) throws ExcecaoVisitaASA {
throw new ExcecaoVisitaASA("Not supported yet.", null, null); //To change body of generated methods, choose Tools | Templates.
}

@Override
public Object visitar(NoSenao noSenao) throws ExcecaoVisitaASA {
throw new ExcecaoVisitaASA("Not supported yet.", null, null); //To change body of generated methods, choose Tools | Templates.
}

@Override
public Object visitar(NoParametroFuncao noParametroFuncao) throws ExcecaoVisitaASA {
throw new ExcecaoVisitaASA("Not supported yet.", null, null); //To change body of generated methods, choose Tools | Templates.
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,15 @@
import br.univali.portugol.nucleo.asa.NoOperacaoSoma;
import br.univali.portugol.nucleo.asa.NoOperacaoSubtracao;
import br.univali.portugol.nucleo.asa.NoPara;
import br.univali.portugol.nucleo.asa.NoParametroFuncao;
import br.univali.portugol.nucleo.asa.NoPare;
import br.univali.portugol.nucleo.asa.NoReal;
import br.univali.portugol.nucleo.asa.NoReferenciaMatriz;
import br.univali.portugol.nucleo.asa.NoReferenciaVariavel;
import br.univali.portugol.nucleo.asa.NoReferenciaVetor;
import br.univali.portugol.nucleo.asa.NoRetorne;
import br.univali.portugol.nucleo.asa.NoSe;
import br.univali.portugol.nucleo.asa.NoSenao;
import br.univali.portugol.nucleo.asa.NoTitulo;
import br.univali.portugol.nucleo.asa.NoVaPara;
import br.univali.portugol.nucleo.asa.NoVetor;
Expand Down Expand Up @@ -436,4 +438,14 @@ public Object visitar(NoInclusaoBiblioteca noInclusaoBiblioteca) throws ExcecaoV
return false;
}

@Override
public Object visitar(NoSenao noSenao) throws ExcecaoVisitaASA {
return false;
}

@Override
public Object visitar(NoParametroFuncao noParametroFuncao) throws ExcecaoVisitaASA {
return false;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2600,4 +2600,16 @@ public Object visitar(NoVaPara noVaPara) throws ExcecaoVisitaASA
setarPaiDoNo(noVaPara);
throw new ExcecaoVisitaASA("Erro", new ErroComandoNaoSuportado(noVaPara.getTrechoCodigoFonte()), asa, noVaPara);
}

@Override
public Object visitar(NoSenao noSenao) throws ExcecaoVisitaASA {
setarPaiDoNo(noSenao);
throw new ExcecaoVisitaASA("Erro", new ErroComandoNaoSuportado(noSenao.getTrechoCodigoFonte()), asa, noSenao);
}

@Override
public Object visitar(NoParametroFuncao noParametroFuncao) throws ExcecaoVisitaASA {
setarPaiDoNo(noParametroFuncao);
throw new ExcecaoVisitaASA("Erro", new ErroComandoNaoSuportado(noParametroFuncao.getTrechoCodigoFonte()), asa, noParametroFuncao);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import br.univali.portugol.nucleo.asa.NoDeclaracaoParametro;
import br.univali.portugol.nucleo.asa.NoDeclaracaoVariavel;
import br.univali.portugol.nucleo.asa.NoDeclaracaoVetor;
import br.univali.portugol.nucleo.asa.NoParametroFuncao;
import br.univali.portugol.nucleo.asa.VisitanteASABasico;
import br.univali.portugol.nucleo.mensagens.AvisoAnalise;
import br.univali.portugol.nucleo.simbolos.Funcao;
Expand Down Expand Up @@ -150,5 +151,10 @@ public Object visitar(NoDeclaracaoFuncao declaracaoFuncao) throws ExcecaoVisitaA
{
return super.visitar(declaracaoFuncao); //To change body of generated methods, choose Tools | Templates.
}

@Override
public Object visitar(NoParametroFuncao noParametroFuncao) throws ExcecaoVisitaASA {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,15 @@
import br.univali.portugol.nucleo.mensagens.ErroSintatico;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.BitSet;
import java.util.Collection;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.antlr.runtime.UnwantedTokenException;
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.atn.ATNConfigSet;
import org.antlr.v4.runtime.dfa.DFA;
import org.antlr.v4.runtime.misc.IntervalSet;
import org.antlr.v4.runtime.misc.ParseCancellationException;

Expand Down Expand Up @@ -121,7 +125,6 @@ public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int
notificarErroSintatico(traduzirErroParsing(e, msg, line, charPositionInLine));
}
}

});

PortugolParser portugolParser = new PortugolParser(new CommonTokenStream(portugolLexer));
Expand Down Expand Up @@ -150,6 +153,32 @@ public void reportMissingToken(Parser recognizer) {
String msg = "missing " + expecting.toString(recognizer.getVocabulary()) + " at " + getTokenErrorDisplay(t);
throw new RecognitionException(msg, recognizer, recognizer.getInputStream(), recognizer.getContext());
}

@Override
protected void reportUnwantedToken(Parser recognizer) {
beginErrorCondition(recognizer);
Token t = recognizer.getCurrentToken();
String msg = "O token " +getTokenErrorDisplay(t)+ " não faz sentido neste local. Remove-lo pode solucionar o problema";
throw new RecognitionException(msg, recognizer, recognizer.getInputStream(), recognizer.getContext());
}

@Override
protected void reportFailedPredicate(Parser recognizer, FailedPredicateException e) {
beginErrorCondition(recognizer);
Token t = recognizer.getCurrentToken();
IntervalSet expecting = getExpectedTokens(recognizer);
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());
}

@Override
protected void reportNoViableAlternative(Parser recognizer, NoViableAltException e) {
beginErrorCondition(recognizer);
Token t = recognizer.getCurrentToken();
IntervalSet expecting = getExpectedTokens(recognizer);
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());
}
});

try {
Expand All @@ -161,7 +190,7 @@ public void reportMissingToken(Parser recognizer) {
return asa;
}
catch (RecognitionException excecao) {
tratarErroParsing(excecao, codigoFonte);
tratarErroParsing(excecao, excecao.getLocalizedMessage());
}
catch(ParseCancellationException e) {
System.out.println(e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -175,13 +175,10 @@ public No visitDeclaracaoFuncao(PortugolParser.DeclaracaoFuncaoContext ctx) {
TipoDado tipoRetorno = TipoDado.obterTipoDadoPeloNome(nomeTipoRetorno);

NoDeclaracaoFuncao declaracaoFuncao = new NoDeclaracaoFuncao(nomeFuncao, tipoRetorno, Quantificador.VALOR);

if (ctx.listaParametros() != null) { // se a função tem parâmetros
List<NoDeclaracaoParametro> parametros = new ArrayList<>();
for (ParametroContext parametroContext : ctx.listaParametros().parametro()) {
parametros.add((NoDeclaracaoParametro)parametroContext.accept(this));
}
declaracaoFuncao.setParametros(parametros);

if (ctx.parametroFuncao() != null) { // se a função tem parâmetros
NoParametroFuncao noParametroFuncao = (NoParametroFuncao) visit(ctx.parametroFuncao());
declaracaoFuncao.setParametros(noParametroFuncao.getParametros());
}

declaracaoFuncao.setBlocos(getBlocos(ctx.comando()));
Expand All @@ -196,6 +193,16 @@ public No visitDeclaracaoFuncao(PortugolParser.DeclaracaoFuncaoContext ctx) {
return declaracaoFuncao;
}

@Override
public No visitParametroFuncao(ParametroFuncaoContext ctx) {
NoParametroFuncao noParametroFuncao = new NoParametroFuncao();
if(ctx.listaParametros()!=null)
for (ParametroContext parametroContext : ctx.listaParametros().parametro()) {
noParametroFuncao.addParametro((NoDeclaracaoParametro)parametroContext.accept(this));
}
return noParametroFuncao;
}

@Override
public No visitRetorne(RetorneContext ctx) {
TrechoCodigoFonte trechoCodigoFonte = getTrechoCodigoFonte(ctx.RETORNE());
Expand Down Expand Up @@ -669,18 +676,23 @@ public No visitEnquanto(EnquantoContext ctx) {

@Override
public No visitSe(SeContext ctx) {
NoSe se = new NoSe((NoExpressao)ctx.expressao().accept(this));

se.setBlocosVerdadeiros(getBlocos(ctx.listaComandos(0)));

if (ctx.SENAO() != null) {
se.setBlocosFalsos(getBlocos(ctx.listaComandos(1)));
}

se.setTrechoCodigoFonte(getTrechoCodigoFonte(ctx.SE(), ctx.getText().length()));

NoSe se = new NoSe((NoExpressao)ctx.expressao().accept(this));
se.setBlocosVerdadeiros(getBlocos(ctx.listaComandos()));
if(ctx.senao() != null)
{
NoSenao senao = (NoSenao) visit(ctx.senao());
se.setBlocosFalsos(senao.getBlocosFalsos());
}
se.setTrechoCodigoFonte(getTrechoCodigoFonte(ctx.SE(), ctx.getText().length()));
return se;
}

@Override
public No visitSenao(SenaoContext ctx) {
NoSenao senao = new NoSenao();
senao.setBlocosFalsos(getBlocos(ctx.listaComandos()));
return senao;
}

@Override
public No visitChamadaFuncao(PortugolParser.ChamadaFuncaoContext ctx) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,13 @@ public class PortugolBaseVisitor<T> extends AbstractParseTreeVisitor<T> implemen
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitDeclaracaoFuncao(PortugolParser.DeclaracaoFuncaoContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitParametroFuncao(PortugolParser.ParametroFuncaoContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
Expand Down Expand Up @@ -186,6 +193,13 @@ public class PortugolBaseVisitor<T> extends AbstractParseTreeVisitor<T> implemen
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitSe(PortugolParser.SeContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitSenao(PortugolParser.SenaoContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
Expand Down
Loading

0 comments on commit 49103fb

Please sign in to comment.