Skip to content

Commit

Permalink
Composite na LF3
Browse files Browse the repository at this point in the history
  • Loading branch information
ros3cin committed Jun 2, 2016
1 parent f91fa53 commit c60d5f9
Show file tree
Hide file tree
Showing 10 changed files with 167 additions and 521 deletions.
2 changes: 1 addition & 1 deletion Funcional3/input
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ else let var x = head xxs, var xs = tail xxs in
(if p(x) then x : filter(p, xs)
else filter(p,xs)) in
let fun positivo x = x > 0 in
filter(positivo, [1,2,5,0,-2,-3])
filter(positivo, [1,2,5,0,-2,-3,7,8,6,4,6,5])
35 changes: 31 additions & 4 deletions Funcional3/src/lf3/plp/functional1/declaration/DecVariavel.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
package lf3.plp.functional1.declaration;

import java.util.Map;

import lf3.plp.expressions1.util.Tipo;
import lf3.plp.expressions2.expression.Expressao;
import lf3.plp.expressions2.expression.Id;
import lf3.plp.expressions2.expression.Valor;
import lf3.plp.expressions2.memory.AmbienteCompilacao;
import lf3.plp.expressions2.memory.AmbienteExecucao;
import lf3.plp.expressions2.memory.VariavelJaDeclaradaException;
import lf3.plp.expressions2.memory.VariavelNaoDeclaradaException;
import lf3.plp.functional2.expression.ValorFuncao;

public class DecVariavel implements DeclaracaoFuncional {
private Id id;
Expand All @@ -16,10 +21,6 @@ public DecVariavel(Id idArg, Expressao expressaoArg) {
expressao = expressaoArg;
}

public int getAridade() {
return 0;
}

/**
* Retorna uma representacao String desta expressao. Util para depuracao.
*
Expand Down Expand Up @@ -76,6 +77,32 @@ public boolean checaTipo(AmbienteCompilacao ambiente)
return expressao.checaTipo(ambiente);
}


public void elabora(AmbienteExecucao amb, Map<Id, Valor> declaracoes, Map<Id, ValorFuncao> declaracoesFuncoes) throws VariavelJaDeclaradaException {
declaracoes.put(getId(), getExpressao().avaliar(amb));
}


public void elabora(AmbienteCompilacao amb, Map<Id, Tipo> tipos) throws VariavelJaDeclaradaException {
tipos.put(getId(), getTipo(amb));
}


public void incluir(AmbienteExecucao amb, Map<Id, Valor> declaracoes,
Map<Id, ValorFuncao> declaracoesFuncoes) throws VariavelJaDeclaradaException {
amb.map(getId(), declaracoes.get(getId()));
}


public void incluir(AmbienteCompilacao amb, Map<Id, Tipo> tipos, boolean incluirCuringa) throws VariavelJaDeclaradaException {
amb.map(getId(), tipos.get(getId()));
}


public void reduzir(AmbienteExecucao amb) {
amb.map(getId(), null);
}

public DecVariavel clone() {
return new DecVariavel(this.id.clone(), this.expressao.clone());
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,43 +1,18 @@
package lf3.plp.functional1.declaration;

import java.util.Map;

import lf3.plp.expressions1.util.Tipo;
import lf3.plp.expressions2.expression.Expressao;
import lf3.plp.expressions2.expression.Id;
import lf3.plp.expressions2.expression.Valor;
import lf3.plp.expressions2.memory.AmbienteCompilacao;
import lf3.plp.expressions2.memory.AmbienteExecucao;
import lf3.plp.expressions2.memory.VariavelJaDeclaradaException;
import lf3.plp.expressions2.memory.VariavelNaoDeclaradaException;
import lf3.plp.functional2.expression.ValorFuncao;

public interface DeclaracaoFuncional {

public Id getId();

/**
* Retorna a aridade da funcao declarada. Variaveis tem aridade 0.
*
* @return a aridade da funcao declarada.
*/
public int getAridade();

/**
* Retorna a expressao associada.
*
* @return a expressao associada.
*/
public Expressao getExpressao();

/**
* Realiza a verificacao de tipos desta declara��o.
*
* @param amb o ambiente de compila��o.
* @return <code>true</code> se os tipos da expressao sao validos;
* <code>false</code> caso contrario.
* @exception VariavelNaoDeclaradaException se existir um identificador
* nao declarado no ambiente.
* @exception VariavelNaoDeclaradaException se existir um identificador
* declarado mais de uma vez no mesmo bloco do ambiente.
*/
public boolean checaTipo(AmbienteCompilacao ambiente)
throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException;

/**
* Retorna os tipos possiveis desta declara��o.
Expand All @@ -51,8 +26,14 @@ public boolean checaTipo(AmbienteCompilacao ambiente)
* vari&aacute;vel declarada duas vezes no mesmo bloco do
* ambiente.
*/
Tipo getTipo(AmbienteCompilacao amb)
throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException;

public boolean checaTipo(AmbienteCompilacao ambiente) throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException;
public void elabora(AmbienteExecucao amb, Map<Id,Valor> declaracoes, Map<Id,ValorFuncao> declaracoesFuncoes) throws VariavelJaDeclaradaException;
public void elabora(AmbienteCompilacao amb, Map<Id, Tipo> tipos) throws VariavelJaDeclaradaException;
public void incluir(AmbienteExecucao amb, Map<Id,Valor> declaracoes, Map<Id,ValorFuncao> declaracoesFuncoes) throws VariavelJaDeclaradaException;
public void incluir(AmbienteCompilacao amb, Map<Id, Tipo> tipos, boolean incluirCuringa) throws VariavelJaDeclaradaException;
public void reduzir(AmbienteExecucao amb);


public DeclaracaoFuncional clone();
}
42 changes: 41 additions & 1 deletion Funcional3/src/lf3/plp/functional2/declaration/DecFuncao.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,14 @@

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import lf3.plp.expressions1.util.Tipo;
import lf3.plp.expressions2.expression.Expressao;
import lf3.plp.expressions2.expression.Id;
import lf3.plp.expressions2.expression.Valor;
import lf3.plp.expressions2.memory.AmbienteCompilacao;
import lf3.plp.expressions2.memory.AmbienteExecucao;
import lf3.plp.expressions2.memory.VariavelJaDeclaradaException;
import lf3.plp.expressions2.memory.VariavelNaoDeclaradaException;
import lf3.plp.functional1.declaration.DeclaracaoFuncional;
Expand Down Expand Up @@ -60,7 +63,7 @@ public ValorFuncao getFuncao() {
*
* @return a aridade da funcao declarada.
*/
public int getAridade() {
private int getAridade() {
return valorFuncao.getAridade();
}

Expand Down Expand Up @@ -132,4 +135,41 @@ public void setValorFuncao(ValorFuncao valorFuncao) {
public DecFuncao clone() {
return new DecFuncao(this.id.clone(), this.valorFuncao.clone());
}

@Override
public void elabora(AmbienteExecucao amb, Map<Id, Valor> declaracoes,
Map<Id, ValorFuncao> declaracoesFuncoes) throws VariavelJaDeclaradaException {
declaracoesFuncoes.put(getId(), getFuncao());

//passos a mais
AmbienteExecucao ambienteClone = amb.clone();
ambienteClone.incrementa();
ambienteClone.map(getId(), getFuncao());
getFuncao().setId(getId());
}

@Override
public void elabora(AmbienteCompilacao amb, Map<Id, Tipo> tipos) throws VariavelJaDeclaradaException {
tipos.put(getId(), getTipo(amb));

}

@Override
public void incluir(AmbienteExecucao amb, Map<Id, Valor> declaracoes,
Map<Id, ValorFuncao> declaracoesFuncoes) throws VariavelJaDeclaradaException {
amb.map(getId(), declaracoesFuncoes.get(getId()));

}

@Override
public void incluir(AmbienteCompilacao amb, Map<Id, Tipo> tipos, boolean incluirCuringa) throws VariavelJaDeclaradaException {
boolean ehCuringa = (tipos.get(getId()) == TipoPolimorfico.CURINGA);
boolean incluir = (ehCuringa&&incluirCuringa) || (!ehCuringa);
if(incluir) amb.map(getId(), tipos.get(getId()));
}

@Override
public void reduzir(AmbienteExecucao amb) {
setValorFuncao((ValorFuncao)getFuncao().reduzir(amb));
}
}
Loading

0 comments on commit c60d5f9

Please sign in to comment.