package org.simantics.scl.compiler.elaboration.chr.translation; import java.util.ArrayList; import java.util.Arrays; import org.simantics.scl.compiler.elaboration.chr.CHRLiteral; import org.simantics.scl.compiler.elaboration.chr.CHRQuery; import org.simantics.scl.compiler.elaboration.chr.CHRRule; import org.simantics.scl.compiler.elaboration.chr.relations.CHRConstraint; import org.simantics.scl.compiler.elaboration.chr.relations.SpecialCHRRelation; import org.simantics.scl.compiler.elaboration.chr.relations.UnresolvedCHRRelation; import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; import org.simantics.scl.compiler.elaboration.expressions.EApply; import org.simantics.scl.compiler.elaboration.expressions.EBinary; import org.simantics.scl.compiler.elaboration.expressions.EVar; import org.simantics.scl.compiler.elaboration.expressions.Expression; import org.simantics.scl.compiler.elaboration.expressions.block.CHRStatement; import org.simantics.scl.compiler.elaboration.expressions.block.ConstraintStatement; import org.simantics.scl.compiler.elaboration.expressions.list.ListAssignment; import org.simantics.scl.compiler.elaboration.expressions.list.ListGenerator; import org.simantics.scl.compiler.elaboration.expressions.list.ListGuard; import org.simantics.scl.compiler.elaboration.expressions.list.ListQualifier; import org.simantics.scl.compiler.environment.AmbiguousNameException; import org.simantics.scl.compiler.environment.Environments; import org.simantics.scl.compiler.errors.Locations; import org.simantics.scl.compiler.internal.parsing.types.TypeAst; public class CHRTranslation { private static CHRLiteral convertExpression(boolean isHead, Expression expression) { if(isHead) return new CHRLiteral(expression.location, SpecialCHRRelation.CHECK, new Expression[] {expression}, false, false); else return new CHRLiteral(expression.location, SpecialCHRRelation.EXECUTE, new Expression[] {expression}, false, false); } private static CHRLiteral convertConstraint(boolean remove, boolean negated, Expression expression) { ArrayList parameters = new ArrayList(4); while(expression instanceof EApply) { EApply apply = (EApply)expression; for(int i=apply.parameters.length-1;i>=0;--i) parameters.add(apply.parameters[i]); expression = apply.function; } EVar var = (EVar)expression; Expression[] parametersArray = new Expression[parameters.size()]; for(int i=0,j=parametersArray.length-1;i head = new ArrayList(statement.head.length); for(ListQualifier qualifier : statement.head) { CHRLiteral literal = convertListQualifier(context, true, qualifier); if(literal != null) head.add(literal); } ArrayList body = new ArrayList(statement.body.length); for(ListQualifier qualifier : statement.body) { CHRLiteral literal = convertListQualifier(context, false, qualifier); if(literal != null) body.add(literal); } return new CHRRule(statement.location, new CHRQuery(head.toArray(new CHRLiteral[head.size()])), new CHRQuery(body.toArray(new CHRLiteral[body.size()])), null); } public static CHRConstraint convertConstraintStatement(TranslationContext context, ConstraintStatement statement) { return new CHRConstraint(statement.location, statement.name.text, TypeAst.toTypes(context, statement.parameterTypes)); } }