]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EBlock.java
New type class MonadE and corresponding monad syntax with edo keyword
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / EBlock.java
index e184b1397938e5604e91e90edaefd3699839c88d..c21732557ba555f5ce950058e0eddaaab468182a 100644 (file)
@@ -5,8 +5,10 @@ import java.util.List;
 
 import org.simantics.scl.compiler.elaboration.chr.CHRRule;
 import org.simantics.scl.compiler.elaboration.chr.CHRRuleset;
+import org.simantics.scl.compiler.elaboration.chr.ast.CHRQueryTranslationMode;
 import org.simantics.scl.compiler.elaboration.chr.translation.CHRTranslation;
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
+import org.simantics.scl.compiler.elaboration.expressions.block.BlockType;
 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.block.GuardStatement;
@@ -19,20 +21,21 @@ import org.simantics.scl.compiler.errors.Locations;
 
 public class EBlock extends ASTExpression {
 
-    ArrayList<Statement> statements = new ArrayList<Statement>();
-    boolean monadic;
+    public ArrayList<Statement> statements = new ArrayList<Statement>();
+    BlockType blockType = BlockType.Normal;
     
     public EBlock() {
+        this.blockType = blockType;
+    }
+    
+    public void setBlockType(BlockType blockType) {
+        this.blockType = blockType;
     }
 
     public void addStatement(Statement statement) {
         statements.add(statement);
     }
     
-    public void setMonadic(boolean monadic) {
-        this.monadic = monadic;
-    }
-    
     public ArrayList<Statement> getStatements() {
         return statements;
     }
@@ -63,7 +66,7 @@ public class EBlock extends ASTExpression {
             Statement cur = statements.get(i);
             StatementGroup group = cur.getStatementGroup();
             if(group == null)
-                in = cur.toExpression(context, monadic, in);
+                in = cur.toExpression(context, blockType, in);
             else {
                 int endId = i+1;
                 while(i>0 && statements.get(i-1).getStatementGroup() == group)
@@ -75,10 +78,14 @@ public class EBlock extends ASTExpression {
                 case Rule:
                     in = extractRules(i, endId, in);
                     break;
-                case CHR:
-                    in = new ECHRRuleset(extractCHRRules(context, i, endId), in);
+                case CHR: {
+                    CHRRuleset ruleset = extractCHRRules(context, i, endId);
+                    long location = Locations.combine(ruleset.location, in.location);
+                    in = new ECHRRuleset(ruleset, in);
+                    in.location = location;
                     break;
                 }
+                }
             }
         }
         return in.resolve(context);
@@ -95,7 +102,9 @@ public class EBlock extends ASTExpression {
             Statement statement = statements.get(i);
             if(statement instanceof CHRStatement) {
                 CHRStatement chrStatement = (CHRStatement)statement;
-                ruleset.addRule(new CHRRule(chrStatement.location, chrStatement.head.translateAsHead(context), chrStatement.body.translateAsBody(context)));
+                ruleset.addRule(new CHRRule(chrStatement.location,
+                        chrStatement.head.translate(context, CHRQueryTranslationMode.RULE_HEAD),
+                        chrStatement.body.translate(context, CHRQueryTranslationMode.RULE_BODY)));
             }
             else if(statement instanceof ConstraintStatement)
                 ruleset.constraints.add(CHRTranslation.convertConstraintStatement(context, (ConstraintStatement)statement));
@@ -139,7 +148,7 @@ public class EBlock extends ASTExpression {
 
     @Override
     public int getSyntacticFunctionArity() {
-        if(monadic)
+        if(blockType != BlockType.Normal)
             return 0;
         Statement lastStatement = statements.get(statements.size()-1);
         if(!(lastStatement instanceof GuardStatement))