]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/StandardExpressionTransformer.java
(refs #7377) Refactoring CHR query parsing
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / StandardExpressionTransformer.java
index 5d1d2eb9544493172ee1cb24af7085734659998c..c489422a54ccd71fef05b073c77381d4c0622de7 100644 (file)
@@ -1,14 +1,25 @@
 package org.simantics.scl.compiler.elaboration.expressions;
 
 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.CHRRuleset;
+import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstAtom;
+import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstBinds;
+import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstConjunction;
+import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstEquals;
+import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstNegation;
+import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstQuery;
+import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstQueryVisitor;
 import org.simantics.scl.compiler.elaboration.equation.EqBasic;
 import org.simantics.scl.compiler.elaboration.equation.EqGuard;
 import org.simantics.scl.compiler.elaboration.equation.Equation;
 import org.simantics.scl.compiler.elaboration.equation.EquationVisitor;
 import org.simantics.scl.compiler.elaboration.expressions.accessor.ExpressionAccessor;
 import org.simantics.scl.compiler.elaboration.expressions.block.BindStatement;
+import org.simantics.scl.compiler.elaboration.expressions.block.CHRStatement;
 import org.simantics.scl.compiler.elaboration.expressions.block.GuardStatement;
+import org.simantics.scl.compiler.elaboration.expressions.block.IncludeStatement;
 import org.simantics.scl.compiler.elaboration.expressions.block.LetStatement;
 import org.simantics.scl.compiler.elaboration.expressions.block.RuleStatement;
 import org.simantics.scl.compiler.elaboration.expressions.block.Statement;
@@ -37,10 +48,12 @@ import org.simantics.scl.compiler.elaboration.query.pre.QPreGuard;
 
 public class StandardExpressionTransformer implements
 ExpressionTransformer, QueryTransformer, ListQualifierTransformer, StatementVisitor,
-EquationVisitor {
+EquationVisitor, CHRAstQueryVisitor {
 
     @Override
     public Expression transform(EAmbiguous expression) {
+        if(expression.resolvedExpression != null)
+            expression.resolvedExpression = expression.resolvedExpression.accept(this);
         return expression;
     }
 
@@ -117,17 +130,41 @@ EquationVisitor {
         statement.body = statement.body.accept(this);
     }
 
+    @Override
+    public void visit(IncludeStatement statement) {
+        statement.value = statement.value.accept(this);
+    }
+    
+    public void transform(CHRQuery query) {
+        for(CHRLiteral lit : query.literals)
+            for(int i=0;i<lit.parameters.length;++i)
+                lit.parameters[i] = lit.parameters[i].accept(this);
+    }
+    
+    public void transform(CHRRuleset ruleset) {
+        for(CHRRule rule : ruleset.rules) {
+            transform(rule.head);
+            transform(rule.body);
+        }
+    }
+    
     @Override
     public Expression transform(ECHRRuleset expression) {
         expression.in = expression.in.accept(this);
-        for(CHRRule rule : expression.ruleset.rules) {
-            for(CHRLiteral lit : rule.head.literals)
-                for(int i=0;i<lit.parameters.length;++i)
-                    lit.parameters[i] = lit.parameters[i].accept(this);
-            for(CHRLiteral lit : rule.body.literals)
-                for(int i=0;i<lit.parameters.length;++i)
-                    lit.parameters[i] = lit.parameters[i].accept(this);
-        }
+        transform(expression.ruleset);
+        return expression;
+    }
+    
+    @Override
+    public Expression transform(ECHRSelect expression) {
+        expression.expression = expression.expression.accept(this);
+        transform(expression.query);
+        return expression;
+    }
+    
+    @Override
+    public Expression transform(ECHRRulesetConstructor expression) {
+        transform(expression.ruleset);
         return expression;
     }
 
@@ -500,4 +537,38 @@ EquationVisitor {
         equation.guard =  equation.guard.accept(this);
     }
 
+    @Override
+    public void visit(CHRStatement statement) {
+        statement.head.accept(this);
+        statement.body.accept(this);
+    }
+
+    @Override
+    public void visit(CHRAstAtom query) {
+        query.expression = query.expression.accept(this);
+    }
+
+    @Override
+    public void visit(CHRAstBinds query) {
+        query.left = query.left.accept(this);
+        query.right = query.right.accept(this);
+    }
+
+    @Override
+    public void visit(CHRAstConjunction query) {
+        for(CHRAstQuery conjunct : query.conjuncts)
+            conjunct.accept(this);
+    }
+
+    @Override
+    public void visit(CHRAstEquals query) {
+        query.left = query.left.accept(this);
+        query.right = query.right.accept(this);
+    }
+
+    @Override
+    public void visit(CHRAstNegation query) {
+        query.subquery.accept(this);
+    }
+
 }