ExpLink

Declaration

let var x=$ele(assets,$5.0-dolar) in

let var z=$ele(aleatoryelement,$7.0-dolar) in

z@x

[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);

}

(...)