]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/ast/CHRAstQuery.java
(refs #7377) Refactoring CHR query parsing
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / chr / ast / CHRAstQuery.java
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/ast/CHRAstQuery.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/ast/CHRAstQuery.java
new file mode 100644 (file)
index 0000000..bd708e6
--- /dev/null
@@ -0,0 +1,28 @@
+package org.simantics.scl.compiler.elaboration.chr.ast;
+
+import java.util.ArrayList;
+
+import org.simantics.scl.compiler.elaboration.chr.CHRLiteral;
+import org.simantics.scl.compiler.elaboration.chr.CHRQuery;
+import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
+import org.simantics.scl.compiler.internal.parsing.Symbol;
+
+public abstract class CHRAstQuery extends Symbol {
+    public CHRQuery translateAsHead(TranslationContext context) {
+        return translate(context, true);
+    }
+    
+    public CHRQuery translateAsBody(TranslationContext context) {
+        return translate(context, false);
+    }
+
+    private CHRQuery translate(TranslationContext context, boolean isHead) {
+        ArrayList<CHRLiteral> literals = new ArrayList<CHRLiteral>(); 
+        translate(context, isHead, literals);
+        return new CHRQuery(literals.toArray(new CHRLiteral[literals.size()]));
+    }
+
+    protected abstract void translate(TranslationContext context, boolean isHead, ArrayList<CHRLiteral> literals);
+
+    public abstract void accept(CHRAstQueryVisitor visitor);
+}