X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Felaboration%2Fchr%2Ftranslation%2FCHRTranslation.java;fp=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Felaboration%2Fchr%2Ftranslation%2FCHRTranslation.java;h=14106711d0640499c5e6eda34a1f57b262f1becd;hb=a8758de5bc19e5adb3f618d3038743a164f09912;hp=0000000000000000000000000000000000000000;hpb=12d9af17384d960b75d58c3935d2b7b46d93e87b;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/translation/CHRTranslation.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/translation/CHRTranslation.java new file mode 100644 index 000000000..14106711d --- /dev/null +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/translation/CHRTranslation.java @@ -0,0 +1,142 @@ +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)); + } + +}