ExpLink
Declaration
let var x=$ele(assets,$5.0-dolar) in
let var z=$ele(aleatoryelement,$7.0-dolar) in
[implementation files]
ExpLink.java
package lf1.plp.expressions2.expression;
import java.util.ArrayList;
import lf1.plp.expressions1.util.Tipo;
import lf1.plp.expressions1.util.TipoPrimitivo;
import lf1.plp.expressions2.expression.financialtype.Element;
import lf1.plp.expressions2.expression.financialtype.Monetary;
import lf1.plp.expressions2.memory.AmbienteCompilacao;
import lf1.plp.expressions2.memory.AmbienteExecucao;
import lf1.plp.expressions2.memory.VariavelJaDeclaradaException;
import lf1.plp.expressions2.memory.VariavelNaoDeclaradaException;
/**
* @author Marcio Alexandre (maps3@cin.ufpe.br)
* @since 25 apr 2017
* @version Esta classe conecta duas variaveis e, se conectado com sucesso retorna true se não, false.
* @see https://www.w3.org/2009/03/xbrl/soi/LMDQL.pdf
*/
public class ExpLink extends ExpBinaria {
public ExpLink(Expressao esq, Expressao dir) {
super(esq, dir, "@");
}
public Valor sumTotalBefore(AmbienteExecucao amb, Element eleEsq, Element eleDir){
//eleEsq (filho/after) -> eleDir (pai/before)
Valor valor = null;
try{
eleDir.setAfterElementArr(eleEsq);
eleEsq.setBeforeElement(eleDir);
Valor value = null;
//soma eleDir com o valor de eleEsq
switch(eleDir.getValue().getClass().getName()){
case "lf1.plp.expressions2.expression.financialtype.Monetary":
//System.out.println("Case 1");
String tipoEsq = ((Monetary) eleEsq.getValue()).getMoeda() ;
String tipoDir = ((Monetary) eleDir.getValue()).getMoeda() ;
if (tipoEsq.equals(tipoDir)){
Monetary m = new Monetary();
m.setValor(
((Monetary) eleEsq.getValue()).getValor() +
((Monetary) eleEsq.getValue()).getValor()
);
m.setMoeda(tipoEsq);
eleDir.setValue(m);
}else{
System.out.println("Differents variable type"+tipoEsq.toString()+" and "+tipoDir.toString());
throw new Exception("Differents variable type"+tipoEsq.toString()+" and "+tipoDir.toString());
}
break;
}
if (eleDir != null){
valor = new ValorElement(eleDir);
}
valor = new ValorBooleano(true);
}catch(Exception e){
System.out.println("ExpLink.java - Erro (sumTotalBefore): "+e.getMessage());
e.printStackTrace();
valor = new ValorBooleano(false);
}
//verifica se tem elementos-pai
if (eleDir.getBeforeElement() != null){
//eleDir se torna filho e será enviado como eleEsq
this.sumTotalBefore(amb, eleDir, eleDir.getBeforeElement());
}
return valor;
}
@Override
public Valor avaliar(AmbienteExecucao amb) throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException {
ValorElement valEle = null;
Element eleEsq = ((ValorElement) getEsq().avaliar(amb)).getElement(); //kid element
Element eleDir = ((ValorElement) getDir().avaliar(amb)).getElement(); //dad element
if (eleEsq != null && eleDir != null){
Valor result = this.sumTotalBefore(amb, eleEsq, eleDir);
if (!result.equals(false)){
valEle = new ValorElement(eleDir);
}else{
System.out.println("[ExpLink.java] [avaliar] Resultado inesperado: "+result);
}
}
return valEle;
}
@Override
public Tipo getTipo(AmbienteCompilacao amb) throws VariavelNaoDeclaradaException,
VariavelJaDeclaradaException {
return TipoPrimitivo.BOOLEANO;
}
@Override
protected boolean checaTipoElementoTerminal(AmbienteCompilacao amb)
throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException {
return (getEsq().getTipo(amb).eElement() && getDir().getTipo(amb).eElement());
}
@Override
public ExpBinaria clone() {
return new ExpLink(esq.clone(), dir.clone());
}
}
Functional1.jj
(...)
import lf1.plp.expressions2.expression.ExpLink;
(...)
else if (val instanceof ValorElement)
{
ValorElement valElement = (ValorElement) val;
System.out.println("Funcional 1 PLP Parser Version 0.0.1: resultado= ");
System.out.println(":: "+valElement.valor().toString());
System.out.print(":::: ");
for (Element ele : valElement.valor().getAfterElementArr()) {
System.out.println(ele.toString());
}
(...)
| < LINK: "@" >
(...)
| < LINK > param2 = PExpBinaria3()
{
retorno = new ExpLink(retorno, param2);
}
(...)