]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/planning/QueryPlanningContext.java
CHR query translation and support for assignment in CHR bodies
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / chr / planning / QueryPlanningContext.java
index 537a2aa9dca73a0495b7eb794d8f7c5abf16bef0..56d436f5573f592325a99e5ca93042c2656a7c0f 100644 (file)
@@ -8,6 +8,7 @@ import org.simantics.scl.compiler.elaboration.chr.CHRLiteral;
 import org.simantics.scl.compiler.elaboration.chr.plan.AccessFactOp;
 import org.simantics.scl.compiler.elaboration.chr.plan.ClaimOp;
 import org.simantics.scl.compiler.elaboration.chr.plan.ExecuteOp;
+import org.simantics.scl.compiler.elaboration.chr.plan.MatchOp;
 import org.simantics.scl.compiler.elaboration.chr.plan.PlanOp;
 import org.simantics.scl.compiler.elaboration.chr.planning.items.CheckPrePlanItem;
 import org.simantics.scl.compiler.elaboration.chr.planning.items.EqualsPrePlanItem;
@@ -22,6 +23,7 @@ import org.simantics.scl.compiler.elaboration.expressions.ELiteral;
 import org.simantics.scl.compiler.elaboration.expressions.EVariable;
 import org.simantics.scl.compiler.elaboration.expressions.Expression;
 import org.simantics.scl.compiler.elaboration.expressions.Variable;
+import org.simantics.scl.compiler.errors.Locations;
 
 import gnu.trove.impl.Constants;
 import gnu.trove.map.hash.TObjectIntHashMap;
@@ -64,6 +66,8 @@ public class QueryPlanningContext {
             case MEMBER:
                 addMember(literal.location, literal.parameters[0], literal.parameters[1], secondaryPriority);
                 return;
+            case ASSIGN:
+                throw new InternalCompilerError(literal.location, "ASSIGN constraint is not allowed in query compilation.");
             case EXECUTE:
                 throw new InternalCompilerError(literal.location, "EXECUTE constraint is not allowed in query compilation.");
             }
@@ -223,6 +227,10 @@ public class QueryPlanningContext {
         for(int i=0;i<literal.parameters.length;++i)
             addOneSidedEquals(literal.parameters[i].location, new EVariable(variables[i]), literal.parameters[i], secondaryPriority);
     }
+    
+    public void addInitFact(CHRConstraint initConstraint, Expression inputFact) {
+        planOps.add(new AccessFactOp(Locations.NO_LOCATION, inputFact, initConstraint, Variable.EMPTY_ARRAY, false));
+    }
 
     public void claim(QueryPlanningContext context, CHRLiteral literal) {
         if(literal.relation instanceof CHRConstraint) {
@@ -234,6 +242,9 @@ public class QueryPlanningContext {
             case EXECUTE:
                 addPlanOp(new ExecuteOp(literal.location, literal.parameters[0]));
                 break;
+            case ASSIGN:
+                addPlanOp(new MatchOp(literal.location, literal.parameters[1], literal.parameters[0]));
+                break;
             default:
                 context.getCompilationContext().errorLog.log(
                         literal.location,