Skip to content

Commit

Permalink
possibilitando expressão em tamanho de vetor/matriz (#767) (fix #757) (
Browse files Browse the repository at this point in the history
…closes #722)

* possibilitando expressão em tamanho de vetor/matriz

* utilizando expressões em declaracões de tamanho de vetor/matriz

* Detalhando mensagem de erro

* novos casos de teste
  • Loading branch information
AdsonEsteves authored Mar 13, 2020
2 parents df0e705 + 03b8dc9 commit 3e32234
Show file tree
Hide file tree
Showing 12 changed files with 638 additions and 66 deletions.
4 changes: 2 additions & 2 deletions core/src/main/antlr/Portugol.g4
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ inicializacaoArray
: ABRE_CHAVES listaExpressoes? FECHA_CHAVES ;

tamanhoArray
: INT | ID; // aceita inteiro ou variável como tamanho do array, o semântico verifica se a variável é constante
: 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
Expand Down Expand Up @@ -166,4 +166,4 @@ listaExpressoes
: (expressao | atribuicaoComposta | atribuicao) (VIRGULA (expressao | atribuicaoComposta | atribuicao))* ;

escopoBiblioteca
: (ID PONTO) ;
: (ID PONTO) ;

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
import java.util.Map;
import java.util.Stack;
import java.util.TreeMap;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
* Percorre a {@link ASA} gerada a partir do código fonte para detectar
Expand Down Expand Up @@ -2482,10 +2484,11 @@ private Integer obterTamanhoVetorMatriz(final NoExpressao expTamanho, NoDeclarac
if (expTamanho != null)
{
TipoDado tipoTamanho = (TipoDado) expTamanho.aceitar(this);

AnalisadorDeclaracaoTamanhoVetorMatriz adtvm = new AnalisadorDeclaracaoTamanhoVetorMatriz();

if (tipoTamanho == TipoDado.INTEIRO)
{
if (!(expTamanho instanceof NoInteiro) && !(expTamanho instanceof NoReferenciaVariavel))
if (!(expTamanho instanceof NoInteiro) && !(expTamanho instanceof NoReferenciaVariavel) && !(expTamanho instanceof NoOperacao))
{
notificarErroSemantico(new ErroTamanhoVetorMatriz(noDeclaracao, expTamanho));
}
Expand All @@ -2500,8 +2503,12 @@ else if (expTamanho instanceof NoReferenciaVariavel)

if (variavel.constante())
{

return ((NoInteiro) decl.getInicializacao()).getValor();
Integer intg = ((NoInteiro) decl.getInicializacao()).getValor();
if(intg<=0)
{
notificarErroSemantico(new ErroTamanhoVetorMatriz(noDeclaracao, expTamanho));
}
return intg;
}
else
{
Expand All @@ -2524,9 +2531,22 @@ else if (expTamanho instanceof NoReferenciaVariavel)
}
}
}
else if(expTamanho instanceof NoOperacao)
{
try {
return adtvm.possuiExpressaoDeTamanhoValida(noDeclaracao, expTamanho);
} catch (ErroExpressaoTamanhoVetorMatriz ex) {
notificarErroSemantico(ex);
}
}
else
{
return ((NoInteiro) expTamanho).getValor();
Integer intg = ((NoInteiro) expTamanho).getValor();
if(intg<=0)
{
notificarErroSemantico(new ErroTamanhoVetorMatriz(noDeclaracao, expTamanho));
}
return intg;
}
}
else
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package br.univali.portugol.nucleo.analise.semantica.erros;

import br.univali.portugol.nucleo.asa.NoBloco;
import br.univali.portugol.nucleo.asa.NoDeclaracaoBase;
import br.univali.portugol.nucleo.asa.NoDeclaracaoMatriz;
import br.univali.portugol.nucleo.asa.NoDeclaracaoVetor;
import br.univali.portugol.nucleo.asa.NoExpressao;
import br.univali.portugol.nucleo.mensagens.ErroSemantico;

/**
*
* @author fillipi
*/
public class ErroExpressaoTamanhoVetorMatriz extends ErroSemantico
{
private NoDeclaracaoBase declaracao;
private NoBloco tamanho;
private String valorErrado;
private String codigo = "ErroSemantico.ErroTamanhoVetorMatriz.";

public ErroExpressaoTamanhoVetorMatriz(NoDeclaracaoBase declaracao, NoBloco tamanho, String valorErrado)
{
super(tamanho.getTrechoCodigoFonte(),"ErroSemantico.ErroTamanhoVetorMatriz");
this.declaracao = declaracao;
this.tamanho = tamanho;
this.valorErrado = valorErrado;
}

public ErroExpressaoTamanhoVetorMatriz(NoDeclaracaoBase declaracao, NoBloco tamanho)
{
super(tamanho.getTrechoCodigoFonte(),"ErroSemantico.ErroTamanhoVetorMatriz");
this.declaracao = declaracao;
this.tamanho = tamanho;
}

@Override
protected String construirMensagem()
{
if(this.valorErrado == null || this.valorErrado.equals(""))
{
if (declaracao instanceof NoDeclaracaoVetor)
{
codigo += "1";
super.setCodigo(codigo);

return String.format("O tamanho do vetor '%s' deve ser um valor ou uma constante do tipo inteiro e positivo \n Ex: vetor[3]", declaracao.getNome());
}
else
{
String aux = (tamanho == ((NoDeclaracaoMatriz) declaracao).getNumeroLinhas())? "linhas" : "colunas";
codigo += "2";
super.setCodigo(codigo);

return String.format("O número de %s da matriz '%s' deve ser um valor ou uma constante do tipo inteiro e positivo \n Ex: matriz[5][4]", aux, declaracao.getNome());
}
}
else
{
if (declaracao instanceof NoDeclaracaoVetor)
{
codigo += "1";
super.setCodigo(codigo);

return String.format("A variavel '%s' do tamanho do vetor '%s' deve ser uma variavel ou valor constante do tipo inteiro e positivo \n Ex: \n const inteiro x = 3 \n vetor[x]",this.valorErrado, declaracao.getNome());
}
else
{
String aux = (tamanho == ((NoDeclaracaoMatriz) declaracao).getNumeroLinhas())? "linhas" : "colunas";
codigo += "2";
super.setCodigo(codigo);

return String.format("A variavel '%s' no número de %s da matriz '%s' deve ser um valor ou uma constante do tipo inteiro e positivo \n Ex: \n const inteiro x = 3 \n matriz[x][5]",this.valorErrado, aux, declaracao.getNome());
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,15 @@ protected String construirMensagem()
codigo += "1";
super.setCodigo(codigo);

return String.format("O tamanho do vetor '%s' deve ser um valor ou uma constante do tipo inteiro", declaracao.getNome());
return String.format("O tamanho do vetor '%s' deve ser um valor ou uma constante do tipo inteiro e positivo \n Ex: vetor[3]", declaracao.getNome());
}
else
{
String aux = (tamanho == ((NoDeclaracaoMatriz) declaracao).getNumeroLinhas())? "linhas" : "colunas";
codigo += "2";
super.setCodigo(codigo);

return String.format("O número de %s da matriz '%s' deve ser um valor ou uma constante do tipo inteiro", aux, declaracao.getNome());
return String.format("O número de %s da matriz '%s' deve ser um valor ou uma constante do tipo inteiro e positivo \n Ex: matriz[5][4]", aux, declaracao.getNome());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -499,12 +499,8 @@ public No visitInclusaoBiblioteca(InclusaoBibliotecaContext ctx) {
}

@Override
public No visitTamanhoArray(TamanhoArrayContext ctx) {
if (ctx.INT() != null) {
return new NoInteiro(Integer.parseInt(ctx.INT().getText()));
}

return new NoReferenciaVariavel(null, ctx.ID().getText()); // uma variável foi usada como tamanho do array
public No visitTamanhoArray(TamanhoArrayContext ctx) {
return (NoExpressao) ctx.expressao().accept(this);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -528,7 +528,7 @@ public final DeclaracaoMatrizContext declaracaoMatriz() throws RecognitionExcept
setState(121);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==ID || _la==INT) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ABRE_PARENTESES) | (1L << OP_NAO) | (1L << OP_SUBTRACAO) | (1L << OP_ADICAO) | (1L << OP_INCREMENTO_UNARIO) | (1L << OP_DECREMENTO_UNARIO) | (1L << OP_NOT_BITWISE) | (1L << LOGICO) | (1L << CARACTER) | (1L << STRING) | (1L << ID) | (1L << REAL) | (1L << INT) | (1L << HEXADECIMAL))) != 0)) {
{
setState(120);
linhaMatriz();
Expand All @@ -542,7 +542,7 @@ public final DeclaracaoMatrizContext declaracaoMatriz() throws RecognitionExcept
setState(126);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==ID || _la==INT) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ABRE_PARENTESES) | (1L << OP_NAO) | (1L << OP_SUBTRACAO) | (1L << OP_ADICAO) | (1L << OP_INCREMENTO_UNARIO) | (1L << OP_DECREMENTO_UNARIO) | (1L << OP_NOT_BITWISE) | (1L << LOGICO) | (1L << CARACTER) | (1L << STRING) | (1L << ID) | (1L << REAL) | (1L << INT) | (1L << HEXADECIMAL))) != 0)) {
{
setState(125);
colunaMatriz();
Expand Down Expand Up @@ -750,7 +750,7 @@ public final DeclaracaoArrayContext declaracaoArray() throws RecognitionExceptio
setState(151);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==ID || _la==INT) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ABRE_PARENTESES) | (1L << OP_NAO) | (1L << OP_SUBTRACAO) | (1L << OP_ADICAO) | (1L << OP_INCREMENTO_UNARIO) | (1L << OP_DECREMENTO_UNARIO) | (1L << OP_NOT_BITWISE) | (1L << LOGICO) | (1L << CARACTER) | (1L << STRING) | (1L << ID) | (1L << REAL) | (1L << INT) | (1L << HEXADECIMAL))) != 0)) {
{
setState(150);
tamanhoArray();
Expand Down Expand Up @@ -836,8 +836,9 @@ public final InicializacaoArrayContext inicializacaoArray() throws RecognitionEx
}

public static class TamanhoArrayContext extends ParserRuleContext {
public TerminalNode INT() { return getToken(PortugolParser.INT, 0); }
public TerminalNode ID() { return getToken(PortugolParser.ID, 0); }
public ExpressaoContext expressao() {
return getRuleContext(ExpressaoContext.class,0);
}
public TamanhoArrayContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
Expand All @@ -852,20 +853,11 @@ public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
public final TamanhoArrayContext tamanhoArray() throws RecognitionException {
TamanhoArrayContext _localctx = new TamanhoArrayContext(_ctx, getState());
enterRule(_localctx, 22, RULE_tamanhoArray);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
setState(164);
_la = _input.LA(1);
if ( !(_la==ID || _la==INT) ) {
_errHandler.recoverInline(this);
}
else {
if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
_errHandler.reportMatch(this);
consume();
}
expressao(0);
}
}
catch (RecognitionException re) {
Expand Down Expand Up @@ -3735,41 +3727,41 @@ private boolean expressao_sempred(ExpressaoContext _localctx, int predIndex) {
"\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\7#\u01e5\n#\f#\16#\u01e8\13#\3$\3$\3"+
"$\5$\u01ed\n$\3$\3$\3$\3$\5$\u01f3\n$\7$\u01f5\n$\f$\16$\u01f8\13$\3%"+
"\3%\3%\3%\2\3D&\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62"+
"\64\668:<>@BDFH\2\4\4\2::<<\3\2<=\2\u0241\2J\3\2\2\2\4[\3\2\2\2\6c\3\2"+
"\2\2\bq\3\2\2\2\ns\3\2\2\2\fx\3\2\2\2\16\u0087\3\2\2\2\20\u0092\3\2\2"+
"\2\22\u0094\3\2\2\2\24\u0096\3\2\2\2\26\u00a0\3\2\2\2\30\u00a6\3\2\2\2"+
"\32\u00a8\3\2\2\2\34\u00bb\3\2\2\2\36\u00c3\3\2\2\2 \u00cc\3\2\2\2\"\u00cf"+
"\3\2\2\2$\u00df\3\2\2\2&\u00e1\3\2\2\2(\u00f5\3\2\2\2*\u00f7\3\2\2\2,"+
"\u00fb\3\2\2\2.\u0104\3\2\2\2\60\u010a\3\2\2\2\62\u0111\3\2\2\2\64\u0126"+
"\3\2\2\2\66\u012b\3\2\2\28\u012d\3\2\2\2:\u0132\3\2\2\2<\u0134\3\2\2\2"+
">\u0141\3\2\2\2@\u015a\3\2\2\2B\u015c\3\2\2\2D\u01ac\3\2\2\2F\u01ec\3"+
"\2\2\2H\u01f9\3\2\2\2JK\7\21\2\2KO\7\7\2\2LN\5\4\3\2ML\3\2\2\2NQ\3\2\2"+
"\2OM\3\2\2\2OP\3\2\2\2PV\3\2\2\2QO\3\2\2\2RU\5\32\16\2SU\5\6\4\2TR\3\2"+
"\2\2TS\3\2\2\2UX\3\2\2\2VT\3\2\2\2VW\3\2\2\2WY\3\2\2\2XV\3\2\2\2YZ\7\b"+
"\2\2Z\3\3\2\2\2[\\\7\27\2\2\\]\7\30\2\2]`\7:\2\2^_\7/\2\2_a\7:\2\2`^\3"+
"\2\2\2`a\3\2\2\2a\5\3\2\2\2bd\7\17\2\2cb\3\2\2\2cd\3\2\2\2de\3\2\2\2e"+
"f\7\t\2\2fk\5\b\5\2gh\7B\2\2hj\5\b\5\2ig\3\2\2\2jm\3\2\2\2ki\3\2\2\2k"+
"l\3\2\2\2l\7\3\2\2\2mk\3\2\2\2nr\5\n\6\2or\5\24\13\2pr\5\f\7\2qn\3\2\2"+
"\2qo\3\2\2\2qp\3\2\2\2r\t\3\2\2\2sv\7:\2\2tu\7!\2\2uw\5D#\2vt\3\2\2\2"+
"vw\3\2\2\2w\13\3\2\2\2xy\7:\2\2y{\7\5\2\2z|\5\20\t\2{z\3\2\2\2{|\3\2\2"+
"\2|}\3\2\2\2}~\7\6\2\2~\u0080\7\5\2\2\177\u0081\5\22\n\2\u0080\177\3\2"+
"\2\2\u0080\u0081\3\2\2\2\u0081\u0082\3\2\2\2\u0082\u0085\7\6\2\2\u0083"+
"\u0084\7!\2\2\u0084\u0086\5\16\b\2\u0085\u0083\3\2\2\2\u0085\u0086\3\2"+
"\2\2\u0086\r\3\2\2\2\u0087\u0088\7\7\2\2\u0088\u008d\5\26\f\2\u0089\u008a"+
"\7B\2\2\u008a\u008c\5\26\f\2\u008b\u0089\3\2\2\2\u008c\u008f\3\2\2\2\u008d"+
"\u008b\3\2\2\2\u008d\u008e\3\2\2\2\u008e\u0090\3\2\2\2\u008f\u008d\3\2"+
"\2\2\u0090\u0091\7\b\2\2\u0091\17\3\2\2\2\u0092\u0093\5\30\r\2\u0093\21"+
"\3\2\2\2\u0094\u0095\5\30\r\2\u0095\23\3\2\2\2\u0096\u0097\7:\2\2\u0097"+
"\u0099\7\5\2\2\u0098\u009a\5\30\r\2\u0099\u0098\3\2\2\2\u0099\u009a\3"+
"\2\2\2\u009a\u009b\3\2\2\2\u009b\u009e\7\6\2\2\u009c\u009d\7!\2\2\u009d"+
"\u009f\5\26\f\2\u009e\u009c\3\2\2\2\u009e\u009f\3\2\2\2\u009f\25\3\2\2"+
"\2\u00a0\u00a2\7\7\2\2\u00a1\u00a3\5F$\2\u00a2\u00a1\3\2\2\2\u00a2\u00a3"+
"\3\2\2\2\u00a3\u00a4\3\2\2\2\u00a4\u00a5\7\b\2\2\u00a5\27\3\2\2\2\u00a6"+
"\u00a7\t\2\2\2\u00a7\31\3\2\2\2\u00a8\u00aa\7\20\2\2\u00a9\u00ab\7\t\2"+
"\2\u00aa\u00a9\3\2\2\2\u00aa\u00ab\3\2\2\2\u00ab\u00ac\3\2\2\2\u00ac\u00ad"+
"\7:\2\2\u00ad\u00af\7\3\2\2\u00ae\u00b0\5\34\17\2\u00af\u00ae\3\2\2\2"+
"\u00af\u00b0\3\2\2\2\u00b0\u00b1\3\2\2\2\u00b1\u00b2\7\4\2\2\u00b2\u00b6"+
"\7\7\2\2\u00b3\u00b5\5$\23\2\u00b4\u00b3\3\2\2\2\u00b5\u00b8\3\2\2\2\u00b6"+
"\64\668:<>@BDFH\2\3\3\2<=\2\u0241\2J\3\2\2\2\4[\3\2\2\2\6c\3\2\2\2\bq"+
"\3\2\2\2\ns\3\2\2\2\fx\3\2\2\2\16\u0087\3\2\2\2\20\u0092\3\2\2\2\22\u0094"+
"\3\2\2\2\24\u0096\3\2\2\2\26\u00a0\3\2\2\2\30\u00a6\3\2\2\2\32\u00a8\3"+
"\2\2\2\34\u00bb\3\2\2\2\36\u00c3\3\2\2\2 \u00cc\3\2\2\2\"\u00cf\3\2\2"+
"\2$\u00df\3\2\2\2&\u00e1\3\2\2\2(\u00f5\3\2\2\2*\u00f7\3\2\2\2,\u00fb"+
"\3\2\2\2.\u0104\3\2\2\2\60\u010a\3\2\2\2\62\u0111\3\2\2\2\64\u0126\3\2"+
"\2\2\66\u012b\3\2\2\28\u012d\3\2\2\2:\u0132\3\2\2\2<\u0134\3\2\2\2>\u0141"+
"\3\2\2\2@\u015a\3\2\2\2B\u015c\3\2\2\2D\u01ac\3\2\2\2F\u01ec\3\2\2\2H"+
"\u01f9\3\2\2\2JK\7\21\2\2KO\7\7\2\2LN\5\4\3\2ML\3\2\2\2NQ\3\2\2\2OM\3"+
"\2\2\2OP\3\2\2\2PV\3\2\2\2QO\3\2\2\2RU\5\32\16\2SU\5\6\4\2TR\3\2\2\2T"+
"S\3\2\2\2UX\3\2\2\2VT\3\2\2\2VW\3\2\2\2WY\3\2\2\2XV\3\2\2\2YZ\7\b\2\2"+
"Z\3\3\2\2\2[\\\7\27\2\2\\]\7\30\2\2]`\7:\2\2^_\7/\2\2_a\7:\2\2`^\3\2\2"+
"\2`a\3\2\2\2a\5\3\2\2\2bd\7\17\2\2cb\3\2\2\2cd\3\2\2\2de\3\2\2\2ef\7\t"+
"\2\2fk\5\b\5\2gh\7B\2\2hj\5\b\5\2ig\3\2\2\2jm\3\2\2\2ki\3\2\2\2kl\3\2"+
"\2\2l\7\3\2\2\2mk\3\2\2\2nr\5\n\6\2or\5\24\13\2pr\5\f\7\2qn\3\2\2\2qo"+
"\3\2\2\2qp\3\2\2\2r\t\3\2\2\2sv\7:\2\2tu\7!\2\2uw\5D#\2vt\3\2\2\2vw\3"+
"\2\2\2w\13\3\2\2\2xy\7:\2\2y{\7\5\2\2z|\5\20\t\2{z\3\2\2\2{|\3\2\2\2|"+
"}\3\2\2\2}~\7\6\2\2~\u0080\7\5\2\2\177\u0081\5\22\n\2\u0080\177\3\2\2"+
"\2\u0080\u0081\3\2\2\2\u0081\u0082\3\2\2\2\u0082\u0085\7\6\2\2\u0083\u0084"+
"\7!\2\2\u0084\u0086\5\16\b\2\u0085\u0083\3\2\2\2\u0085\u0086\3\2\2\2\u0086"+
"\r\3\2\2\2\u0087\u0088\7\7\2\2\u0088\u008d\5\26\f\2\u0089\u008a\7B\2\2"+
"\u008a\u008c\5\26\f\2\u008b\u0089\3\2\2\2\u008c\u008f\3\2\2\2\u008d\u008b"+
"\3\2\2\2\u008d\u008e\3\2\2\2\u008e\u0090\3\2\2\2\u008f\u008d\3\2\2\2\u0090"+
"\u0091\7\b\2\2\u0091\17\3\2\2\2\u0092\u0093\5\30\r\2\u0093\21\3\2\2\2"+
"\u0094\u0095\5\30\r\2\u0095\23\3\2\2\2\u0096\u0097\7:\2\2\u0097\u0099"+
"\7\5\2\2\u0098\u009a\5\30\r\2\u0099\u0098\3\2\2\2\u0099\u009a\3\2\2\2"+
"\u009a\u009b\3\2\2\2\u009b\u009e\7\6\2\2\u009c\u009d\7!\2\2\u009d\u009f"+
"\5\26\f\2\u009e\u009c\3\2\2\2\u009e\u009f\3\2\2\2\u009f\25\3\2\2\2\u00a0"+
"\u00a2\7\7\2\2\u00a1\u00a3\5F$\2\u00a2\u00a1\3\2\2\2\u00a2\u00a3\3\2\2"+
"\2\u00a3\u00a4\3\2\2\2\u00a4\u00a5\7\b\2\2\u00a5\27\3\2\2\2\u00a6\u00a7"+
"\5D#\2\u00a7\31\3\2\2\2\u00a8\u00aa\7\20\2\2\u00a9\u00ab\7\t\2\2\u00aa"+
"\u00a9\3\2\2\2\u00aa\u00ab\3\2\2\2\u00ab\u00ac\3\2\2\2\u00ac\u00ad\7:"+
"\2\2\u00ad\u00af\7\3\2\2\u00ae\u00b0\5\34\17\2\u00af\u00ae\3\2\2\2\u00af"+
"\u00b0\3\2\2\2\u00b0\u00b1\3\2\2\2\u00b1\u00b2\7\4\2\2\u00b2\u00b6\7\7"+
"\2\2\u00b3\u00b5\5$\23\2\u00b4\u00b3\3\2\2\2\u00b5\u00b8\3\2\2\2\u00b6"+
"\u00b4\3\2\2\2\u00b6\u00b7\3\2\2\2\u00b7\u00b9\3\2\2\2\u00b8\u00b6\3\2"+
"\2\2\u00b9\u00ba\7\b\2\2\u00ba\33\3\2\2\2\u00bb\u00c0\5\36\20\2\u00bc"+
"\u00bd\7B\2\2\u00bd\u00bf\5\36\20\2\u00be\u00bc\3\2\2\2\u00bf\u00c2\3"+
Expand Down Expand Up @@ -3848,7 +3840,7 @@ private boolean expressao_sempred(ExpressaoContext _localctx, int predIndex) {
"\u019b\u019a\3\2\2\2\u019b\u019c\3\2\2\2\u019c\u019e\3\2\2\2\u019d\u0199"+
"\3\2\2\2\u019d\u019e\3\2\2\2\u019e\u01ad\3\2\2\2\u019f\u01a1\5H%\2\u01a0"+
"\u019f\3\2\2\2\u01a0\u01a1\3\2\2\2\u01a1\u01a2\3\2\2\2\u01a2\u01ad\7:"+
"\2\2\u01a3\u01ad\t\3\2\2\u01a4\u01ad\7;\2\2\u01a5\u01ad\7\65\2\2\u01a6"+
"\2\2\u01a3\u01ad\t\2\2\2\u01a4\u01ad\7;\2\2\u01a5\u01ad\7\65\2\2\u01a6"+
"\u01ad\78\2\2\u01a7\u01ad\79\2\2\u01a8\u01a9\7\3\2\2\u01a9\u01aa\5D#\2"+
"\u01aa\u01ab\7\4\2\2\u01ab\u01ad\3\2\2\2\u01ac\u0160\3\2\2\2\u01ac\u016b"+
"\3\2\2\2\u01ac\u0170\3\2\2\2\u01ac\u0177\3\2\2\2\u01ac\u0179\3\2\2\2\u01ac"+
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.ErroExpressaoTamanhoVetorMatriz;
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 @@ -36,6 +37,29 @@ public void testVariavelDeclaradaNoFinalDoCodigo() throws ErroCompilacao {

}

@Test
public void testVetorComTamanhoExpressao() throws ErroCompilacao {
try {
Portugol.compilarParaAnalise(
"programa "
+ "{ "
+ " funcao inicio() "
+ " { "
+ " const inteiro x = 2 "
+ " inteiro y = 5 "
+ " inteiro vet[1 + x + y] "
+ " } "
+ "} "
);
}
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", ErroExpressaoTamanhoVetorMatriz.class.getName(), resultado.getErros().get(0).getClass().getName());
}

}

@Test
public void testVariavelNaoDeclarada() throws ErroCompilacao {
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,12 @@ public void testVetorCadeiaNaoInicializado() throws Exception
comparaCodigos();
}

@Test
public void testVetorComTamanhoExpressao() throws Exception
{
comparaCodigos();
}

@Test
public void testMatrizCadeiaNaoInicializada() throws Exception
{
Expand Down
Loading

0 comments on commit 3e32234

Please sign in to comment.