X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Felaboration%2Fexpressions%2FEBlock.java;h=50f29965130ddf38abfc888ef8cd3099cde29421;hb=70f4424a186f1df8e7cb195e41504b9312828e92;hp=ff131254081f7c4ce0a27b3bf9a18cf29fbc9195;hpb=0144ba232323a0e4f7ec8fe0681a150faafd7caf;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EBlock.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EBlock.java old mode 100755 new mode 100644 index ff1312540..50f299651 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EBlock.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EBlock.java @@ -1,20 +1,26 @@ package org.simantics.scl.compiler.elaboration.expressions; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; -import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; +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.CHRStatement; +import org.simantics.scl.compiler.elaboration.expressions.block.ConstraintStatement; 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; +import org.simantics.scl.compiler.elaboration.expressions.block.StatementGroup; import org.simantics.scl.compiler.errors.Locations; public class EBlock extends ASTExpression { - LinkedList statements = new LinkedList(); + public ArrayList statements = new ArrayList(); boolean monadic; public EBlock() { @@ -28,16 +34,24 @@ public class EBlock extends ASTExpression { this.monadic = monadic; } - public LinkedList getStatements() { + public ArrayList getStatements() { return statements; } + + public Statement getFirst() { + return statements.get(0); + } + + public Statement getLast() { + return statements.get(statements.size()-1); + } @Override public Expression resolve(TranslationContext context) { if(statements.isEmpty()) { - context.getErrorLog().log(location, "Block must contain at least one statement."); + context.getErrorLog().log(location, "Block should not be empty."); return new EError(location); - } + } int i = statements.size()-1; Statement last = statements.get(i); if(!(last instanceof GuardStatement)) { @@ -48,21 +62,29 @@ public class EBlock extends ASTExpression { Expression in = ((GuardStatement)last).value; while(--i >= 0) { Statement cur = statements.get(i); - if(cur instanceof RuleStatement) { - int endId = i+1; - while(i>0 && statements.get(i-1) instanceof RuleStatement) - --i; - in = extractRules(i, endId, in); - } - else if(cur instanceof LetStatement && ((LetStatement)cur).pattern.isFunctionPattern()) { + StatementGroup group = cur.getStatementGroup(); + if(group == null) + in = cur.toExpression(context, monadic, in); + else { int endId = i+1; - while(i>0 && (cur = statements.get(i-1)) instanceof LetStatement && - ((LetStatement)cur).pattern.isFunctionPattern()) + while(i>0 && statements.get(i-1).getStatementGroup() == group) --i; - in = extractLet(i, endId, in); + switch(group) { + case LetFunction: + in = extractLet(i, endId, in); + break; + case Rule: + in = extractRules(i, endId, in); + break; + 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; + } + } } - else - in = cur.toExpression(context, monadic, in); } return in.resolve(context); } @@ -70,7 +92,32 @@ public class EBlock extends ASTExpression { private Expression extractRules(int begin, int end, Expression in) { return new EPreRuleset(statements.subList(begin, end).toArray(new RuleStatement[end-begin]), in); } + + private CHRRuleset extractCHRRules(TranslationContext context, int begin, int end) { + CHRRuleset ruleset = new CHRRuleset(); + ruleset.location = Locations.combine(statements.get(begin).location, statements.get(end-1).location); + for(int i=begin;i)(List)statements.subList(begin, end), in); @@ -97,4 +144,18 @@ public class EBlock extends ASTExpression { return transformer.transform(this); } + @Override + public int getSyntacticFunctionArity() { + if(monadic) + return 0; + Statement lastStatement = statements.get(statements.size()-1); + if(!(lastStatement instanceof GuardStatement)) + return 0; + return ((GuardStatement)lastStatement).value.getSyntacticFunctionArity(); + } + + @Override + public void accept(ExpressionVisitor visitor) { + visitor.visit(this); + } }