package org.overture.codegen.trans.iterator; import java.util.LinkedList; import java.util.List; import org.overture.codegen.cgast.SExpCG; import org.overture.codegen.cgast.SPatternCG; import org.overture.codegen.cgast.SStmCG; import org.overture.codegen.cgast.STypeCG; import org.overture.codegen.cgast.analysis.AnalysisException; import org.overture.codegen.cgast.declarations.AVarDeclCG; import org.overture.codegen.cgast.expressions.AAssignExpExpCG; import org.overture.codegen.cgast.expressions.ABoolLiteralExpCG; import org.overture.codegen.cgast.expressions.ACastUnaryExpCG; import org.overture.codegen.cgast.expressions.ADeRefExpCG; import org.overture.codegen.cgast.expressions.AEqualsBinaryExpCG; import org.overture.codegen.cgast.expressions.AIdentifierVarExpCG; import org.overture.codegen.cgast.expressions.ANewExpCG; import org.overture.codegen.cgast.expressions.ANotEqualsBinaryExpCG; import org.overture.codegen.cgast.expressions.APostIncExpCG; import org.overture.codegen.cgast.name.ATypeNameCG; import org.overture.codegen.cgast.patterns.AIdentifierPatternCG; import org.overture.codegen.cgast.statements.AAssignmentStmCG; import org.overture.codegen.cgast.statements.ALocalAssignmentStmCG; import org.overture.codegen.cgast.statements.ALocalPatternAssignmentStmCG; import org.overture.codegen.cgast.types.ABoolBasicTypeCG; import org.overture.codegen.ir.ITempVarGen; import org.overture.codegen.trans.TempVarPrefixes; import org.overture.codegen.trans.assistants.TransAssistantCG; public class CppVdmLibLanguageIterator implements ILanguageIterator { private String iteratorName; private String isEndName; private ITempVarGen tempGen; private TempVarPrefixes varPrefixes; private TransAssistantCG transformationAssistant; public CppVdmLibLanguageIterator(TransAssistantCG transformationAssistant, ITempVarGen tempGen, TempVarPrefixes varPrefixes) { //super(transformationAssistant, tempGen, varPrefixes); // TODO Auto-generated constructor stub this.tempGen = tempGen; this.varPrefixes = varPrefixes; this.transformationAssistant = transformationAssistant; } @Override public List<SStmCG> getPreForLoopStms(AIdentifierVarExpCG setVar, List<SPatternCG> patterns, SPatternCG pattern) { // TODO Auto-generated method stub iteratorName = tempGen.nextVarName(varPrefixes.getIteratorNamePrefix()); isEndName = tempGen.nextVarName(iteratorName+"has_next"); AIdentifierVarExpCG exp = new AIdentifierVarExpCG(); exp.setName(iteratorName); exp.setType(transformationAssistant.consClassType("Generic")); ALocalAssignmentStmCG s = new ALocalAssignmentStmCG(); s.setTarget(exp); List<SStmCG> li = new LinkedList<SStmCG>(); li.add(s); return li; } public AVarDeclCG getForLoopInit(AIdentifierVarExpCG setVar, List<SPatternCG> patterns, SPatternCG pattern) { AVarDeclCG iteratorDecl = new AVarDeclCG(); /* * Create set_var.First(iterator_var) * */ AIdentifierVarExpCG as = new AIdentifierVarExpCG(); try { as.setType(transformationAssistant.getSetTypeCloned(setVar).getSetOf()); } catch (AnalysisException e) { // TODO Auto-generated catch block e.printStackTrace(); } as.setName(iteratorName); SExpCG getFirstElemExp = transformationAssistant.consInstanceCall(setVar.getType().clone(), setVar.getName(), new ABoolBasicTypeCG(), "First", as); /*final Pattern * * Create bool isEnd = set_var.First(iterator_var) * */ AIdentifierPatternCG endName = new AIdentifierPatternCG(); endName.setName(isEndName); iteratorDecl.setPattern(endName); iteratorDecl.setType(new ABoolBasicTypeCG()); iteratorDecl.setExp(getFirstElemExp); return iteratorDecl; } public SExpCG getForLoopCond(AIdentifierVarExpCG setVar, List<SPatternCG> patterns, SPatternCG pattern) throws AnalysisException { AIdentifierVarExpCG isEndVar = new AIdentifierVarExpCG(); isEndVar.setType(new ABoolBasicTypeCG()); isEndVar.setName(isEndName); ABoolLiteralExpCG tr = new ABoolLiteralExpCG(); tr.setType(new ABoolBasicTypeCG()); tr.setValue(true); AEqualsBinaryExpCG eq = new AEqualsBinaryExpCG(); eq.setLeft(isEndVar); eq.setRight(tr); return eq; } public SExpCG getForLoopInc(AIdentifierVarExpCG setVar, List<SPatternCG> patterns, SPatternCG pattern) { AIdentifierVarExpCG isEndVar = new AIdentifierVarExpCG(); isEndVar.setType(new ABoolBasicTypeCG()); isEndVar.setName(isEndName); AIdentifierVarExpCG iterVar = new AIdentifierVarExpCG(); try { iterVar.setType(transformationAssistant.getSetTypeCloned(setVar).getSetOf()); } catch (AnalysisException e) { // TODO Auto-generated catch block e.printStackTrace(); } iterVar.setName(iteratorName); SExpCG getNext = null; try { getNext = transformationAssistant.consInstanceCall(setVar.getType().clone(), setVar.getName(), transformationAssistant.getSetTypeCloned(setVar).getSetOf(), "Next", iterVar); } catch (AnalysisException e) { // TODO Auto-generated catch block e.printStackTrace(); } AAssignExpExpCG has_next_assignment = new AAssignExpExpCG(); has_next_assignment.setTarget(isEndVar); has_next_assignment.setType(isEndVar.getType().clone()); has_next_assignment.setValue(getNext); return has_next_assignment; } public AVarDeclCG getNextElementDeclared(AIdentifierVarExpCG setVar, List<SPatternCG> patterns, SPatternCG pattern) throws AnalysisException { AVarDeclCG outer = new AVarDeclCG(); AIdentifierVarExpCG iterVar = new AIdentifierVarExpCG(); iterVar.setType(transformationAssistant.getSetTypeCloned(setVar).getSetOf()); iterVar.setName(iteratorName); // // ACastUnaryExpCG cast_to_value = new ACastUnaryExpCG(); cast_to_value.setExp(iterVar); cast_to_value.setType(transformationAssistant.getSetTypeCloned(setVar).getSetOf()); outer.setPattern(pattern); outer.setExp(cast_to_value); outer.setType(transformationAssistant.getSetTypeCloned(setVar).getSetOf()); return outer; } public ALocalPatternAssignmentStmCG getNextElementAssigned( AIdentifierVarExpCG setVar, List<SPatternCG> patterns, SPatternCG pattern, AVarDeclCG successVarDecl, AVarDeclCG nextElementDecl) throws AnalysisException { // AIdentifierVarExpCG as = new AIdentifierVarExpCG(); // try { // as.setType(transformationAssistant.getSetTypeCloned(setVar).getSetOf()); // } catch (AnalysisException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // as.setOriginal(iteratorName); // SExpCG getFirstElemExp = transformationAssistant.consInstanceCall(setVar.getType().clone(), // setVar.getOriginal(), // new ABoolBasicTypeCG(), // "Next", as); // // ALocalPatternAssignmentStmCG next = new ALocalPatternAssignmentStmCG(); // next.setExp(getFirstElemExp); // next.setTarget(pattern); return null; } @Override public SExpCG consNextElementCall(AIdentifierVarExpCG setVar) throws AnalysisException { // TODO Auto-generated method stub return null; } }