From 00b73fe170154840ac11c2a9403c6bcd9a0e673a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Hannu=20Niemist=C3=B6?= Date: Mon, 6 Nov 2017 10:14:39 +0200 Subject: [PATCH] (refs #7601) Wildcard syntax for SCL records Change-Id: Ia044ce4598d0897bbd7416527707b49211aba9e3 --- .../compiler/elaboration/chr/CHRLiteral.java | 2 +- .../elaboration/expressions/ERecord.java | 40 +++- .../expressions/records/FieldAssignment.java | 2 + .../internal/parsing/parser/SCL.grammar | 1 + .../internal/parsing/parser/SCLParser.dat | Bin 25462 -> 25352 bytes .../internal/parsing/parser/SCLParser.java | 210 +++++++++--------- .../parsing/parser/SCLParserImpl.java | 5 + .../compiler/tests/ModuleRegressionTests.java | 1 + .../compiler/tests/scl/RecordWildcards.scl | 27 +++ 9 files changed, 183 insertions(+), 105 deletions(-) create mode 100644 tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/RecordWildcards.scl 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 e0921dc10..6bea58310 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 @@ -93,7 +93,7 @@ public class CHRLiteral extends Symbol { context.getErrorLog().log(location, "Relation " + relation + " does not define field names."); return; } - parameters = ERecord.translateFieldsToFunctionParameters(context, fields, fieldNames); + parameters = ERecord.translateFieldsToFunctionParameters(context, fields, fieldNames, true); if(parameters == null) return; for(int i=0;i 0) + System.out.print(", "); + System.out.print(field.name); + if(field.value != null) { + System.out.print(" = "); + System.out.print(field.value); + } + } + System.out.println("}"); + } + THashMap recordMap = new THashMap(fields.length); boolean error = false; + FieldAssignment wildcardField = null; for(FieldAssignment field : fields) { if(field.value == null) { String actualName = field.name; + if(actualName.equals(FieldAssignment.WILDCARD)) { + if(wildcardField != null) + context.getErrorLog().log(field.location, "The record has more than one wildcard."); + wildcardField = field; + continue; + } if(actualName.charAt(0) == '?') actualName = actualName.substring(1); String bestMatch = null; @@ -122,12 +150,20 @@ public class ERecord extends ASTExpression { FieldAssignment assignment = recordMap.remove(fieldNames[i]); if(assignment != null) parameters[i] = assignment.value; + else if(wildcardField != null) { + String variableName = fieldNames[i]; + if(chrLiteral) + variableName = "?" + variableName; + parameters[i] = new EVar(wildcardField.location, variableName); + } } if(!recordMap.isEmpty()) { for(FieldAssignment field : recordMap.values()) context.getErrorLog().log(field.location, "Field " + field.name + " is not defined in the constructor."); return null; } + if(DEBUG) + System.out.println(" => parameters = " + Arrays.toString(parameters)); return parameters; } diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/records/FieldAssignment.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/records/FieldAssignment.java index af84130f8..ea220f107 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/records/FieldAssignment.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/records/FieldAssignment.java @@ -5,6 +5,8 @@ import org.simantics.scl.compiler.elaboration.expressions.Expression; import org.simantics.scl.compiler.internal.parsing.Symbol; public class FieldAssignment extends Symbol { + public static final String WILDCARD = ".."; + public String name; public Expression value; // null if shorthand diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCL.grammar b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCL.grammar index e17b5e70f..01a66a9ee 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCL.grammar +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCL.grammar @@ -244,6 +244,7 @@ guardedExpArrow field = ID EQUALS exp # Field | ID # FieldShorthand + | DOTDOT # Wildcard ; /****************************************************************************** diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLParser.dat b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLParser.dat index 59f0f80fc505a37d635d6d65130cf8a4c7b4ddbf..c24abdb0f00e248cb7844d94fee23ae2c4d6b63b 100644 GIT binary patch literal 25352 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 I{ecJkKiNrC_5c6? literal 25462 zcmcg!37lP3c|UiygzS4J0m69@LP7$BO;99>h!~M2AVO>;2?7!&%A!CdChv${sJ4}A z7pg5#Ya5qVh+PC}e6ghzTdi1Iz_#Y4D^$UW3qBysT>t;?JLjEy?%ZUO%rM{mef#&F z?`(H@cam$2z?sHmy^z2s-laJ0Zezv+r)*Gt5`5Fg8Z-4luYXqKnKR`n#SZYPQ(%Wr zIK*s~>gGmpk79$&wz{8z9c`H11%EGmdo(w@6MU!ovKPP!zMbhSR3`6O3f!P|JMJ@P z+Cubq6Kqc@vOm+-D^ezQ5?6ZJ8Ru5sOC!2#VX zjG6p`&JFw3y$MEeg3Kvx&p-j6>vPDvAMp0i8q;Id4{CZ=lX^f-&s~sr10ff&=P_f( zz%=GeAbexc&Y0cCjO_)k0^SKH?BmxfXCKDy1ioO*VM}2H9JT>?9|Xi5_LOo^(Z@~k ze5En7b}CMLTx&3XsxxLB@j;DaopF0mZ=u#4e>XVdxwf3231c;mdt<^1U55#q;M)oP z0pK&n%w)SO5eEL24fbBAe9~^^Y=ibW3xVrVrx$x~h1#TD z_$IIN?V!!ccftqY`NCQm^x5}e-)~Tyg;?gzcnmu1vNnj5c({085xACIhZ(DNEX<)z z_898SL=J77bJmy%8~2gS4_NPm8Z!$%)||xn-G1#5JN=osUhqg?=R6J$ALovHkLN0N zwoT;uKNBYQOZp8P$1&rsh#WI@wlDV8;1+Emmwlj}`-sSP=5B(#!sA%w*-rG~@rb>M zBh1<htUV3L@v)zi zfgC^kNM!$rhXL8Ite|ra17z8>e866kO|4yO{?B}=c9Ho9^F8a#R(;fr7(JgX|?ECHeva`*<*)B85K2$rxoSV(FH|04z zH|HL*qqA29IdapHEsh$c>=aUa3#qg)j@O++s?x{aia zplrUc7S$*tuDhtIjnrHfWzCNi_5Q%OdXc-xyxW1M2ih!IhSIY|#R%q0J)zo~=;yd| z%xVXk9*8JehSE)EF@pKpKB=}Qe7Re0<~h*xFmqFVXwA$i#-PG-ZJ(5y*Uxq5*2Xx{ z^gu+(GL)WXP?I`B)hGIK?zrqN4m3RwQL+rBry10=eNy!af0KI?G|=>@vZWDaEzO{& z?USlc_%gQ)8fbb{+0uxzmS#}X_DR(zyxZ}70(ITyH07kh7A-?bX$CcIpHzLqm%63U zK+~hjmPVAdG=rM9PpUrQcep#CfyTq0KG+t$MaeFUTG|RVZJ(5yeU0!_-Ko$()1%6k zMwGQQgPOKasy^Xet_vDyILzxPRoOyBHBU3BY5Sz=6Yd=D1|TJ> zl(jU2nzm1>KH;ai)1ZN-N0lv&C~Ij3HEo|%eZuRm4h=Lts%&XQSxYmhY5Sz=6TXjY z7b4^uci=S5pr-AUs!#aY?rdnF=}~1%Bg$HuK~38yRiE(JI9z8OXnIuH(ulH_W>C}i zN!2HOg|)>l(jU2nzrxjNgY_vaAzo`6pt!f^j1k}1~sWCRDGhK?oNjWnjTfQ zG@`7f8Pv3WKR&4gD}IHM#@}PKs7)n%6S=)vwS7}X8}BQ4jW_g?WsLz$j|&aCbN<5a)zgZgba|uc2oT*&V3)w`zs|8a*WD zny5#6kQ}`9hfLMHb&JFALZUe#_}$einV*^e4K~DFt%qbIBItn^Eg>e&7Hj4*L>{ZC zekW%pdhqKp9{zXeAz6qBdf-J%h>7`(66>w*Rzw2LzpB^W>ej`$D7kfd(87qI2VS&< z7;*(hQF0$}A0SoqmaE9i;I7hxc87?d2VS&lEtQ%}|Ys32j#@PkH z()$AJu=e{9=Ii?cN?OOtest%#^H2{oJ*sSJL|IESs7W26>J$C-?)A_>)1%6kMwGQQ zgPOKasy^YbbFYI2njTfQG@`7f8Pv3WQuPVPn-ggAW~E50Y(@WIInAJ^?USlc_yV`U z{Hg;@5A&f^A6i43g*K>Z`=sg@vV{oq zD?uvqG=rM9PpZDii+L)i*@OLqEosI+>s{zBgby@5s%&XQSxYmh$#{gSPxLpqH$VeT zk1AUlQP$E7YT7=j`h;(Co1l60miLmE!M#@x+8rW-9(d6bVv21r2QgFKRMPN1R%|yF z5oImSpvDSH)hGH%?j&fyO#U81o0&|yFJSCo$mD7=*j~1{ zce{6^9%y=0+0uxzmS#|6Ev4!c{bF}9G|=>@vZWDaEzO{&?USlc_-oy3p@F7Hl`V}Z zYiR~GZJ$(q!q0MNK?6;XDq9*+*3t}W+CHiJ$c@ah`9rrXo0ZMr-@M=hl7_#W1x^1V zmTGE?vBemTBqeC8<|%tAsy+$*X8V|W@b~`zqGWcvo7F-Ze&33W-y-|_eJe3|=YgpC zq4%dNNe+hgbv~G?I(#Uf+*UiOP-m0kW zn=?kfPH52`Y$}p!2_Sb?m^4wkOaDNbdUufNaF-Wd$3zh@p7V}jNZk)pv zTkw_;kzH(-V!W%eRjzFdzTt8=%}ql+puv?)A?pfK=dNsN#k8|9If+!D9M zJm8iT+tu|;ZAE{S4}Sg3H<)d{6WhSbZZB#hE4x*073LEdA$ujCUuL;ks0WPjN}dnd z+nm9Cehm20Q1KPLzgvf=P2%W)JIWn}dce^ES95rJCyoxdnQkWP0Y?Yi(e7x}1C9>3 zF>Va%0Y?Yim8_$5G%C8cOFf~ZQm@zbVtl~S0k?*Al#WJ4x7BS$J>Y19d2zI=xp{6L z#s?f7aMRs%)B}zVxZ7Dr>48-=!#a1&Ue|+qz|jFW-r+9;#LyYABlqW~NHpJC1V z`h9(gW-yAAKx*P>v<5JPO)hUMzh(Pkw?SJBtZ7Z+{JFp0Th4PJf^B?9Feb^N?w=ds^^7z-FIlt5)>i_jMQg+PALN%<+Fin=N!Wz?S}eido)5`8}bp zO$@BFua2eS9#ClME1lPTZ3qi}W$%_J=hkzu zyxbM`Yq77`g3pFMfYXKh^~ENF2M~;@>g3sC@_V(fIy&mB&e9H$G?^Q-|vz_~SO58Q)2fT@~>sT!B#tVLK~0|fgOOWoeDD|Np< zGL|PI`&vA=P`;nn0i^8#N;jmheh-Ac@}f~aue)|JuR-Ehk@MPyfw&>Uybd(l-f~~t z=N8IKUv<~`1ixSF=xexUNnbHAnO7_V&VVLb-|73hJpUGgF?R%=*MT}tmkg)NBRE|; zum#tLJ)lv0Wh`M{2RN?{^%Un77P%J`_bX2A?d|Jpp8r3yBq-0hu>f_Uo}e2FVP0kO z`@9VU;~rpNF|AFp#;MG4YGaKT_2JaUb)YW(CqITLkuV+4v%Fjexg2#Mv;t7U1+JlH z=}V#cJl_gWgl!Z*N7BfDLYBW&UoIR3^V$si73vRZXVGxq%AeC&Xu{Us15!~}7oBBz z013wM^SB2z*atn&KtHdNvv=#g!aaGCJQ+)W-Mb=d_C>iEj8nVLdu&7Rv0q_StM!w3 zkIlaziM$T_>%fke5G+O^+uGBN`_^LKx4wUSuMK`oRkLt?m4PjWllNGI;5u${lXui{ zLpHd+HbYwOuUVym`3;4zFt7SF>tekF`;`0C=M_PCs zX(DJR;|Q38{&+7?+x_TsIJa;sTCY}8U9pB5zDmaXN_-wDteEdBt`miM)jhzxFt2PzvTGkcg1p-eRa^K2dYHuM}F$?0u681kS&xH98nluSC>$l^XkTv9) zuu0Z!NoX79IG@E+UP@}uS0f-S`E)?U{K@_~mnP-v@#0W=#0 z3$L#ce%zqU-lGrdNtd;7Ztc}>%Gt^+Lekf|n3U{Q)-0Gb7<(|nt_I{f^(J~zn8d;w zgn2)VB=q)=k_{xgYMVjW0=orG6vwMz9{W# zG%+wX3C>5-zP!=Un>B20Xo@5>mWM4F{&TlW)H{*L@B4K!4-9UD1g9?_FtG#u`NJAAKvrC-{Kdi^=+`ya+R$L7PZpGZS-9e|ae@jU z151WKP;a}e{i+>%+8@L#^lb&u%5Oid9G1ZkdMDc`e z>FqLD8KwQHW9)l_xqZ!op?%Fl`NFfdhVn(DsfMFU=CWRL%QsbMV_d+XlM}84ehT;% zDuC}Q6B^oo0iRFd_g5+)`&G$45v-nnu%w5Y#d@VW#kNb?Q7z^#^Jd@g z?Ay>Gckuf*fQ}25i@Xt(zK?oa$c-T)b$q^H;9LPZzOG#4XYi8?-@Xy#_iYGa-c(Cy z=Nk}vjhZ??oVW%louBq`U-Nvo=ehDS?c(=y3ea_SL8%bKns&Xt!dYeVYuJU~r-ZIg zDlby5f7k=G584Mb`uXX4hzi4pLfGG3i~w7v0t}tewPT)eVOO) zQ(mOqACH>s4XEAQqpkb#g50Na55Fl?fF6D?3D9$a@-pqYUM)SJD|xWD2|Z6MFVZpm z-ccFK=S#sq=GdqNdCa-dmPlcqym8FciMOqcxxReX z{8ksgQ8f|B{l#xr;jt|FX4gFEM*@!k9u5pOdLb9Tg~htzTUb*eQzv!<`Askazk@|R zd<%=VO31FLP0nW4R%c7iM{3h+bL}~HMRvIPOm<0jMs}`!wOwmJXa>x)S&vz3Z#BPX zZ^(`@Q)(;i-?r)j{8lsH z-e6WC9@+4Ywa;f)Lwi?tj(y3VVoznZLbe?CV`Z=3_}YIGv*V+K);4dBK3IHh-@4XrKLMcb z%P~3~H|?e>`|k@G_^oW-WL`iWnYHS1YrOV6<|5}g^JBxOBf!4L?fueol_NF&-vHTD z&_d;$$82*$%tNo2L``d(iWQ65Hp#Y4^FP^z-n-BB-dDCcDXkqfO6Gp*YANktF^)|RNrC>IhPX)^X z)xJAKlNPOePFmMUlMj{VNsFUI_XuWf#LSlM?DEBiNwmHqMIWXIgrej|9V*2UmaHV-wY?)eluj7e-3jV?}Avx{oaYpw?g)z zToui?hm#$99&4NS9eAjo$I8quYATz5-`~|C);7BiVb=aL)(hFuGE~paf5+HE$bNcQ z+47e*ZQ&4V_YJ3Z%&lIr?6m!@nE6r6Klq-jbRNP}kCnf|v0YR8 zJ*Ktxe}>xUYU4Bie-wr{?y9pSo3Ot*FV02QThtCj&W?;x2j6r5vpW0==dX6Y4d7b< z{sQNlo{>O)ZJWq1Tkj9~i=S@+h print "Final: b = \(?b), label = \(?label)" + -R { ?a, ?b, .. } => R { a=?a-1, b=?b+1, .. } + + True => R { a = 5, b = 5, label = "My label" } +-- +Final: b = 10, label = My label +() \ No newline at end of file -- 2.47.1