From a11a34df27dcdfa444c7a25f962c67f9d1480635 Mon Sep 17 00:00:00 2001 From: Marcel Reboucas Date: Tue, 19 Apr 2016 12:25:24 -0300 Subject: [PATCH] Adicionando modificacoes sugeridas por augusto --- Funcional1/input | 4 +- .../expressions2/memory/ContextoExecucao.java | 5 +- .../memory/ContextoExecucaoFuncional.java | 73 ++++++++++--------- .../functional1/memory/ContextoFuncional.java | 32 ++++++++ Funcional2/input | 2 +- .../functional3/expression/ValorFuncao.java | 2 +- 6 files changed, 75 insertions(+), 43 deletions(-) create mode 100644 Funcional1/src/plp/functional1/memory/ContextoFuncional.java diff --git a/Funcional1/input b/Funcional1/input index cca7fbf..9770f53 100644 --- a/Funcional1/input +++ b/Funcional1/input @@ -1,2 +1,2 @@ -let fun soma x y = x + y in - soma(5,4) \ No newline at end of file +let fun soma x y = x + y, fun suc z = z+1 in + soma(5,suc(1)) \ No newline at end of file diff --git a/Funcional1/src/plp/expressions2/memory/ContextoExecucao.java b/Funcional1/src/plp/expressions2/memory/ContextoExecucao.java index e23a961..a91b742 100644 --- a/Funcional1/src/plp/expressions2/memory/ContextoExecucao.java +++ b/Funcional1/src/plp/expressions2/memory/ContextoExecucao.java @@ -1,19 +1,18 @@ package plp.expressions2.memory; import java.util.HashMap; -import java.util.Stack; import java.util.Map.Entry; +import java.util.Stack; import plp.expressions2.expression.Id; import plp.expressions2.expression.Valor; -import plp.functional1.memory.ContextoExecucaoFuncional; public class ContextoExecucao extends Contexto implements AmbienteExecucao { public ContextoExecucao clone() { - ContextoExecucaoFuncional retorno = new ContextoExecucaoFuncional(); + ContextoExecucao retorno = new ContextoExecucao(); Stack> novaPilha = new Stack>(); diff --git a/Funcional1/src/plp/functional1/memory/ContextoExecucaoFuncional.java b/Funcional1/src/plp/functional1/memory/ContextoExecucaoFuncional.java index f641ca7..b5f1c26 100644 --- a/Funcional1/src/plp/functional1/memory/ContextoExecucaoFuncional.java +++ b/Funcional1/src/plp/functional1/memory/ContextoExecucaoFuncional.java @@ -1,39 +1,58 @@ package plp.functional1.memory; -import java.util.HashMap; -import java.util.Stack; - import plp.expressions2.expression.Id; +import plp.expressions2.expression.Valor; import plp.expressions2.memory.ContextoExecucao; import plp.expressions2.memory.VariavelJaDeclaradaException; import plp.expressions2.memory.VariavelNaoDeclaradaException; import plp.functional1.util.DefFuncao; -public class ContextoExecucaoFuncional extends ContextoExecucao - implements AmbienteExecucaoFuncional { - - /** - * A pilha de blocos de funcao deste contexto. - */ - private Stack> pilhaFuncao; +public class ContextoExecucaoFuncional implements AmbienteExecucaoFuncional { + private ContextoExecucao contextoExecucao; + private ContextoFuncional contextoFuncional; + /** * Construtor da classe. */ public ContextoExecucaoFuncional() { - pilhaFuncao = new Stack>(); + contextoExecucao = new ContextoExecucao(); + contextoFuncional = new ContextoFuncional(); } public void incrementa() { - super.incrementa(); - pilhaFuncao.push(new HashMap()); + contextoExecucao.incrementa(); + contextoFuncional.incrementa(); } public void restaura() { - super.restaura(); - pilhaFuncao.pop(); + contextoExecucao.restaura(); + contextoFuncional.restaura(); } - + + /** + * Mapeia o id no valor dado. + * + * @exception VariavelJaDeclaradaException + * se já existir um mapeamento do identificador nesta tabela. + */ + @Override + public void map(Id idArg, Valor tipoId) throws VariavelJaDeclaradaException { + contextoExecucao.map(idArg, tipoId); + } + + /** + * Retorna o valor mapeado ao id dado. + * + * @exception VariavelNaoDeclaradaException + * se não existir nenhum valor mapeado ao id dado nesta + * tabela. + */ + @Override + public Valor get(Id idArg) throws VariavelNaoDeclaradaException { + return contextoExecucao.get(idArg); + } + // Remover esse método. Já tem em ContextoExecucao /** * Mapeia um identificador em uma funcao. @@ -47,10 +66,7 @@ public void restaura() { */ public void mapFuncao(Id idArg, DefFuncao funcao) throws VariavelJaDeclaradaException { - HashMap aux = pilhaFuncao.peek(); - if (aux.put(idArg, funcao) != null) { - throw new VariavelJaDeclaradaException(idArg); - } + contextoFuncional.map(idArg, funcao); } // Remover esse método. Já tem em ContextoExecucao @@ -65,22 +81,7 @@ public void mapFuncao(Id idArg, DefFuncao funcao) * se o id nao estiver declarado. */ public DefFuncao getFuncao(Id idArg) throws VariavelNaoDeclaradaException { - DefFuncao result = null; - Stack> auxStack = - new Stack>(); - while (result == null && !pilhaFuncao.empty()) { - HashMap aux = pilhaFuncao.pop(); - auxStack.push(aux); - result = aux.get(idArg); - } - while (!auxStack.empty()) { - pilhaFuncao.push(auxStack.pop()); - } - if (result == null) { - throw new VariavelNaoDeclaradaException(idArg); - } - - return result; + return contextoFuncional.get(idArg); } public ContextoExecucaoFuncional clone() { diff --git a/Funcional1/src/plp/functional1/memory/ContextoFuncional.java b/Funcional1/src/plp/functional1/memory/ContextoFuncional.java new file mode 100644 index 0000000..2b66d50 --- /dev/null +++ b/Funcional1/src/plp/functional1/memory/ContextoFuncional.java @@ -0,0 +1,32 @@ +package plp.functional1.memory; + +import java.util.HashMap; +import java.util.Map.Entry; +import java.util.Stack; + +import plp.expressions2.expression.Id; +import plp.expressions2.memory.Ambiente; +import plp.expressions2.memory.Contexto; +import plp.functional1.util.DefFuncao; + +public class ContextoFuncional extends Contexto implements Ambiente { + + public ContextoFuncional clone() { + ContextoFuncional retorno = new ContextoFuncional(); + + Stack> novaPilha = new Stack>(); + + HashMap novoMap = new HashMap(); + novaPilha.add(novoMap); + + for (HashMap map : this.pilha){ + for(Entry entry : map.entrySet()){ + novoMap.put(entry.getKey(), entry.getValue()); + } + } + + retorno.setPilha(novaPilha); + + return retorno; + } +} diff --git a/Funcional2/input b/Funcional2/input index ec1c153..139ce2b 100644 --- a/Funcional2/input +++ b/Funcional2/input @@ -1,2 +1,2 @@ -let var a = fn x y. x + x in +let var a = fn x y. x + y, fun z c = c+c in a(1,2) \ No newline at end of file diff --git a/Funcional3/src/plp/functional3/expression/ValorFuncao.java b/Funcional3/src/plp/functional3/expression/ValorFuncao.java index 183aa1e..ac46114 100644 --- a/Funcional3/src/plp/functional3/expression/ValorFuncao.java +++ b/Funcional3/src/plp/functional3/expression/ValorFuncao.java @@ -1,4 +1,4 @@ -package plp.functional3.expression; + package plp.functional3.expression; import static plp.expressions1.util.ToStringProvider.listToString;