PLP – Extensão da LI2 Implementação de ARRAY Emanuella Aleixo ( [email protected]) José Antônio ([email protected]) Juliana Mafra ([email protected]) Marcela Balbino ([email protected]) Prof.: Augusto Sampaio Nova BNF Programa ::= Comando Comando ::= Atribuicao | ComandoDeclaracao | While | IfThenElse | IO | Comando ";" Comando | Skip | ChamadaProcedimento Skip ::= Atribuicao ::= IdAbstrato “:=” Expressao IdAbstrato ::= Id | Indexacao Expressao ::= Valor | ExpUnaria | ExpBinaria | IdAbstrato Valor ::= ValorConcreto ValorConcreto ::= ValorInteiro | ValorBooleano | ValorString | ValorArray ValorArray ::= “{” ListaExpressao “}” 2/11 Nova BNF (cont.) ExpUnaria ::= "-" Expressao | "not" Expressao | "length" Expressao ExpBinaria ::= Expressao "+" Expressao | Expressao "-" Expressao | Expressao "and" Expressao | Expressao "or" Expressao | Expressao "==" Expressao | Expressao "++" Expressao Indexacao ::= Id “[“ Expressao “]” ComandoDeclaracao :: = "{" Declaracao ";" Comando "}" Declaracao ::= DeclaracaoVariavel | DeclaracaoProcedimento | DeclaracaoComposta DeclaracaoVariavel ::= "var" Id "=" Expressao | "array" Id "=" Expressao DeclaracaoComposta ::= Declaracao "," Declaracao 3/11 Nova BNF (cont.) DeclaracaoProcedimento ::= "proc" Id "(" [ ListaDeclaracaoParametro ] ")" "{" Comando "}" ListaDeclaracaoParametro ::= Tipo Id | Tipo Id "," ListaDeclaracaoParametro Tipo ::= "string" | "int" | "boolean" | "TipoArray" While ::= "while" Expressao "do" Comando IfThenElse ::= "if" Expressao "then" Comando "else" Comando IO ::= "write" "(" Expressao ")" | "read" "(" IdAbstrato ")" ChamadaProcedimento ::= "call" Id "(" [ ListaExpressao ] ")" ListaExpressao ::= Expressao | Expressao, ListaExpressao 4/11 Classes Alteradas • Tipo (plp.expressions1.util) - private Tipo tipoInterno; - Novo tipo -> TIPO_ARRAY - public boolean eArray() 5/11 Classes Alteradas • Lista (plp.imperative1.util) Foi alterada da forma funcional (head, tail) para forma indexada, para melhor representação de array. 6/11 Classes Alteradas • Atribuicao (plp.imperative1.command) - Método executar : a[2+3]:= Expressao Checa se o IdAbstrato é uma Indexação * Recupera, em uma lista, os elementos do array * Seta o índice * Valida o índice * lista.set(indice, expressao.avaliar(ambiente)); * ambiente.changeValor(indexacao.getId(), lista); 7/11 Classes Alteradas • DeclaracaoVariavel (plp.imperative1.declaration) - private boolean isArray; (no const. isArray = false) - Método checaTipo if (isArray) { Tipo tipoInterno = ((ValorArray)parametro2).getTipoInterno(ambiente); ambiente.map(parametro1, parametro2.getTipo(ambiente)); parametro1.getTipo(ambiente).setTipoInterno(tipoInterno); } 8/11 Classes Criadas • IdAbstrato (plp.expressions2.expressions) • ValorArray (plp.imperative3) - extends ValorConcreto - Método checaTipo Checa se os elementos da ListaExpressao são todos do mesmo tipo. Ex.: {1, 2+3, 5, true} - Método getTipoInterno Retorna o tipo do primeiro elemento da lista. 9/11 Classes Criadas • ValorArray (plp.imperative3) (cont.) - Método get (int indice) Retorna o elemento correspondente. - Método size Retorna o tamanho da lista, ou seja, o número de elementos do array. - Método set(int indice, Expressao exp) Armazena o valor da expressão na posição indicada pelo índice. 10/11 Classes Criadas • Indexacao (plp.imperative3) - implements IdAbstrato - Método avaliar ValorArray lista = (ValorArray) amb.get(id); indice = getIndice(amb); Valida o índice return (Valor) lista.get(indice); - Método checaTipo id.checaTipo(amb) && exp.checaTipo(amb) && exp.getTipo(amb).eInteiro() 11/11 Dúvidas ? 12