310 likes | 401 Views
Reestruturação das Linguagens da Disciplina “Paradigmas de Linguagens de Programação” para Java 1.5. Alunos: Angelo Ribeiro (arnpr) Eduardo Tavares (eagt) Euclides Neto (enan) Prof.: Augusto Sampaio (acas). Roteiro.
E N D
Reestruturação das Linguagens da Disciplina “Paradigmas de Linguagens de Programação” para Java 1.5 Alunos: Angelo Ribeiro (arnpr) Eduardo Tavares (eagt) Euclides Neto (enan) Prof.: Augusto Sampaio (acas)
Roteiro • Ferramentas de Auxílio para a disciplina(Eclipse/CVS); • Reestruturação das Linguagens(Java 1.5): • Expressão1; • Expressão2; • Funcional1; • Funcional2; • Próximos passos
Ferramenta de Auxílio para a Disciplina • Configuração de um repositório de dados • CVS • Definição de um ambiente de desenvolvimento: • Eclipse • Plugin JavaCC
Reestruturação da Linguagem • Generics • “Foreach” • Autoboxing/Unboxing • Enumerations • Varargs • Static Import • Metadata (Annotations)
Generics • Generics permite a parametrização de classes. • Diferentemente de C++, Generics não é template.
Foreach • É uma forma de iteragir sobre Coleções mais clara e segura quando comparado ao for tradicional void cancelAll(Collection c) { for (Iterator i = c.iterator(); i.hasNext(); ) { TimerTask tt = (TimerTask) i.next(); tt.cancel(); } } void cancelAll(Collection c) { for (Object o : c) ((TimerTask)o).cancel(); } void cancelAll(Collection<TimerTask> c) { for (TimerTask task : c) task.cancel(); }
Autoboxing/Unboxing • Conversão automática de tipos primitivos para wrapper classes. Integer io = new Integer(1); int i = io.intValue(); i = io;
Expressao 1 • Generics: • Parametrização da classe ValorConcreto • Objetivo: Reutilização do código dos valores terminais se encontravam duplicados (ValorInteiro, ValorBooleano e ValorString)
Expressao 1 • ValorConcreto (Antes)
Expressao 1 • ValorBooleano (Antes)
Expressao 1 • ValorBooleano (Depois)
Expressao 1 • ValorConcreto (Depois)
Expressao 2 • Generics: • Parametrização da interface Ambiente • Parametrização de todas as collections (Lists, Maps, HashMaps) para utlização dos ForEach • Objetivo: Reutilização de código (AmbienteExecucao, AmbienteCompilacao)
Expressao 2 • Ambiente Antes public interface Ambiente { public void incrementa(); public void restaura(); } public interface AmbienteCompilacao extends Ambiente { public void mapTipo( Id idArg, Tipo tipoId) throws ... public Tipo getTipo( Id idArg ) throws ... } public interface AmbienteExecucao extends Ambiente { public void mapValor( Id idArg, Valor tipoId) throws ... public Valor getValor( Id idArg ) throws ... }
Expressao 2 • Ambiente Depois public interface Ambiente<T> { ... public void map( Id idArg, T tipoId) throws VariavelJaDeclaradaException; public T get( Id idArg ) throws VariavelNaoDeclaradaException; } public interface AmbienteCompilacao extends Ambiente<Tipo> { } public interface AmbienteExecucao extends Ambiente<Valor> { }
Expressao 2 • Criação Contexto AbstratoExistiam Contextos Compilação e Contexto Execução. Foi criado o Contexto como classe abstrata parametrizada.
Expressao 2 • Código Contexto public abstract class Contexto<T> { /** * A pilhaValor de blocos de contexto. */ private Stack<HashMap<Id,T>> pilha; /** * Construtor da classe. */ public Contexto() { pilha = new Stack<HashMap<Id,T>>(); } public void incrementa(){ pilha.push(new HashMap<Id,T>()); } public void restaura(){ pilha.pop(); }
Expressao 2 • Foreach: • Utilização de ForEach nas iterações com as coleções (ExpDeclaracao).
Expressao 2 • Exemplo for antes: private void includeValueBindings(AmbienteExecucao ambiente, Map resolvedValues) throws VariavelJaDeclaradaException { for (Iterator e = resolvedValues.keySet().iterator(); e.hasNext(); ) { Id id = (Id) e.next(); Valor valor = (Valor) resolvedValues.get(id); ambiente.mapValor(id, valor); } }
Expressao 2 • Exemplo for depois: private void includeValueBindings(AmbienteExecucao ambiente, Map<Id,Valor> resolvedValues) throws VariavelJaDeclaradaException { for (Id id : resolvedValues.keySet() ){ Valor valor = resolvedValues.get(id); ambiente.map(id, valor); } }
Funcional 1 • Dentre as modificações anteriores feitas, na funcional 1 tivemos como uma das principais modificações a parametrização da Lista de Id’s, modificando direto no parser javacc (.jj);
Funcional 1 • Funcional1.jj antes List PListaId() : .... if (retorno == null) { retorno = new ArrayList(); retorno.add(id); } else { retorno.add(id); } .... }
Funcional 1 • Funcional1.jj depois List PListaId() : { List<Id> retorno = null; Id id; ...... retorno = new ArrayList<Id>(); retorno.add(id); } else { retorno.add(id); } ……. }
Funcional 1 • ValorFuncao antes private List argsId; public boolean checaTipo(AmbienteCompilacao ambiente) throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { ambiente.incrementa(); Tipo t = getTipo(ambiente); for (Iterator iterArgsId = this.argsId.iterator(); iterArgsId.hasNext(); ) { Id id = (Id) iterArgsId.next(); ambiente.mapTipo(id, new Tipo(t.getTipo())); t = t.getProx(); } ambiente.restaura(); return true; }
Funcional 1 • ValorFuncao depois private List<Id> argsId; public boolean checaTipo(AmbienteCompilacao ambiente) throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { ambiente.incrementa(); Tipo t = getTipo(ambiente); for (Id id : argsId) { ambiente.map(id, new Tipo(t.get())); t = t.getProx(); } ambiente.restaura(); return true; }
Funcional 2 • Parametrização das coleções/arrays das novas classes ValorFuncao, ExpDeclaracao. • Arrumar a classe Exemplos para que ele possa rodar.
Funcional 2 • ValorFuncao antes: public class ValorFuncao implements ValorAbstrato { private List argsId; public boolean checaTipo(AmbienteCompilacao ambiente) throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { ambiente.incrementa(); Tipo t = getTipo(ambiente); for (Iterator iterArgsId = this.argsId.iterator(); iterArgsId.hasNext(); ) { Id id = (Id) iterArgsId.next(); ambiente.mapTipo(id, new Tipo(t.getTipo())); t = t.getProx(); } ambiente.restaura(); return true; }
Funcional 2 • ValorFuncao depois: public class ValorFuncao implements ValorAbstrato { private List<Id> argsId; public boolean checaTipo(AmbienteCompilacao ambiente) throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException { ambiente.incrementa(); Tipo t = getTipo(ambiente); for(Id id:this.argsId){ ambiente.map(id, new Tipo(t.get())); t = t.getProx(); } ambiente.restaura(); return true; }
Funcional 2 • Impressão Valor Função: Alteração do .jj e Classe Valor Função • Antes: ValorFuncao valFunc = (ValorFuncao) val; System.out.println("Funcional 2 PLP Parser Version 0.0.1: resultado = funcao"); public String toString() { StringBuffer sb = new StringBuffer(); sb.append("fn "); List<Id> listaId = getListaId(); if (listaId != null) { for (Id id : listaId) { sb.append(id.toString() + " "); } } sb.append(". "); sb.append(exp.toString()); return sb.toString(); } • Depois: ValorFuncao valFunc = (ValorFuncao) val; System.out.println("Funcional 2 PLP Parser Version 0.0.1: resultado = " + val);
Próximos Passos • Alteração das outras Linguagens; • Atualização do site ou Construção de documentação via Doxygen; • Verificar utilização de Enumeration na classe Tipo;