package org.simantics.scl.compiler.internal.parsing.declarations; import java.util.ArrayList; import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; import org.simantics.scl.compiler.elaboration.expressions.EApply; import org.simantics.scl.compiler.elaboration.expressions.EIntegerLiteral; import org.simantics.scl.compiler.elaboration.expressions.ERealLiteral; import org.simantics.scl.compiler.elaboration.expressions.EVar; import org.simantics.scl.compiler.elaboration.expressions.Expression; import org.simantics.scl.compiler.elaboration.expressions.Variable; import org.simantics.scl.compiler.elaboration.query.QConjunction; import org.simantics.scl.compiler.elaboration.query.Query; import org.simantics.scl.compiler.elaboration.relations.ConcreteRelation; public class DRelationAst extends DeclarationAst { public final Expression lhs; public final Object[] queries; public DDocumentationAst documentation; public DRelationAst(Expression lhs, Object[] queries) { this.lhs = lhs; this.queries = queries; } @Override public void toString(int indentation, StringBuilder b) { for(int i=0;i ql = new ArrayList(); DAnnotationAst annotation = null; for(Object statement : queries) { if(statement instanceof DAnnotationAst) { if(!ql.isEmpty()) { translateSection(context, annotation, ql, relation); ql.clear(); } annotation = (DAnnotationAst)statement; } else ql.add((Query)statement); } if(!ql.isEmpty()) translateSection(context, annotation, ql, relation); } private void translateSection(TranslationContext context, DAnnotationAst annotation, ArrayList queries, ConcreteRelation relation) { Query query = queries.size() == 1 ? queries.get(0) : new QConjunction(queries); String sectionName = annotation.id.text.substring(1); if(sectionName.equals("enforce")) { relation.enforceSection = query.resolve(context); if(annotation.parameters.length > 0) { relation.phase = Integer.parseInt(((EIntegerLiteral)annotation.parameters[0]).getValue()); } return; } int pattern = 0; for(int i=0;i 0) { Expression selExp = annotation.parameters[0]; if(selExp instanceof ERealLiteral) selectivity = Double.parseDouble(((ERealLiteral)selExp).getValue()); else selectivity = Integer.parseInt(((EIntegerLiteral)selExp).getValue()); } context.pushExistentialFrame(); Query resolvedQuery = query.resolve(context); Variable[] existentials = context.popExistentialFrame(); relation.addSection(pattern, selectivity, existentials, resolvedQuery); } }