From 6d233d1b05176e40f634766537082d2a2ec65fd0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Hannu=20Niemist=C3=B6?= Date: Sun, 4 Jun 2017 14:49:30 +0300 Subject: [PATCH] (refs #7250) Support for record syntax for CHR relations Change-Id: I8dd80eb5216a1b6023ab9097af58d4f1aaa077b2 --- .../scl/compiler/compilation/Elaboration.java | 2 +- .../compiler/elaboration/chr/CHRLiteral.java | 37 ++++++- .../compiler/elaboration/chr/CHRRelation.java | 3 + .../chr/relations/CHRConstraint.java | 6 ++ .../chr/relations/ExternalCHRRelation.java | 5 + .../chr/translation/CHRTranslation.java | 45 ++++++--- .../contexts/TranslationContext.java | 16 ++- .../elaboration/expressions/ERecord.java | 91 +++++++++++------- .../elaboration/expressions/EVar.java | 7 +- .../block/ConstraintStatement.java | 7 +- .../elaboration/relations/SCLRelation.java | 7 +- .../parsing/declarations/ConstructorAst.java | 5 +- .../internal/parsing/parser/SCL.grammar | 2 +- .../internal/parsing/parser/SCLParser.dat | Bin 24024 -> 25012 bytes .../internal/parsing/parser/SCLParser.java | 49 ++++++---- .../parsing/parser/SCLParserImpl.java | 32 +++--- .../compiler/tests/ModuleRegressionTests.java | 2 + .../scl/compiler/tests/scl/CHR10.scl | 30 ++++++ .../simantics/scl/compiler/tests/scl/CHR5.scl | 6 +- .../simantics/scl/compiler/tests/scl/CHR6.scl | 6 +- .../simantics/scl/compiler/tests/scl/CHR7.scl | 6 +- .../simantics/scl/compiler/tests/scl/CHR8.scl | 8 +- .../simantics/scl/compiler/tests/scl/CHR9.scl | 42 ++++++++ 23 files changed, 298 insertions(+), 116 deletions(-) create mode 100644 tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR10.scl create mode 100644 tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR9.scl diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/Elaboration.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/Elaboration.java index 359448e1d..fccf26815 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/Elaboration.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/Elaboration.java @@ -376,7 +376,7 @@ public class Elaboration { dataTypes.add(dataType); for(int j=0;j=0;--i) parameterTypes[i] = context.toType(constructor.parameters[i]); diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRLiteral.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRLiteral.java index b34328a53..7b4a5bc26 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRLiteral.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRLiteral.java @@ -7,11 +7,14 @@ import org.simantics.scl.compiler.elaboration.chr.relations.SpecialCHRRelation; import org.simantics.scl.compiler.elaboration.chr.relations.UnresolvedCHRRelation; import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext; import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; +import org.simantics.scl.compiler.elaboration.contexts.TranslationContext.ExistentialFrame; import org.simantics.scl.compiler.elaboration.contexts.TypingContext; +import org.simantics.scl.compiler.elaboration.expressions.ERecord; import org.simantics.scl.compiler.elaboration.expressions.Expression; import org.simantics.scl.compiler.elaboration.expressions.Variable; import org.simantics.scl.compiler.elaboration.expressions.VariableProcedure; import org.simantics.scl.compiler.elaboration.expressions.printing.ExpressionToStringVisitor; +import org.simantics.scl.compiler.elaboration.expressions.records.FieldAssignment; import org.simantics.scl.compiler.elaboration.relations.SCLRelation; import org.simantics.scl.compiler.errors.Locations; import org.simantics.scl.compiler.internal.parsing.Symbol; @@ -29,6 +32,7 @@ public class CHRLiteral extends Symbol { public CHRRelation relation; public Type[] typeParameters; public Expression[] parameters; + public FieldAssignment[] fields; // optional public Expression[] typeConstraintEvidenceParameters; public boolean killAfterMatch; public boolean negated; @@ -55,6 +59,10 @@ public class CHRLiteral extends Symbol { if(sclRelation != null) relation = new ExternalCHRRelation(sclRelation); else { + if(parameters == null) { + context.getErrorLog().log(location, "Relation must be declared if record syntax is used."); + return; + } Type[] parameterTypes = new Type[parameters.length]; for(int i=0;i allRefs, TIntHashSet refs) { diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRRelation.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRRelation.java index 7369d496c..3daae67a9 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRRelation.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRRelation.java @@ -12,4 +12,7 @@ public interface CHRRelation { TVar[] getTypeVariables(); Type[] getParameterTypes(); TPred[] getTypeConstraints(); + default String[] getFieldNames() { + return null; + } } diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/relations/CHRConstraint.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/relations/CHRConstraint.java index c0f439288..ee7347791 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/relations/CHRConstraint.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/relations/CHRConstraint.java @@ -34,6 +34,7 @@ import gnu.trove.map.hash.TIntObjectHashMap; public class CHRConstraint extends Symbol implements CHRRelation { public final String name; public final Type[] parameterTypes; + public String[] fieldNames; public boolean implicitlyDeclared; @@ -229,4 +230,9 @@ public class CHRConstraint extends Symbol implements CHRRelation { else return w.apply(location, accessor, fact); } + + @Override + public String[] getFieldNames() { + return fieldNames; + } } diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/relations/ExternalCHRRelation.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/relations/ExternalCHRRelation.java index 5e4f5868c..6f44bc2ab 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/relations/ExternalCHRRelation.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/relations/ExternalCHRRelation.java @@ -32,4 +32,9 @@ public class ExternalCHRRelation implements CHRRelation { public String toString() { return relation.toString(); } + + @Override + public String[] getFieldNames() { + return relation.getFieldNames(); + } } diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/translation/CHRTranslation.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/translation/CHRTranslation.java index 6972eb864..367960dfa 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/translation/CHRTranslation.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/translation/CHRTranslation.java @@ -3,6 +3,7 @@ package org.simantics.scl.compiler.elaboration.chr.translation; import java.util.ArrayList; import java.util.Arrays; +import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.elaboration.chr.CHRLiteral; import org.simantics.scl.compiler.elaboration.chr.CHRQuery; import org.simantics.scl.compiler.elaboration.chr.CHRRule; @@ -12,6 +13,7 @@ import org.simantics.scl.compiler.elaboration.chr.relations.UnresolvedCHRRelatio import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; import org.simantics.scl.compiler.elaboration.expressions.EApply; import org.simantics.scl.compiler.elaboration.expressions.EBinary; +import org.simantics.scl.compiler.elaboration.expressions.ERecord; import org.simantics.scl.compiler.elaboration.expressions.EVar; import org.simantics.scl.compiler.elaboration.expressions.Expression; import org.simantics.scl.compiler.elaboration.expressions.block.CHRStatement; @@ -20,9 +22,11 @@ import org.simantics.scl.compiler.elaboration.expressions.list.ListAssignment; import org.simantics.scl.compiler.elaboration.expressions.list.ListGenerator; import org.simantics.scl.compiler.elaboration.expressions.list.ListGuard; import org.simantics.scl.compiler.elaboration.expressions.list.ListQualifier; +import org.simantics.scl.compiler.elaboration.expressions.records.FieldAssignment; import org.simantics.scl.compiler.environment.AmbiguousNameException; import org.simantics.scl.compiler.environment.Environments; import org.simantics.scl.compiler.errors.Locations; +import org.simantics.scl.compiler.internal.parsing.declarations.DAnnotationAst; import org.simantics.scl.compiler.internal.parsing.types.TypeAst; public class CHRTranslation { @@ -35,18 +39,27 @@ public class CHRTranslation { } private static CHRLiteral convertConstraint(boolean remove, boolean negated, Expression expression) { - ArrayList parameters = new ArrayList(4); - while(expression instanceof EApply) { + long location = expression.location; + Expression[] parameters; + FieldAssignment[] fields = null; + if(expression instanceof EApply) { EApply apply = (EApply)expression; - for(int i=apply.parameters.length-1;i>=0;--i) - parameters.add(apply.parameters[i]); + parameters = apply.parameters; expression = apply.function; } - EVar var = (EVar)expression; - Expression[] parametersArray = new Expression[parameters.size()]; - for(int i=0,j=parametersArray.length-1;i variables = new THashSet(4); ArrayList blanks = new ArrayList(2); - boolean disallowNewExistentials; + public boolean disallowNewExistentials; + + public EVariable createBlank(long location) { + Variable variable = new Variable("_"); + blanks.add(variable); + EVariable result = new EVariable(variable); + result.location = location; + return result; + } } THashMap variables = new THashMap(); @@ -128,14 +136,12 @@ public class TranslationContext extends TypeTranslationContext implements Enviro } case '_': { if(name.length()==1) { - variable = new Variable("_"); ExistentialFrame existentialFrame = getCurrentExistentialFrame(); if(existentialFrame == null || existentialFrame.disallowNewExistentials) { errorLog.log(location, "Blank variables can be used only in queries."); return new EError(location); } - existentialFrame.blanks.add(variable); - return new EVariable(variable); + return existentialFrame.createBlank(location); } break; } @@ -143,7 +149,7 @@ public class TranslationContext extends TypeTranslationContext implements Enviro return null; } - private ExistentialFrame getCurrentExistentialFrame() { + public ExistentialFrame getCurrentExistentialFrame() { int size = existentialFrames.size(); if(size == 0) return null; diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ERecord.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ERecord.java index a41c0f042..e1f444d82 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ERecord.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ERecord.java @@ -2,20 +2,20 @@ package org.simantics.scl.compiler.elaboration.expressions; import org.simantics.scl.compiler.constants.SCLConstructor; import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; +import org.simantics.scl.compiler.elaboration.contexts.TranslationContext.ExistentialFrame; import org.simantics.scl.compiler.elaboration.expressions.records.FieldAssignment; import org.simantics.scl.compiler.elaboration.modules.SCLValue; import org.simantics.scl.compiler.environment.AmbiguousNameException; import org.simantics.scl.compiler.errors.Locations; -import org.simantics.scl.compiler.internal.parsing.Token; import gnu.trove.map.hash.THashMap; public class ERecord extends ASTExpression { - Token constructor; - FieldAssignment[] fields; + public final EVar constructor; + public final FieldAssignment[] fields; - public ERecord(Token constructor, FieldAssignment[] fields) { + public ERecord(EVar constructor, FieldAssignment[] fields) { this.constructor = constructor; this.fields = fields; } @@ -33,30 +33,67 @@ public class ERecord extends ASTExpression { public Expression resolve(TranslationContext context, boolean asPattern) { SCLValue constructorValue; try { - constructorValue = context.getEnvironment().getLocalNamespace().getValue(constructor.text); + constructorValue = context.getEnvironment().getLocalNamespace().getValue(constructor.name); } catch (AmbiguousNameException e) { context.getErrorLog().log(constructor.location, e.getMessage()); return new EError(constructor.location); } if(constructorValue == null) { - context.getErrorLog().log(constructor.location, "Couldn't resolve the record constructor " + constructor.text + "."); + context.getErrorLog().log(constructor.location, "Couldn't resolve the record constructor " + constructor.name + "."); return new EError(constructor.location); } if(!(constructorValue.getValue() instanceof SCLConstructor)) { - context.getErrorLog().log(constructor.location, "Value " + constructor.text + " is not a record constructor."); + context.getErrorLog().log(constructor.location, "Value " + constructor.name + " is not a record constructor."); return new EError(constructor.location); } String[] fieldNames = ((SCLConstructor)constructorValue.getValue()).recordFieldNames; if(fieldNames == null) { - context.getErrorLog().log(constructor.location, "Value " + constructor.text + " is not a record constructor."); + context.getErrorLog().log(constructor.location, "Value " + constructor.name + " is not a record constructor."); return new EError(constructor.location); } + Expression[] parameters = translateFieldsToFunctionParameters(context, fields, fieldNames); + if(parameters == null) + return new EError(location); + if(asPattern) + for(int i=0;i recordMap = new THashMap(fields.length); + boolean error = false; for(FieldAssignment field : fields) { if(field.value == null) { - String actualName = field.name; - if(actualName.charAt(0) == '?') - actualName = actualName.substring(1); + String actualName = field.name; + if(actualName.charAt(0) == '?') + actualName = actualName.substring(1); String bestMatch = null; int bestMatchLength = 0; for(int i=0;iDr1r!aHwZIqBwhrFC^qHVgC1AmSv?1K%>HvRw04HfcR;H~J1e z`$J@3I36PT3i`{stsA%&h?rf7)wV;&Av(k`uxVcc+z5OO_#$M0j>#bXsMlzo+0e1C z9b2^qmARx$5OJhl1)J@_*ZtVh?%d#Ys5&13=?4uuI%9fZ$Nj+mNDUox(`MR>@I$_-JAk{-^*rd5B=YAtH&LZe%BbMM}S|`t=-WaiGtr6f^5!j+S&PRQ3 z(guB<)Q{SOjF~*_1VYV51=t2`2X+8Efs=q!fir;I7_)$Lff$on2s{9|7`PO86!7RA zE(3oI@HpUdkBoaf@I>HB;K{&~fXul9cmj}l*(MwdWFMG!4v@JqPi6`5NZ=8`!-0nZ z5A|3@ZGndX4+b6tJP^pZi+~GqI3N5xAjiV^vw_or-M}v3G$6-F8F}IqAp5|Y?F7iV z3y>r;vk`k}GNXE7GQ~VsU1z>&{@JGHL9?jZWBbg1o6Dgt(a8zUX7wb~-DB{`V2S_WBTZ9d8@Ar5)-Y4s8L z1?~d7-hq}Wh&QTza=5#Idc}}~ZQ<9twRV96EmII{RD09rI4d4Q4z`6q&7D?lbD(7k z;*Dyb9O+J@UNPigTlh2F8Rj4dTBab@sP@!F3^^zh{z!LZa*+cqQxI=dd+H*F9Fz(F zKKDMm!-1A5h&QS|brC}j%7pK59ngZh4s(Lmd#Ayp$dbB*?oKhd2C zEohn2%7eOyAqQo`Kj3hua-d~OD-Y@-h8&a$e}cpP+JTlStvslU7;;c1{0g@MTF^43 zl?QbZLk`M>&t1=ou1>`=#FHyv5v49-$WgzZt#+%S1uaurc~BQo@=0uRkiXZxS1Gx% zmR26rMGQG86aG|pDzu~idch^FD}74dIvx8OljjYWlv=ykkk%cW%Z52_q zSIfZ1mfPmG!5e7&8wFZ&I?ew<_8;m&>TY0BF0@qENYz6v10P#%mYW4{V0^=OxL)lE z?m8CANwrl()iWO>_=)fR?tXX!%|Cd{`Gpk+!c59%UH zK8fw~?d8{$#@|*#3-Ri|$TV}*MU;GE>+>DqjxY~9&@#oi(XEl|h=`I;V*7mOx$~d} zEmK-~P#011No=2Qm0JZZXk#%y(b#Tm6?p^;>LN-$iQPJ1@Gh?RA>aA#e0YPFDXl!H zizwrh*nWH`yOW^>EmK-~P#011No=3*7IzD@pk+!c59%UHK8fw~o$1bm7PL%hZ3Hoh!Nd6?i_f7mMN_~sEf$#8rk>bYvpk+!c59%T^k4Dyv?p${+B%ozVD-Y@-Nu<`UN%cS(@hG;sNP?D?Ai9_}uQ`J7}XHB&{QG+V)0xY6xw{-=^Qac4 zD_HJX({f+HZKXG^7)c9ghb^!D-QV5g@LU~`cJ3Y%SJyvtkM3Vq z<38X%fE>UG2G{pyF#hj9nD;u@Y%`X2vLPG6^$huvi-W!W>A>y(+I`4<2;&1Pkh8xZ zTH~v2!)!Iia8n(22Qfl&9{J?_1iv%vZ!lLdqWRr?+yw78$hS5x+h4rvaXlCxFhce8 z$nS5?UF@(=h!GP1Z*ihz|8Z`yTa0{*lls#jX7b$}U)5ES4;Udak#FYAA2&M4sJ3Ypiwde$?xFkq;OlX&7yk?+?yRad>VaMsUYQet&c3ZP$r> zzz9kGy&%f=jmypFY&RSEfDz0-Ue8Rc>)8Ug0QrCs?Doj-Z_XX+4n;m-gajw@-2yk$ z%|t$6g!uj!Wkp@maVs1S7 zlFJ;fUgl?kKNX_BoA-Cq&n)KOLaukac5@w`?THfu=62>Wk4;QAjO-d_QaTYiopl!Z zfD;2wo|lwPL`HXrI|SncP7JtB%%gN7GP+4_67m5j2HZvNBIE;347jVAN9jalbXQ3} zp%apCj>E4J#EAj-5#~`kmW<}Eu~_ZR#=NyRi~Xf{2f70>KH$WF*}**KPbVfDMs~0} zm~_JOeb{{%`G6AxZkoeiBZw0NZl0Tme87o;xyhWB71OoTXB%XVA7ljhgIc_>rdc+u z@+=dxzPCe@^$2Bs8)`g-vMBk2ZdRs#y8z829S zV-0MBNc-6b?iCv3`#EdH%FGPCv?j}T+c3~CK0A`NeRFs)>$j$srm3HfN^N*>aJMx> zaoh-v4nR~(5rDA?VZOAb*1OR4%HzW?_gKd4?Uk5m7Gh>;nq`>vT2`x=;g@$kYfa_x zf!-cI_Y6M)!f_%EMzY;z=oHsz#82LX&_g6KnFdYmLYh(~5Mr)F%%ub0*!)n%n3s1w z^&HX+Lu4UZ2hmc99t!=;vb48vWH@^U5zzHr=z0aB9*B@I>qD<3&wykQGOSyn#>P;H z`Gdjd9vXN;L?CI-JR3x#j|(a>!6VHx96Qojrh#Y#qO5g42YSO^s`nF<$Msj>Rv4(Q zL$WY-^!+)}AxY?Ge(aczUQEY;pAH>6W-3Gs^U28zGAvuYpD7j@|BZ9!U{+%M(1tMVmydj0ckItvdN~)aMr4;c$%m$R8Yks<&@(oc=~L_X#Z z88drA$6gc@TcIb+CnitK*MSLp>E&G?*K^cu!`U2eJnwook%eb7>jS2#Kkw|PKkwZ0 zqs(V7TH`7J)?_NLB$O&XrW1qo{;o5gRKaIJ$C zuXSLzzQu$PL?5w=&j*5N3^VMv|)8r4$79Bx>nhIPl{0P6emtFS&=0$|yAO>W%t zgM)(*)nKsOr^%Z3r}QAdM%a1149L;c_dFH^P3#rG$Sa>jtlG9z1Q>gt9!}~MYOL7L z0pXbW+sqTzXoS3v_bVR_fh;TSv?Uk&=`t3AI zFdhEhfpe6NNT1lx`q}iIqAaZYz#Hl>^ImY@Y>b(Sb?qs!mT`trHFiDKprE-uZ+51& zbO;wqOkS;SpktSdWnGrNk&@>bW^t&?X4iK*7P0O4AfKbs?O`xV!iI7dUZ ze9SESyu>C6=N*@ohk_8(QGZ_YLr3R=7OcP4Wx4w%*1c|_7YEqaqEEOhFmrAA6@3QF z^%G(lRhnkm&g>ge%CCazS&~5O0K-&CkgO0ZcLQn=5%}Zs&F6gPwK3yqx@{z)z3?Jgt?`;JXX0e&9PI z6_VgvH3`2r1K@XlS_0z}^54Z_KIUTV0R5iH3eLj26a_d{)K$ zo>YJezIjvO_j3T1^R+Ibl}$ORA4lb5QC4{pJaSaN;AMV{{63lB_q`l8qd{ADv8HXA z%G=iZ`et7{t($4vXPPBw`}J(wp}MxO7uZ15w!2tfm-Z{yKD{m}WVk27zMw&?z0tlT z7lLc%=a9lIs@p_|u@-X%TadV^GaP0%+`5?>JxxVolG%5tUPav)$&A>l(iK1=i4pe*DH2zyHOv#P4Bs z17`u}0{P7>eou?v$6|Z}$I0(&h3{%n7QU-Rp1|1rmKeV&7QUfHK73mXY%wI4RHs!h zO_rITtaerBCl@3uk~K-yJYugkpEtFnV*bu_+g>w_-d=0BncuMYnLjjNs-BrFs7_0! zoB7Fl`k6n%SH3=pPqM)e_pWaw2PB8!-<$QCs=>dAhTmd)AL=h9XPQ4xu1{`APP5;) z%kA;WEy;WAYP-t5&t7YP$UCCBNc=7!Z}I%1er!Rv4md(Twt^pd$Zrw9o#cZbd4f3y z|CZ^dQT#qAe)3Gw>?giM!Oxs+SHTwJ6ZzlJPx&H09iNd$5+i#>Q_FebJ|oz#Rj*90s$L!a5a*<^ z^)s0z5gOLP{GNmr66P~XG+*`Fn6G+;YWF@bIDh!px%i$N&R>kUcR#f?mxcM%_TK!= z?|8dAO8Wh#&v)e*{eE5T12tEV(XV-5-#AXc+sgTwUmD-M)W^5ET)yCko#XeJO3ap= z#-H~niJZB2|Kuy$F9z4^J)xBH&O^|e9~)mk&5w`M@8je2`vSU)6Hla(}~5+gU> zR}#Eu1PJ{M?Zz6vd5;5_p9pWmh~ zLVmZJ->(j6!B>HY0v8wHVUXpK-^4xwcqDL%$EB$GjqcID(|s&-#{riEj|cKw+$;Vc D8=lVg literal 24024 zcmcg!37lP3c|UiSgoNw~VZwS|0$E7d5<=JsJA{2l1Of;_AZ!5yGQc~fC~7UWwl1|6 zELySFN}$$SS{SRTS~o;3K@=XfRxAob>oP)^cm4mr?|kpx_wJp{n<2w@e&2Gw^DSq) z=id7!xy}jf?_4qk68Mz!6ld(_+|+%5YohL6=VncGZrV+;zESPzGxd9l9cQ3@8|WX1 z9Aa{`*4D)U7#a84UFw#!@dxrZsPA$CTD)eNY(>40DtCO$4;7$xu<;w z{d)~M^u_u!?Rn^lXzzG;>Xv8RZ_&Rc+Q;!90soG3 z+jIdB0$vaN6!6EeM_(q)03NTt6Yh*Lz!+=7=Ocd+IbKnmJ{!J>#dgM;=$)JW0q3^; zE_CRNaI`TmZ8#^}e;jt_0N)4vvg(%8q=z{`LiRbTd->pE#%v_s5EhiKcRbFJ?FU0?1DT3E;EmgTrRK zQ*eF!MCWw!EY;D3ZS-h5PI43Fk;)3jSx6z4=DCb0*4Lraqsb*VV(Px z$m@2y9_<&`pTN1D_1O#=i*?CQ{Yv0Ojmdsc&#@DE-OqR(^4k?D%lu={%y@sq^O;3$ zc{cG(V{ZD;miyaqc3n(m?~4@MX=lE?1~?|UCe&Q|VfIa&l@4GhunX7?90wc^#F*SP z;3VK=;B+AO7v{&!0qzK#2V4Z)BZrG2F9Gfe+&d!Ua;~wCZeJkQ+${$(*D@gY2=g-s zVJ{%&PV&wKXMfnf5V!z1AGkYkH{jfe6>tyS6}Ssb3*2-;6&4 z$T4xeQ-SO!$4T5aBIB@6>@#%yoK{C%=o|(NC|;^-Fw@-^=gqck`F{6a7j4l%&UB;NR=7@i+KeE0xMF z{_e`0%1l4czfzfAnd~n27yHB~p)+*)(|}#>H8&*%xNo|DOH+SdnkL)2XDSn@gZBTG zC-bD%p*5q)Y?G8HyXNceAwQ9I_f!9)WR?4G|2J-fKiz-I|E>SFzlSaU(`eltxZW@H z54x9hT+*_{zq5Hv^OJ%k@0j`zO~ zpzRfSmRP#ZR;|V+RS)5Zg~Qy=0kpm1b||xRb6T|;n-sYaTli7oD7P+vwpZX;Vp-H` zY*K9#z91}cs{?3z1)e3AMXkmr)i&XWhC@*UZLgHu7PT6iRNI7ihi=qBL$_P1d`r}9 zn{A3(jZLa;!tV@sq6V53e|RRhN_ktq%v$qW)oE-}w)q2ucZDw0K&`k#O;X-mZ?-kd zqE=&*YMb!e!|kYnwpYq+i&~9Ms%^se3HzW1+FmKQEowD3skRBfBiw-+XnUpHwy4$E zq}nEY->@%gpzW1%+oD!ulWLpr{lb2zfwou5ZHrosO{#6edqXd3pzW1%+oD!ulWLpr zrC}**pzW1%+oD!ulWLprWnmd=pzW1%+oD!ulWLpr+!@t;?v&TyDd$-;EowD3skR9} zJRFW1XnUpHwy4$Eq}nF@kZ=fUpzW1%+oD!ulWLprgTg_mfwou5ZHrosO{#6ej|@km z2HIXJw=HTlHmSA=KO!7~8fbf^+_tFI*reJf{FrbIYM||va@(R-W0Pu|@XNwwsDZXu zXzQ+MwQY{Tc8yJ{ZNje)*P|9uHU6*N*Zp6r?7r%6qU1cOfq%P6?Qpl&%M)-|6V@OX zXnUpHwy0$v7+JYW;fintw4m*ka@(R-av-vD=77zLutF)N;Y+z~QLC{@EeH7Wuv{sn z;Y+z~Q7btRSvhmSW>Hu~>hGZB@AQ8_E^;sl`l`w5VKw7LEo1w;NG%8Wj$ubqAoilP zTpw1uFY>+8oelfXs}}96S;Rslt(!KhsfBr&z3|(@ZHNPOvdcw>w>ty(Gxt|2hqtj% zRw+;OI<-(Ar47HgNE@hIVC~^j_q@vPKizYgHe4Dm6>IS3f?N%aT9}vF3r|7D!QQp$za1o36h@^GXW;L}iFS8du zC(J>v-4xX#T%5NwIb6&lJ|bz|v{_9p%**VBUl=Y#9?-1#donqb>^FySp)dUAfc@I| zErlNXn*$?j4zGP&8CD_}XnUpHwy2dHh^(ABU=x4Q$bO&LvZNlZHbt$*Cbb;k^TT}i ze$w`edv}?g#>uxxj`@;Ga!CEea3U;0+biX^MXkn;xg-Z{4hVR^ByF$Yio3UHS&SgL zw2>!ffJEJ52V<+eqwR!V93Qf^z+YHU)=0e)k+kyKGyZVYSP9%3YVmC(MH zMJzsVM*DNpk{wJssfBqdkA8cGJz)tL-Zxnk{caI& zP`AO_!_~M)G@d?G>;58K%_7z!Y2CD0O)V@IxqCSJ9T$#6KS0|n<+eqwWJF};%mJHY z!?8*!4PVM_i&~9MYB|6chJ{Kg4PVM_i(1Kn$jX@mHV1|Sl~NkMl-m}y8k^K|fS(pl zQ%Y(0Qf^z+N)AL;&K$5=6;>&wG<+$yEowD3spSAaA)KI;((t9+wy2dHh^(ABU~^@- zQYoe3OSx@PtFcKf2ly%B6s44gFXgsHt>i#t<;($_gTui}DGguBZHrosO=>y7w-4J3 zJv8Y|68`N0HNi}7*09!E@;a3z2jVC&BJ?)}{H8#38>9XvKVGGwX|mnWZN(P+wX~bs zaH~;wo>?)M>d}MqRcm#vC76r$!ELLy;p~7nRieXhUQN2#sr zBX^Gj_w%Pyw!e*1R`3fQp0(^f1=1GZQ|QzDx6zfK<$H?%QkWK|q1VJSW9U@>4r?{z zBhO`?;Y@ueas&QH7}IZo6RhoxB|9R3x?{FZE=JKgw0Q1_n5!dn;8_Fr z%_Q3!GtFvi@yY^53X{WRe_)u5aW!)J!`b5ZgD#$)kV>v7zl?Un1IBd#t-=n0e+fTJ zQT^Pm%C|NRi^F2%0XmFL!R?7rHLmQa`xk2+Id5FcJBOW-ix{7A!#cNoth{^tDoy;;RA!T0ATXOOhkQl6*YQVY4RRn#m)b zL${i~?jN!U*pczKxV)}?IXP@7+pulGlLs+_${Wg689LYcupYU98Mw`vyfvjTF-$}* zU#- zj|GGY0ncj043egCC2c-cWd1`*VOGGYPRt;gk;z+A3X{Sl&f9AjHT3~CcB%I zaVK_JePmKxui0TXase|Kt2saor+n7DG`QR}w;MhahHSCI9z_EuQ|6)Pu zSZ50tFoV)D&ow@bM=s#lL)a#4gIvHj3*7&{8JXNVW^o^XQ*!+xjKdrP#~#AWFcZ0e zV-I0Qz+IR)_7LWUdB_DEdkDLPU62bn_7HXoJ0TZv>>+Fy@aqq8>>(up8BJ=|{iY0_N>v24h9(EJUM-#wB;5ebYCwT%dY0G&%rPt%?AQO|bdWnp$r}*E{YT ze5%JYW^b>=tfm$-tya?%vtCPU9d7WcjSqR(abJIL51&~E?+4*Hkp`JJ_!OPu8r9?E z-GO$fBqr0Ks$Hm7*(6{wS0U!2{%6)j z>GET*Vv+IR-yR!CYmHu{>H4$}+u=btSU+EXkum$zUulrS{!GPMW=$5E>;AGO1jo9k z+)KLd^%|S1(8*p(IiCu;iYjM&346X)y$#o;kY?6y6-%nekbkoCknT?Gdb?*5Zu#TZ;W3TJ+ zlH0H_i5CqdP9EkH7djj%Ed{x${EGCv;%vV9k_WV71ZBFxcy$=pGpG?&U%#YpHsEYlGV@3Lz-=8q= z1*Y{rQiG}peOi@mmXB%HShhw#u|M@X5}%j!Xsu}grP*oQ*h{#!F;oFNKVil5^Ci`0 zYh>%5KbP#<9KeCm6mxSvCI_9qGT5|6wfq{%x~Fm7)AR{gFO~pUHlFiM`!lY44F<2o zG_7YHN3=P=M!3`TG9X7|>yBf(r*Uo8^#mWRR%sSN$6jSk_h;jr7u`#*36q0@HiT@7 zS>y4N+8PC1+`Km3=1qfx=?0z$Rkq89Ym8k3h$9x6?NxyEb2HD7m!(tH>Y=Iar8M4r z9~wYsD4O-(sX`4m%6Q+* z?|B^!OtA7cpX#70?4^|FJdPEfAqq|X?ANj53TuqLc!tOUZ0`AfwyrxbL~Q;zpJ^dx zRfEVDE89z4H_j*a=jQxmQB7A{ci!I{_c&?Mb*BwZ3t3~Gfu<7?cYL{bJgfcGf##=U z6BdNeAw1X+NY{v?Q5AAlQ8B1%o_v6~Kl7^T%Wi2rgZ0;LKNVd+6yvP-*BFOW@tO=( z#?Gxv;R&`GXqsYy}w75 zuxi%WIP;=PnqpwH(jI64p^XuUMXYfzXYi1SRni)XUEC(UC;~5TTccXGNVRC4Y19p~ zURw`QQ}w|L-NAyOzg!S@n_QrpqZDgpG3%S8pMzCe805O1#vZ6D4zya$O`6O{zl6KcMXq4qTJS6N$v?^q=KJ_jHfB-q9o=&o*Ai+<*KwP!Evb2I4n_ z?CjyUgk}Tz4IzFLiNJ3NO&3XXF+cN?^Ls&*$(d_NNKWyuS58fKc7IxNmGQ~($!^KM z$qe@qzs7wRC;Pv;Y5q+2GWxm3|DpRke|vJQd$h7V*~Y)_2HouBM0&XoJN*9dW_fyj zCz+JsUyQ=5;_w$Ec+K;-gFl)qcjqSOCl@4p`~UI#_t!*wG#hS_c_GFb=>V8Rb(FxJ@bs|-eNsOuKB}_t8xZ%b!53J=e3v1zn9pNx<4M3*Po2a>w}~5YF)47@U~{-W24FC?i-cYCr9JeIP9;6JeZR8%+=0e~jD<_Y}D=yKgl{GwdA}{rlc1 z$F*tXJw&!2j>@YxDzE<3y z?tN9gvs_kh=1Es`y`5SzaWu1m=OF&hJz{9SJ0y+&>tJ)34;Wuy_&#LsT&?d{{7&i{ zMZP-``Hr?FwD&i@!|@%)get(i++); Token nameToken = (Token)get(i++); - EVar name = new EVar(nameToken.location, nameToken.text); + EVar name = new EVar(nameToken); ArrayList parameters = new ArrayList(); while(i < length()) { Object symbol = get(i++); @@ -334,7 +334,7 @@ public class SCLParserImpl extends SCLParser { else context = (ArrayList)get(i++); Token nameToken = (Token)get(i++); - EVar name = new EVar(nameToken.location, nameToken.text); + EVar name = new EVar(nameToken); ArrayList parameters = new ArrayList(); while(i < length()) { Object symbol = get(i++); @@ -424,12 +424,12 @@ public class SCLParserImpl extends SCLParser { @Override protected Object reduceVarId() { - return new EVar(((Token)get(0)).text); + return new EVar((Token)get(0)); } @Override protected Object reduceEscapedSymbol() { - return new EVar(((Token)get(0)).text); + return new EVar((Token)get(0)); } @Override @@ -460,7 +460,7 @@ public class SCLParserImpl extends SCLParser { EVar negation = null; if(get(i) instanceof Token) { Token token = (Token)get(i++); - negation = new EVar(token.location, token.text); + negation = new EVar(token); } EBinary binary = new EBinary((Expression)get(i++), negation); while(i < length()) { @@ -527,7 +527,7 @@ public class SCLParserImpl extends SCLParser { TypeAst[] parameters = new TypeAst[length()-idPos-1]; for(int i=0;i print ?x + X V { ?y } => print ?y + True => X V { x = 1.0, y = 2.0 } + True => X V { x = 3.0, y = 4.0 } +-- +1.0 +2.0 +3.0 +4.0 +() +-- +module { export = [main], chr } +import "StandardLibrary" + +data V = V { x :: Double, y :: Double } + +main = () + where + constraint X V + True => X V { x = 1.0 } +-- +9:15-9:28: Field y not defined. \ No newline at end of file diff --git a/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR5.scl b/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR5.scl index edefae634..c59c02dbb 100644 --- a/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR5.scl +++ b/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR5.scl @@ -1,8 +1,4 @@ -module { - export = [main], - chr -} - +module { export = [main], chr } import "StandardLibrary" ruleset IntegerSet where diff --git a/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR6.scl b/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR6.scl index 325af5270..f1e28d08a 100644 --- a/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR6.scl +++ b/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR6.scl @@ -1,8 +1,4 @@ -module { - export = [main], - chr -} - +module { export = [main], chr } import "StandardLibrary" ruleset RS where diff --git a/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR7.scl b/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR7.scl index 6576cf47e..b10257ca8 100644 --- a/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR7.scl +++ b/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR7.scl @@ -1,8 +1,4 @@ -module { - export = [main], - chr -} - +module { export = [main], chr } import "StandardLibrary" ruleset RS where diff --git a/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR8.scl b/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR8.scl index ce3064aa4..c3a88f58a 100644 --- a/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR8.scl +++ b/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR8.scl @@ -1,12 +1,8 @@ -module { - export = [main], - chr -} - +module { export = [main], chr } import "StandardLibrary" main = () where X ?x => Y ?y -- -10:15-10:17: New existential variables can be defined only in queries. \ No newline at end of file +6:15-6:17: New existential variables can be defined only in queries. \ No newline at end of file diff --git a/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR9.scl b/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR9.scl new file mode 100644 index 000000000..07514821a --- /dev/null +++ b/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR9.scl @@ -0,0 +1,42 @@ +module { export = [main], chr } +import "StandardLibrary" + +main = () + where + constraint V { x :: Double, y :: Double } + V { ?x } => print ?x + True => V { x = 1.0, y = 2.0 } +-- +1.0 +() +-- +module { export = [main], chr } +import "StandardLibrary" + +main = () + where + constraint V { x :: Double, y :: Double } + True => V { x = 1.0 } +-- +7:13-7:26: Field y not defined. +-- +module { export = [main], chr } + +import "StandardLibrary" + +main = () + where + constraint V Double Double + True => V { x = 1.0, y = 2.0 } +-- +8:13-8:35: Relation V does not define field names. +-- +module { export = [main], chr } + +import "StandardLibrary" + +main = () + where + True => V { x = 1.0, y = 2.0 } +-- +7:13-7:35: Relation must be declared if record syntax is used. \ No newline at end of file -- 2.47.1