From eee540a1e85d4accff2a49ee08c7940a2eb4f00f Mon Sep 17 00:00:00 2001 From: lempinen Date: Tue, 30 Apr 2013 07:08:37 +0000 Subject: [PATCH] Unit validation for functions (UnitType.Any) and array definitions. (refs #4263) git-svn-id: https://www.simantics.org/svn/simantics/sysdyn/trunk@27300 ac1ea38d-2e2b-0410-8846-a27921b304fc --- org.simantics.sysdyn.ontology/graph.tg | Bin 149657 -> 149915 bytes .../graph/Sysdyn.pgraph | 2 + .../org/simantics/sysdyn/SysdynResource.java | 6 ++ .../ui/properties/ConfigurationTab.java | 36 ++++++++++ .../sysdyn/ui/validation/UnitFunction.java | 4 +- .../expressions/DelayExpression.java | 17 +++++ .../expressions/Expression.java | 10 +-- .../expressions/IExpression.java | 8 +-- .../expressions/WithLookupExpression.java | 15 ++++ .../representation/utils/UnitUtils.java | 65 ++++++++++++++---- .../sysdyn/unitParser/UnitCheckingNode.java | 14 +--- .../unitParser/UnitCheckingNodeFactory.java | 9 +++ .../sysdyn/unitParser/UnitParser.java | 65 +++++++++++++----- .../simantics/sysdyn/unitParser/UnitParser.jj | 37 +++++++++- .../sysdyn/unitParser/UnitParser.jjt | 9 ++- .../unitParser/UnitParserTreeConstants.java | 40 ++++++----- .../sysdyn/unitParser/nodes/Arithmetic.java | 9 +-- .../nodes/ComponentReferenceFull.java | 9 ++- .../sysdyn/unitParser/nodes/Term.java | 18 +++-- .../sysdyn/unitParser/nodes/UnitResult.java | 16 ++++- .../sysdyn/unitParser/nodes/Value.java | 2 +- 21 files changed, 300 insertions(+), 91 deletions(-) diff --git a/org.simantics.sysdyn.ontology/graph.tg b/org.simantics.sysdyn.ontology/graph.tg index 4442534245cbb6d7d9b53ef67561f94f71d360b4..9140f080b3232e7ffd5d5e0aefe2f9cb58c44c4c 100644 GIT binary patch literal 149915 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 z z{oFMBg{Vf@Nh}jIn$lkw>BAz$3UFUez*@YKHN}el3lw@F`qhy08j1TVtVGK7Jxn~UYIAB?-N#jK9X?D^2ud_PgGT)Jt_ z;CHw1WemIjvVj(OY8h^Rl;D24l=CO!*}!09K*V*WGRKdT@wyjZP-ol0<)wYoE%{rs z>?^Fyu?gktA=%D?4PF<^`^9V`o$MU`1&9WJ%9fe0UDf1=!1*|7AdbrKVN7xVoB%#Z zV+?#G$)8U7?@;;!HLr<%$Zp6dTJq@xZ)++eq;@brDlKne;p9rG95V|aY@mbqhgmR5 z;iEG7L0yg?KkIwq{7C5Y#Utg1aQG@c{_PO?JsDP2Ccl%+Yh^l6@mujd60?NQO#IhF z`QkU*RZQWZP^j@YR+W56JkT0{@mf2Mzt}93*XUr)@nMo{{JD^mlqqk_W6cRclF5&L z^YzUaNO|efZyvz8OQg?V_9b|z#HBh36MJ<0Dsk1Ka#(O zbqzrLwPgKB?#4-YAYFj(`+&KzTxGa1%H;R4Z4G;~#@|yTIuBI$ugZkzwfDs~mUk{) zOjUAA%HK(6Z6kZjf6&2rtv%yR`qMLOdKRYIGjev64bjmvL_aQE#^af(p9y>Y3^tk> z{z(M>)U|HDWLQ5-R8elu_6Fs{S@C@$__ z#$U;1ZRXjnI6`Vh;vS-$SU)wzI$~Pob9v*JK=j5lJ48fyxa;eib9nE7eSRxe7260r z3&=m16GoQtUz*6;M!O#*aYy)VhSO7K|3Lo269)I44ygJ2zwAJ!*7!MCDtShhPZ>Lj zh6Xx6&uKLDE|mnn7CpiG09Kd z`A?)6%f@0cQ@XhX7|U-zeZlU|W{R0VZDq2s_1*X7icO_{Br4@*!ffqg0z+)d(@JV_ z0ykMRAzTZJv99&Jvb7yBuSr?kD(d(Pb6!lM!(F+>chi47Gd~+8ykTHj zZyN*_|LX@9`+9+E*TUbrfyKT~U}?X0!fPeGX2RnWUL)bv6J9OhRTEw%;gu6!Dd80p zULoPJ36Dt_d)Chn^F1oCNPgzE{{60Rm( zB%CLV=VL#9_OI12$IJ7tJl|wIIOaS}1tn={VBAXY}8MoviwAIF9u1 z8vUiPlU09-<4FIG(O&>NS@q{Tj`VLEJ?5oOR{hzIBmG-Oe;Vv$)t~A((!Xi+C&5lu z{fUkv{ToJq4D4jp;{#H1r2ntcFNKM$dVDv69O?gK^hd%(R{dhfk^Xg~Uj#c@^<9o5 z{lASKAH>wjs>i<;MvnB$jeZ_XWYy1g9O+*(`h#I7tNtLzk^WVq-ye3e>i2dW>0dGW zePAb-dbTA;`j?G}ft_6H*_IsXpEdgRU?P|L>bj02{WC_t7VKozujx3_|IO%E zg`KQ=T)WAU{;x*AB1~k}<62FQ^iLZ-uElk->PI?`^nWpWTzl(e)emwU>Hlo>gJCC^ zdbTA;`acWt&_Ds(2^tl?~ER2Po1p(c|L$6 z{o_WDy2 ze{!j>aQ{4%=)qq9GiO(Q{bum56Fu1L*&nj)&#w|a*z3`kI@$K;mx&(i^|wGzR{!kJ zgNYvO_3RH>^~}!$i5~3r=nL(tm;BtH=)qpk{*cu_`*UBS2YWsHLsmWegSprFmiYyH zJ^Dhs>ZL#TBzmydbH2#xpZ)noq6d3D`$JYe`*U}q2YWsGLc8jvKX)a1u-7v`WcAPf z+?nXXUeErJRnPw1k?6r*kG{~Zdg;&Yi5~3r>pA*-JK`AMP&dp-I>yXvJsw9=>T;z4Yfti5~3r@LeaXfA;4Gi5~3r7dX4uUj+Vsq6d3D z+S2az7lUt1^kCIzygre&KbL@SNc3RU7wj*&)aR>#znAF2UeErM)j#`xeWC|@J$%#d z_3Zz56Fpe)HQn6Fpe<1#&~X>ZSkJBzmydv;Sn<|L-Jvu-9J)Jz4ea|J8{e ztorOdXZL#c|Efd}R(*lo(5`yv|CNaz?DgzFS^LBMe>>5Gy&iq1-Rs%^D-u0e^^$+G z`e*+yPxN5b7sx&Bs+azME760!p8Y4QfA;^Ii5~3r7%S~w&;EZS(Subl{U@t`_8(_J zbUuJpUtI0%s+ay>h`KXzzj6%jUrt9EtnKS(IIf@V-WL^HmV8#pCxSUfZGW2Ms6Fjv z`|RXWukDWqpN~J<{#3_Nd)mwPl~+r>ZGWC=e+tUrs6Fl4ez~*PZToXkr}5c8aMYf5 z9sion9<^uA23$V!Jy0h1m-#uOVIx&SO1t( z>b?JglCA#}QK$Wz{1>gS~&Qce3q2_k`wW zO_a&jKiT>xTmNA1f3a&H`R5+7`5{~XWc7at%4GGwqGRvBr)1lI?m3$uvh`24{>j!q z*!%B>jcomM58C{Yt$(uhPqzNS-v1)l$kspiwEABeWwP~8R{sZ=cIzK@@4w60Bmdmv z>VFK%Wb2=7{gbVKu=l^vwU7Ms%uxSZpiH*@$?E^W(ysnjaP0kemTdEbIoEiVaVTPr zYA@h=!Lx+xf&4reaSC2fz^bo3haz&G9qg_*vNEBaIaHQ-7_*PZ{E{^u z&j+yTB_6JMJ|6Q$F5?xvzJOIP@i1m(iFde($9#}A9?w&->LnhosXiWTb#fUm-`}z7 zB_6Jk$`TLP96vr@Kgk-8=POwC5)aovACK27vc_XRz^a#cxaKHJytyVGuSaB!$N2-R zUgF`*_wit>lQkaa1FU+9cUWMFhcnlY54Jj4<4t$0?Ij-0ARmwCHCg9xUB{}Ic-WK5 z67L`rkNcIZ@uoRey~M+s^YNgqlgoH=Jprp;;vEoJ;$e>c_+YD(Z9K5Hmw5Y`cw8T3 z9p5UBRWI@O4ece~J|-S)b+X3eegVNLjWT#sap$MJzxFY!?4<8eKaHQuX^RWI@O3hgD{o+ch_b+X2zKd`o!cx@&g zY<05cb1lcJmw0=G_7ZP*6A!jJS>thhU~Mn)b~Eu{tCKa}nvPX3@ur0K5^u7J2V0$N zh>z>)qdMn4QD zvh5Ez(tkP8lWl*%k$!ul$JpxRQlED@j`UwL`mJFnYk!!3aHQYP=(mB1ta_er;7Gr% z(X&5f)${xXM|$|w{azr~b+Y!K=NmZEqtD8+AGQiydj%$N?KRvl^`gx2kzWP(;r^_KI$7gk?(3VFc(4g;JoXRvDBi|_CEiAXB_7zvgSJlAcvvg-4NW}Qgf$-X z3wsoAgTNAR{lF3r?BhXOCu=;cwfcG{9&ExIkLLmGQ9R74vcy{_u*3uVc$|N-#=}~z zV^8??0-LbL8}C^C%lu(Zm21zS2(CR_z7HA#Mjwlf%lmcCKY63l&hv@9Vad!NSp5~u z2VyGM-bZl_;}14r^~d(Km;SQT9cz2>w|Zz_pj;=H?X%lT*8Xt6!ydI?&9q0kPS*I; zleIn9A2@2iYG4@;&Iq3$*y?2U$M$499&qFjF_k6%V4r{N#rjIdKl?}4@t$0=_LuVm zyZV!Str%GPyMpltTb-=^WqY#v!(5Uhf8zp6f5E=LTrXpdf7pae|8l*dUHu~$v`7BO z1Q!3`$p2{LAGSJK{bL^pTmP^}{znBC|KP~~NaG*2I$8ZMFS+zD&jYYW{zn8B|KP|! zuEBo2z*Z-#fA*hj{evU_xF#!$e{ke~sPPY5ovi-Ze{$(x-d};$pR5Yx25TmNA7C;kTo7XRSLf5Z5PtxmT7$)*2->k}OLuLl)d*m-S{+@vy9Q8Ld{$Z1UaG>-r_e->Ef7f;P z$bW0%9~}8_G5%qzlePc!M^^vbZ{Wy3P}g&TvzzJn?RkGj*7haa_O;LA_QDz;dSPwP zvjF<2{ilIB-!-s~FW(d8PlA83ku`sNmG;s5I!!Ws|P8?v^ScyF3`Y)jU7w>eh5 z#Cs#Omw5k$M&rR&BWpa453KDa-hWIyYRP(k#PtPMy~KMxu*Ca!VBU|_zYwLt?O%aqJpV+U z<`1?SS@VZ$8(G^+{$4cWp_Z)kb(&+s)v>w>3xu#FX{I?^o z|0r4YbHH~bda&yAuR6QW&kXSGi5~3rGo9V*r-QLae1Div?irgOvK{Yji5?v3$yWcf zL=TSiWUI#>jQYbpY5POAdYl1Xe}=!PlOh%^PPQGayj4G$KWdyJ=p6%b#~nkmAAp) zPV``}f7jU~{S}EG?Dg-UOxFI;|K*7u?DcOryXvJs-%9jgum2Cqa{}}k9L=X0Q-cOJN)pIQ8C3>*eb1jfn&$j0#da&1XZID%e zCd%hvKbPN+$(kkW^HrB)JTIK506W?0!IAzfqwj#8Z1vzsk3Q-1SvC)PvOb@& zKV*I0Tfa)RVP; zdpg$k(!W!a{(*h}zKSy0_V1W*Kb&m=8~I-M{FrU-SpCcMIF9s7jeb?w$*Nz)aim{j^y6SBtA4EGNIzioqhKeip8FXb z>HCd-DC}g_4{;pn`;5K;J6ZLG<4E6Y^i|l&rJilck^V@dhp9#`^{t;dj`WLzzV&0+ z$*TXzais4t`gdU`tNtCwk-ppL--Mm4`ZpX$`b9>+9CotmUvnJkv4{2fuJvWu$*OI|5w<_rJilck^XR_=k<=PdT7a!9%rQQ z{}Zs2wLiai9O>s9{bR6`RsUPZk-lm4kHAjW{-7;6(&G&F{rNTQWcB|m$B`aqu-88T zJ6ZMjIF9r|p^Bf%M+l~HC*vabu4#$!HFr&W>cCzY!<~Y(HYV^0jPFDSo z9Y^{@jQ(cW$*RA}ail-k=x>0XtorXcj`Rl^{dKUDRe!bPNPnQwe+PDQsb^bqq(8vu zuYjGb{x5eN>GwB!-cOKK&wDp;q~FizFNK|~{ehMo>2Xc;>)}G!$?Bi?M&L-lkI|nC zJ6ZK-I*#;v8~s_ZleIr+OOEuo#{2%90y|m#pX@l&&o=rKU?;2oc*l``meDVRoviw! z97p=E8vOw5WYy!^M2_?`jUH!tjjVc{)#OM&!{~7~)yS&HSwxQX(~TZyLyfF@?q6`E zpJw#fD>bs}u@}gZeyY)9ZPv)D=lTIh`n`-Eb5$d&9&}1tXavbTQ@#}3e?Br6}1t%?Ksk7OkTeQ>}1t%sN%GtojukNBSL%p8m;DZqS@p{uNBXUd z{w3JSs{fbcNWZ1gzW_T~_0Kzw^w?9rKhMHWR{b-MBmL$^|1|7m)&IqDq~FZwpM;&P z`ad|1^w_h$Kfi;Wtop|tNBT{T{t?*8s{gIyNWY2EKLk5j^$$9Z^f(iIe|`x&xzw{Q zInv`y@_OiMWc7cK<4C`u(cc9-S@m~1j`SNC{cW(5RsS=`k$!!nzZG_}>Thuz>DM#* zn_(xb{wBwf9%rB*?~SmNReyuyNRKnp>#u{ItomymNBXsm{%Y9Cs=vx{q+iSEFNdA1 z`foXo^f;4!e=dWatopAzj`ZV={%f$4Rez!5NWX^Bp9ecx^`|?I^s5{F*|3vKJ=>Ba z{c1*k2JB?jLraeIs~Y{uu#>evCpnJvs~G+9u#;7Poa0Epve6#}J6ZKh9Y^|=jJ_Xs zvg-RBNBR|wz8iM3>K8eV^eY(seAvmVpX)f%k2Cstu#-zY+ma*wSflTPovi*l9Y^{x zM!yhtvie6`a-<(^^hdx>Rz0-jNRMl}U(W}_PS*Y$NNBZGLe*o-c?LXR*BR%dheE;`{oveCj$&r4j(NBk+to@nhIMNR>`rTkBtA2{( zNI%%s~%c% zq;EC)Enp{We>Qg<>069`eb~vWU(a!*M>wDV&0r_1eiO%5U;WJJC!kC&_0kp`=|464 zO;IM7dT9%e^q(00S}2oCeao7TBmKulzdFif)$^2NdKYH^Xw$6 zf1ZutNdJM+^QMNT$j`Xh@{m)S*tADlyNBUQc{wFAtRnNBI zNdL0Y{|IHW>e&_?>0dJXAD~QDJ==mK{lARUo`rw zP$sLMZNZWL1*5+lWwPqo798oh=5@VYhB8_8YzvO`&l&y2D3evsw%|zr52L>TWwPqo z798pSZuIA%OjbSHf+PL2Mt=s%WYx1RIMP33^rxUqF7=fOjw3zyxaQ{sl*#I!ZNZWL zuSS0i%4F5EEjZFYZS+e~Caa!p!IAziM&E}rS@moSj`V*v`W}?Ys%Kkpr2muAFGQKF zdbR~e`lpP30m@|6vn@E%|Iz5@p-fgi+kzwglSY3i%4F5EEjZHu!RQY}nXG!Y1xNZP zjDBB~$*N~taHRje(a%Pita`QuM|z(5x_)M$OjbSHf+PLoM!y%zWYx1RIMP36^t+=> zRz2H-BmJXBKM7^B>e&_?>Hp8@cSf14dbR~e`bUiZD=3py&$i%5|68Nq4rQ|H*%ln> ze`EApp-fgi+kzwgFO7Z+l*y&Ova#bx|De%tjxt&Ovn@E%KVbBmp-fgi+kzwg{YF0l zWwPqo798n+Vfa?q?>77s@Lh&!ztb@7cNnJqcEhy)+%WC88K(VbhH3w)VcLHbn7K|I+ck%rj zR9E4vdV|q39@xkG5asU~JI8Z9_)HOzdHb-d74uQ7Ix5A4VH0m|PAcFE_}fhC_; z8D>7o>K|HR%_n?SuQYnb1N(T$TlL$<&U{`0)_k&WV4qKnUF@1qv=z4bgx=>9W2fCS z`YL+OC;M`F68~EXf73AYN!IZ~Tm6Qyb9`VwzV}eREZ8NVUk@z#ywouBNml>R3Tr;$ zt9psiGalH-gRXk9v5x~^1lD}AZ(yHKj9u)SPqY=b`Gnr*4`Zj@Gx{oe%_sZvwIu$9 z3148C`6TOjp{<^8>>MB1kMA9n&kJ_R=edC;pXV5U6MC}xhgMkg318K-jh^wqJ|5at z&oXxA^GvYjlYImGd}8ck*L?969BSl1`}2KM>H*u}2-L|b8-Pw0LA zFm~EKqpzaZe6lZnN&Mb~k2K7DlHV?`@6c8k8#~7X_T&2x%00m@`RooX`CMd}`6R1< zXocU!^%d3hRqZl*#sm9!7*}Ecx8uF!M=P|Ii9+KH;mnU(k!ceFKZXeGJnd zS^YsPtp4Duy0_7@|6t$$S5Tf~?Bl?*!8$)2E7;Euaw&G5AG8(L{Bpjb_w#{VMvSpX zjJ`{IoiFxnR??rZCOp$H=Zmc4hqgMy*g0OXAMeX3PY-s<@3g>@->HU~U$Xj#R#@{3 zU)8;WUi|GDSp2mara!X!gH~Am!B=&Upcj9;2Nr+38Kyt7`h!+j{lQmtiqSJ4V4shF zqCDBy$AKq-b^e(wIynU_W2T zrPy`8&{o*a7xaEUkW1PCgHJuVH#*@_hChOxtmB2YI?~uVKCmC((?2lhM7;Y`iE9n^9f(o zp+PVHh6EOWgALOkS^YsPtp4Duid_2qvHxJ-|39PLFm~pr4%YeMSiydNkV~=a{GhF{ zoge7^d?1&!d&bx!M&G5q&KLVuOZrnyxG>E5BJ22}t>(tg@q+z$|AcZD?2_Nsz>?n< z!^|&P{X;9P`GqfbPxDKE#b<%(ulUq3{0W!-s1;U!kQVR}`TIDq_`{ghUZFp-`h!-u z^haO(Z$5fG@W}^Xx6zmE`~Q2`mm53#`x+QI0Si-Xto|N#m32&J28VQe0xE`}yi_CcCth3C$Wtq7K z`}uwq{C|cyzmEhiE_7TVZ;gdcTVPGpP61=={BPYx{BXj*aaR;la zjk3g}4~@t6h~eYilkmL>-{&}rhdT8y@z6$D;?al3V|&E#@$O3a?u38gIEsfl^)KkVn{(izgaIF68*MU)2zYP6fhVm7T zwg2_6gW*G2@`D(Dey@ey@^=%yKH={#>X|M=O?tq1&RH9)am?CYZ+Ry`jdF)1$|>C%HRywasKg) zecI?k-G`<9Ebt=u`7an{ACJDketn~|&1{bAexG+|yptR2^ih;f!jd_%%GDeR|;RY}ijr_|$|?N%-W1PYhg~0Ds3Pd|Y5TKaWlL=!B0-cuB$o3HK-5 zmvC>wM<%>D;hu!M6Xv?t=RfXG?2CvOCfu3ug22T=Xg@#UX2Kl_&r5i2!tDtkmhhno zACmCF2_Km70qC>t-xE=`jJb~(V~rSNjTmE%7-NkXV~rSNjTmE%_^^aA*2s>rMvSpW zjIomad=3TgAGp}taj}p4?;YhF&we-;%YU!2m{@Z8?-k~IIaYre{X<{OF8_N;@LkMF z{Dakhu`kNA68~iNzlXC&{$cn2>1$8ppZd0hcTae?z_MQ_CyX&_ykb}Q&>32&G1wh3<&IOF_mo$ywHi&bIYBH>L8ZwfoOn1KFs zAHIz8`uJ1+_X)&C*8kqZDy3cj`vhw`*75S+mn_yc{_Ehi46{FIPV2v)kHvtuS1BG2!J2|0m%$6MiRV{yk){Tn=0^Of z;g4V^zfFnL^1o^1^>|(<>*ry$zk)wDcKU}8)${YX{KLQ!AJ+)|yp7tNtnr{F=U4{~ z>_z$(yFM@BJj&ls{Jj@g;=LPK;^EBl@u1Dg8V_2sj|bmkxACCW@rb{-0!uvfDYCx- zhF@HIDmk<{S>v()U>^_lVz=>-WABgo#vh;WKZ9{bdpq;}IvD-t_XRjNWdHdiOky7d z`|&8Ft+2*h?pW75=bm=YoD0j$m1T|vtl#%wU-N$_{X>kXzpokQ{F605?9Z#lPJduO z{y%|VF?Nps<-jr@F9nwQ`WIN|1KOOd@t`I9`G9Y+YkoLi|4jV77+B)H5Ln_p57v0l z=46crE!oF|Z?W5W&l!IlKiH4|kKlh8JIDWbu+BenMb`P}T!>xgA8my-9`g;opKr`X z#LSJgv+s|6e9(w}D%{+nUWH(B!mZT?qd=Xk+>yibCk4tB}+Ujj?Mu_yfc z;(U?SKeWO+AMll94XIxIJr!8|A;)Ux_XTpY`h!+j{c$~_k6zFIgMI&>0RO?*$AMAj z=L=&c`}smH#jf*(w!(J4p!f5IT+;3tV~?2Yh4FO0(6{{eNq>Hq@Z*L#Ut}FWwE1Jk z&hdi%c;P#L)Yv)R{|hYnek8Eu`?p}tC$u?P<3UUI`vtzmuK9Qq{F~rU{68F6{6A!v zdb0Y5R#@Z1SN`ju7k|GBEdG9JnEuG>4_aaM2VePvM$deKeZG*p`~hQUzU~L>ex@Dl z*9Y@UyRHwk71n%kKf~_V1LiJb=F-}ci-<86vR^OgYknVC{j-1fCVY=!t{1ZA1KRu- z#?JAB{rEYbcL%%V`>w!}?>h}M-(>Xv}-$$bLQCSK4(wpsnb2 zzPKKs_v-<36ESibF>(peTKwCi}!E%_{re-Zp}e$Za?+hF@^ zjKArQBY(78e`MVc%XprleSQ_%pNPL#cdVbMv9Gjy z##qQ2pJR)-)Yp*X#vHttV!r%GjMnB4Nq=((>;hSZhU-hB+&(|*P<$Nf6e?y(!`=jq~qW`+TIRD>3e~`1r zJ}ARPu8c;^5Ag?kLwF?YUqu;hg>^oe59*bf55w86j`P82-;XlKf0-FS^99!aNWQ@N zrO@!&gTM2y8$I&{j`U!!FWdTjl|G_;!Dq_eAM?eS8lS!|3GrmVTpaS1@%#fv`66q+ z&{pi4ALfg8W#-GU8R`~Gviea+~ZFR<6MEjZG{htHS# zRR3k$C|}gu^#=C-n7<1GOTNxG`Faa>aFj3d$Z~z5t=Kg`%opv-%$H%w7ue?ueaX)= z<7d9WzJDVe=jeZp_X_ws$C>E&FY^VC^gJ_F4__?%e5nt$m)a;l)Z-7YH?lub_WqeK zoZ-rnFPx>iAG0@M2S@oLYrc5?lQlogmu2S5u;dHu^M$_TXPWUdUtsNz>_>2ZIy4Wu zzwW`GMX0qwmu~JjvIo=+D&^Ilr>yu!Ey~ku_gv zD|VYN+Li0EUGfFH&lmf0iWxui1BG^YJ?D zV1GSE?10q%r{u= z`HIk!b^drJ9TDcIG0m~AKhNi2zM;*|E$wA{d7kJr?We*H_U)Bzd)mwPvR)21?e{`^ zuy3zy+tY5_FEH)*M0>DruWZ}XZrjhN-o3Bp_Zj#n$`@GknXgpZ%l7~z`9=>Y=4;X zx0~b0AMMs3+4=)}e{6rK@i)bBBF0=sjJb#yxr`XOh!|su7=0n@d6#p&gZ=qj+C7);J(vDHm+?K9{qtP* z-!sRze-eMcg!cuP=Wq50==VYYp2T^`dHSPcZ~t9s|2^!pP)6H)?~vcdE{?taJjZ^& zm-cA>;K%1@HuPYBy}C2uyBz!RAvX0o-|S2NRWlymKh8{e2FCTE`_tGNc5u{R+U@!x z+w~9Dc+!5l@wXHFfg^vkTYqHh5A6N1J+4tcA6zeBpO4!UzQeK42YgZQ8GR+Ie~vX` z>TwN=;_Ve!uIFI?KH+ZY!QMa4>WFdnM~rI=*~d@0)O$Pq;hLu0*wL|{FXeN}>ovy@ zz2=j#xW}|T*G9y=Uc&Cj+veDhhjv^Ow7q=B3HI@KaQ0|EX}9MOt^w*_@(1?$`#IW! zeLS?yamM?2Uvcc?DeHK7e*(S6%Ps}uOpoG$eY~GJyN`#q)N4HY;=4*8@5_#L{pRbH zb{n61J6^E*Nz&SZ^8t#IjI?%!xHnfJ}Kt3T-v?Ye*7b9Rj{ z{&op^i4RtPeCLy6&-?hW3ETLz+xXxpKJ7L>*vF?o>|xc*{Ug?_#%pX3JJ{RLbFA^? z{*!w3|B17!e`$|37|l1>pASEQ9_;5EzR231vB`dY+zQ4T)BZ?)!P+0053=^>Z0Iq^ zksciB$ySdsM|yCiCtLlO5f$|?dARhcFj+N?YA}l zU?WHVXt(~zWq-sU*!yGqZ2~jb5hGU-bA4Dn`(ruvhgh`x_3)}=KmVoObJ^Z=>ECl1 z-*eeN&+Px!CO`BKj`Bmh%@5h;2ki61_FDy}FLE>`u`o&oq=*S;o}lMHDUOP+Ml2B#R-4I zv5uGT{@C94?}1W(FXj`mv-`lK@n;D7c%A#3>_6W?Te9X$-tUh}#$%b|vCQ#U=6Eb~ zJeD~g%N!5bk7rTII$so;Ev##;8{<=DY~yzoVi#*5r& ze9e*OGhf^J@_MdU=)Hf&8WjA={S4MX?P~OIANV~KcCdec4XrTR$>-m-gzGWO`)jVL z!O-{PZ^kaddga=U7;BTP`H<%+u-~7h-80+g!Czxz$C?k%Iv;nG_Hz9*R-T3SeD;WV zXU9>0p!e}hyJxm<4gMM%IrjZgw*7%#_akHHE#L>;pT>rcb^hc$pk3R4SnA91WG_1Q z=KD8)qyBiU1xNm9SAWQ#=u3b6{WID7WBU&bujknN zS1$eKYdgEVH^%7m|ST)!0i z?`ZhB&as~_#zK3~%#CHv4OrvLTv;yl-cEn-hJ4HXz7v?&@9b^-(R{4qILZg@nh(x5 zS@Ti0*LV%KM-HNV80Pw>-RI|ugum_BkDsxaQ(Oz>ns{HrSl{CBUgQ(k60ZMh0{jp5@8}M(w|B_)1Yd&}$M9h4^?(=cE7RNV-!kq0PU0_5;#+2Xu#f*u$5DLPJ<~t+Hoj%r zUk&?1?&U3WeS-abEOe~?d9O~pXYTJ;!gzSzll^{ptz_K~Z2L0)=zik)1J?B*?P<6B ziLC9=>I1susE-O3}j@_>Up=KmS~RNnm@j^vSUj`#K!rqu9m+{2CAGkAH0Pb1eiM@+-FaNw?+mBa{Cu z(11gJ#Wp|bHvgT7zs?W70a}WGh_t^(fBOjh|2Oyp4*Xwrxb!v9ufq4Q4*b*y9Q1j5r0;J*xB7rXe(EFL>ie$I zcLr#{fuH(-gFa7>^nC|(s}DHjr#{lHzHb|Sr-KF@_^A&#==1bQ-?u=w`hY`z>LcCi z`=-%%8fd_QpZb7^;De1HaL~v2k#6JnWfQ+sK?4r_ zj301_pQlIh`=a6h5_rFWKi__NABS`N(r3}$9)|y4;j!4=f7!_nNAVzCNAgIw@`$ZG;2@9r@4%nhccR0QJknL(hdsZ_`=!G{9`k?9$Unj1AYZYU z*M5$p>-Z<@m5(A#?KvLbfg^iJxAqWg{Gprt!5-%S2>w*waSliFNVoEct$)Bl9`k?5 z;A0&Q@)cYEz#sYdLF7?;j=^`}$R5(IJ;drCWRXAE!~7q}<(J+I{Qd;LFPAU%>D^}j z`CRY=t9_;SB$)EvW%4freoKx^Z*{ozHs79J4g6+f-ztZLzlzmA)_3p+|2E?L8;txn zI$U~_mk(P=SKPJ)-(P3=-|lef9iIQ4z_2O!_Zo-8{QEf$mtODrDI5G@ens1WHQr+D ztBkxq108)(D8E+%zdXm>pDn%2VD?`xP4G){Ec2lkC-_CkqxEGaz5@q+&vZD{7siwP zT7RhzSnXfN{4X$gg~LIubvTkox|K)lU)-O3}j@_>Up z=D!W`Iu_&gqwxJn4u|%~`U-l$tj`wHR*M-6;Ltv)+hWfj=qW$T#`3f5EoR-an041; zwgrpX)_~PtX?qrX{y_Kg0`~d>_Vxtq?G4!b6R`I;V8-K#xjnouXL0Gy1Y>R*(ZBAn zmbdg@PcY?o0QAQv_;J9xetHb(k4^BS6O4MG{4yTh0*rou?;|L&jsTZ#1#aShrdj;h z1VcCJDz9`1cs|D>pK|>B)Jk=HCpPb!A`ba?f;MSz6&QH}{U+c&2JZ!~8N3^K!r-fc z#|_>Nyer3IA9RHJ|76gCLwnf}|06xt@_(?yA)YLMw3&b}2i{>Y%kwIOS)LEgv6LtBgz|hM=)l2VmghrEd7`f% z4*FQ0z*>G{yTMD?e=`3{w2ub9!?p;+wg}UH_^A5jt|V|cFXr6d;*UEV;>Yr4j8HGR zA1%)kSj_ri@l6Td=djw_o?_1*=w4pHY+sNcu(wAs%gWLvc9-Vyl=8R)_;|z%oXFc^_Wqsk^7l)B5Om^qgCAwt$@U7Y^4d-V9?Hv?WfNhh7*4y<(2O1*|o{cC~$AN(yiS;U1aflI)!Rp`rs zQKrl**q3M9FB}f_8@3AlUtsU=@tyj55`E_-c#XmImstG;Z)vrm(_diqX9>pAQg=@0 zebUmoIhOkMK!bk;IdkH`hbHzjMb(48#?264zR`#wh@Q;!FQo+ z{E%0$jUV_!{NOw30mD||*LcE~Qdgq?ehJPDW;}`2U+|XhYv}Y3IQTaQe0ENkc%GGG ziRYOHGoHjMAH0G!o{&|#kKw02;GmCf`V2#7JWmJKc)~W~5Ks6nbd4wS3byeCe~4e^ z=mEo4;n#S=meOg7{!nCKDjyL?&2ORXx0v~7Su(fn7u*MU%5r=rfccE)Mkyo&dC-_7Byu5&6tMF?) zVN2XFQAe3;d8@ z{BMI1Pr+V3c?J7;QdSW*g#6S89Q5r6{!c@v{NDllc+xiFP`}~3(0zQFSFnjMafl~G zSxno6-^Y`-6rn5FNBzG|FnkGg@)N7S;4S`#q0>L$;9nCMyqaI)`Rg3Beiji!rStt> zf>l0v1w$vB0c92c&G1tnaM0HPMp}?Z`Tq*6@q}%}8c+Hzbd4wFk>AD>SmR0GNe`Iz zl3(KqTZ;G|@>BmmCm3xY&>2r+^%uOwe=>C1104LD0{+LGF7f<%jwPP|U@+|?R{7u+ ztnq}b;@=y7>H`k?CV_uu==A5Oz#323MjYY^--WL6L|(x*p5PDhgYTpV3|oa?;|W`e zf0yY0NrHcDFyl$A{(`soBSWWuz`?(Lz<1_!iRTY;^Uf7xKhn^@(8SFpw#vWj2I`9mLK>-c_Egh z2MpgM4BI8YmKSU*{zYQX=L}}~5Uao7Eq>O}=^t?LZvyx;IbGuU=Q);me%fHhlUU`0 zSFpwtvWlO|`9cVKC(pt32=uR(X(B{J7z#{lLNgUBGu3I?Lx{z*;`=Rj`%^ zcm>s?@P~4`#P5SS zmiXOnFylw8^1&-u;|E#A4;X&x0}lFb1b)AvGk)&_*7(6T!5TmC3byeBe~1@+B|Tu+ zCj1&N=q|oD(f1yM882e>2fW318#?U=4))&w{H~lX@p@;DC0_3^nDHW3`QR0-@q(=4 z+YLYU0SA4L1b&;LGhS~6)_B1-!5S~{3byeAe~1r!B|Tu+Cj1&N=q|n`(f4M9882e> z2fW2M89MC;4)$LU{KlLv@p?m!C0?&LnDHW3`QR0-@q(=4>vDdP_u3qbyw?~^dBiFY zyn@G??;;RUUW+t31dmzQFL)e&AsLwZP9e^izPJ2dw1*Uj=JK}NE&o*@W104K$81S=ly2S69IhOc6!(hgbSmlFP zu*MIvicin^Mc&hLEb^XeFy#@eJn#xud5~3nis7gIz`_2jfuC&XERQDvYk9y|!CD^R z6>Q4`{2~5`9q9qX*9gN_$*<)BTZ*?O`k$EKCm77~Ay$9ETYS8s(?8(g-wxo%<#dVX zV{jfX zhj_ww(gTLA!msg!EyY8L{#z0}Z!qIYtp0+xIA`ee4>Q@P{t!R-PI|zwRrocY zu%&o&qJMvan+7wU#Og12iw#4kf55@ND}kpHId%rZfOqF~sXw(GOZ}NJ_*dX3 zR{7u+tn~-7isOc#`hbJJZNR$>o$;#zYy4mvafly$7rMp|c?H|}fj`6#zLOp>Y!!Zu zCu}L+nCQPD!H+bU@g!D%!CSoE(CHs=@b7ZqN91&g=gu5UJg+mD@g!FH;1#U#gskGj z4L|h(2Yr_TUu)=$C&s`KPuNBr;(4Q|Ydn!x_-#DFAL0k!Ne>vd3ctn^wiK^P^kWPQ z`+2lyhrx^|vHA<%BKqjSPyc{}e-8n^DyK_4(FX;7%D>WJ#*NCp0JHL#Pb?Y*Lbpili$V@IK&UWlO8Z^6Ml^++at;}`(aCQqoFe%8-TUHV0jU1{J|^O#vk+$Z`LP^Dc@q)D*3fM zU`z2L$X9vP|DXh4XfVr%Sp5ZWalN6_Kj7dW{l6fmOFYldvBYzo!Hg%d$_KAtjVELk z#|%I90SA4I|EQtUpAleK+nDU5K z9(V<-Jjg1p&G|)MPmV?2c?MG+vC0FlV3h}1#WjYX@c<6-KwU1bHuO_~yMeWQ5j(+J zp5PU1%M<*e{7@F82aMQ77`{gswu?M1Z`f8mH?ik|34VaVEPrD4AH2o;8#?_34*p&Q zd`?c6_;%%3;(I@X8DC;&!e}WiA{pZQR8ZX#Z1P<|nZ^WTLXMBlmyofa(&{aIi(8+&df=@7* z^=l!l{vof>6(hFA<4u102ORuke|ua`mv|nVV~OW61~Z<-Dj&RpHJ*@FTxIyF4>;&M zA9$sq)87@q8c*0p9O8-C2wm$R@(Q-`1b?V+C~MLKMyw(X+aOXjkOAMX<0tbINestz^iEl@aCBE$jGrq(sAH0G!zK~Tc<@_SAm}8MwFqra) zRUUW+t31eJ_TWG52MqR)qAdPk=!j3@e}J{T;45(`FT_&lzPy-MuqiL%P(FxdgyDOH zVY}ql@`CEZ?-P6eJHaTU;19kRh`s*>@D~2l(BUs}@E2o$;deQm@h!mDAdmk4)?ma} zu*wIoU>{$~D&Tv_Pkq2a-!Slh82Tx|kfrgZZNwU1`Yv>hFY*eu@ddxem%fu8Fl-lo zA5Yp+_;sQmJ_UPe&%YT=dBl*(`Y!!Zu zCu}MFJkkFT3I2P78Bb#M7rcd^89MC+4*m@Q|1_sdJpV4oZ2yIy7|eJQt9Jhd?!6%*ed)QPuNoUA@pf} z>i>bkj32T32j0T>4W0e~2Y<@I-^=L|zrW3~#P7QXGk(M>AH0G!evno8j^U?1;GnM` z_}hj~`@aRO@q=xGHD2Hqtp2h-fj`6tzD5|f3BSe*x(naT`FYnl!sjIT^aNu(kN8V5 z=3O&O=Uu4?vpyO9yz3F+&nNg}34ULK-eo}%TmEh?F?@Mqs!4FID|YD~g`6(& zLYs)n<1Y+myogmk+YhnE3$hBI%lSp#XLBs^|BS(uN38O|D_G@0R^iVLKkWw&_MZp* zX+vlHKLxDuhp&P){@@jC;}8B2Z^VxDfZsSp5TU;p2u* ze}IEOYk=>_=@LKmNl|%x)L_PsSmm?-BG&jpR^cOtpZb7;|1M?4<`CV4Gl#7kCBRc!58}2fmUXFl-Zk zjTdwm-kIoohrx^&vHAnv!rKj<_5%m|9|-)moG$TtYmTLTzQth1i&*7@SFpwlvI=iD z{L}{=^gRIhO@_{Ry%AXB1=|E`yud5i#tZx*KJbkVeSh}9qP z7G7uQv>!Owe}CZD=5&eIYjP~{dbPof7qQ9*uV9TAWEK9*@KYaf(02~-s|=m-dL^*N z3$_W?c!5{2jTiVseBdkT0l(VwYrLSl@QOs=%ME6{h}9qP7G7rPv>!Ow-v#{AoG$Tt zNsc96FE*I*B3Aj}6|C`stip>7KlK3zefI-?p`kNgF96nf!8XAfFYpSs@dAH{4}2v( zVAv-78ZYQBJU`L*yaYejV8)MF{R3~|IfhPufP+67@UwHe#P3--miRr>V8)MF<%3u7 zZ~XiPvI@`0`9Uz82$0V9?XMl2!>UqqhP z2iRJ8LSoJhd?h_#*e3iMFX%4ZlIWXH@SMT_1%6`n z54?qghE9KggFj~gAIRwvzu6p1{ALVh{D@UPcm-?xAgjC zc+$}6-@XLjl;FC-lm{H-od~=)r%UV6r_Ci)+m*J=Xz`=jUuWIPTHv(&Y zLF|b`eL>j@UF!?-3byqH{J~$8E$IQ%SBqi0kqN|58lEf z44wW02Y*ih-f8Ic_qqf>Ji*r*OnJaT-Z8)r%jr^H*W_5r>uTWN`0)?C1!A=qyn=20 z0X@VEwvrw&Y>hB%B@XomwiR|5{j?W2*n2$ic0;HCR{?8zBUZ$ryipcH*YZYQ!M41? zAM8U}kRC8?qkJu2*iv|CqW?-fv-;=mkMAs?Ze1_&_dtm4`=113oaXP>N_;_AeUkr* zJipMl8O-`ZtnmkL;c`R&rNbd!tAH;vbjIr;34U;bw;D`&z(L+J;7fD5)R#+gEcRXu ztn~%F1!A=qyn=0g0bTv4t)vGGTO$lxi9>yXZG|mHKkWq$_O1lpZ0PiV6R_47#Ev-B z7nH5gwZ0&)U|V0nAM8U}kRC8?qkOF|u%)mu(Z9i9mM5{s2fT%g44wV}2Y;3VKgiJO z&xHwIpWq7&raa&vuLOL4PM7jrmt!foE@D_;GUhoRGj!KpR1*DVgIPa_)j#kS`VF1_00)1Hz--;JjP2@=jPbyszoS0lr=vfc#Qz`m_^G~sqr5e_d@0Y>IhOLooI~YP7Uv-P zz8pSZPF#92-tqGqC%bSi=vuyzEm-3N*@A6-1b>i^*pMDDViRG+hB(wm#G>#(V=w&y z*7z(b06)Oc8Snc8YyCml2-f-oUct8hfIrxSvL-!X+Cq6+U!c2iPNJ{NVAdC6jR$xO z_cL_b53Kfg{vJ5X=~6!T&9Riv*#@&bh*ds#1#5X^z-Q(BBJa!`i@f_7OnJmA54?g^ z9%L2HF#NP1IM`2rPd9YN|1@BYKYSIe@dvM98-MVJcq4YC2Mk{$3|l3?mIrJpoSNu| z4Lbg}(LQ4J54?qw4W0e~2Y>z(_@taJ@jEfc62B7+X8ed%K6nLd{2;4vyy2%l;Gpk! zz{eRn<995u#t*g$*7$)}u#F%1L%e+cfMJ{PYrLSla7>~PbCf7v#Oe=t3o8ws_5%m| zVP|1QPM3JW)*z4eEHjw#B3Aj}6|C`stOCZ^ke~X1gTCJaFEMn=#~2dg1=|E`yud5i z#tZx*KJbyj9((yLPtt>Yz&4hF#`6?>hYu>BcYKJIF7}gd z`p?@;LK3;*}$1`9b?|^-I1nkQz zU|*h!rM%InX?>Oc09eak+SgW-R{+ zf3Q>fQuf`%I-W3A#9BU(O|14v-)}L?mi&+_v1Zx+BmR8<*0##w5Z~K@f1b-Ld?~@7 zO7Mpg{H_F}+#-3eOfdUPtM7>kK9t~_6MSQWuSzh>&&nT2@ck2fT7nU$D1T>+Wvn*x zCDy>9d>HG0$m7|;cpBW!^0xSg3I2M58GpYxcH<<11X9@mkg8weT zKS}V9fxqp3KS5*>f74^iBK~WSDU0~)9#a;v*5|Kz{9R9{tv@n!+Iwe$88gjKI>!Wy zzn@@^5o+(9_)e_$QWmk=OIgHfFJ%#{eA-K__R`kBHFVnZodka?!GDwBZzTAuz-ljL z5v#qFMXdHx7O~n(S;W>}VzrmHe%a7zFYBoC6Mr$me}(bj^XQ+h_q@b^0sKf{$|C+8 z@MG|ud4W}4=V$T#FLNyY{TC7p*~%|;$PW6*ORV}Ri&*tBFRZfmNR9`*e;)AKR?e_sIl*!ssI}vFf8NV%5jIz$#DlaZX|7-;v;t zB^Yyz5KrZfi=JAyFJGe z&krP+a{{aHeMTR7iB%tE5vxAt1=jqc@4Yz|ee7ec{C6i9V_xu&yu_-HvWQh5^8%|p z(f7_Ai@tXx`0WXPo6$#JV%0}k#Hx>Zfg^oy&9UfvOM>5=;5Qk4za+sgHu}g*tokU6SoJY4aHQ`= zITn2{OfctgwtYO`=p!$&>Z2@T)yKTRnqS((^KvZuo}1w3B>34zA9;yYA7v4%KIR3E z^gS!bqVJgrenx_yZuF6tSoKjBvFc-9;7H%oaxD6un&77-_{l~ed5KjYWf7}B<^_)Q zJt@bc@3sU#F~LtT`p8SH`Y4N7^)WASr0?-L7JZLP@M9DF7^9E8#Hx?7h*cl+0!R8D zonz5=Yl0t@;6p|qd5KjYWf7}B<^_)Q-I8O`H=p3S1Rpf|$V;sHD2rJ2F)whW??8@4 z-)w?s65KNS$V;sHD2rJ2F)whWZ#u`K@8$&WPjJ)dBQLS)qby?8$GpIizDABk-&BGp z6THvpBQLS)qby?8$GpIizMFC^`sxYZo8Uc0A9;yYA7v4%KIR3E^zF{E=&L1oBEjQE zA9;yYA7v4%KIR3E^zF*A=&L69#suGB^pTfX^-&hF>SJEuNZ%uKEc&ib@FNnu)952F zvFf8NV%5jIz>&V|axD5Dp5SW}{4k@Byu_-HvWQh5^8!cuuF0|JyE?%;61?5$BQLS) zqby?8$GpIizN>O9`W~9#D-(Q$(MMil)kj&xs*ibrBYoR)Ecz}_@MQ^ph|x!0V%0}k z#Hx>Zfg^nn&avp*n&3+le2LLVUSicpS;VT3d4VH+7w1^?ZAtLv1aC6>$V;sHD2rJ2 zF)whWZ)1){--ZNVl;8&$edHxpeUwG4`j{6u(syBwMc?`aUy$JQjXv@ct3JviR(;G1 z9O+w^W6?L3;L!w+7=7d=R(+I3tooQ2IMO$qW6?L1;K2kB7=7d=R(+I3tooQ2IMP?n zaobn$9XRZN{}Q<0&?^oH`Y(X{5;}08{{Xb!gbp0&UjXeqL+^1o?C;Vx&;zC|7E`yy z)CC;me+qaF{``Es^fY{5o#S@$cjs8*eJ=3*u%9!B|CyIK1Kx@MAzQG{|L^1R*`U|) zowCV)Ch%_jPuUN|pVj|>9E<+@=UDWg1FZU)mpC)}iLHKO)lb>Ps-LpE@MrbkH^-v? ztQ?E}Gk{e;^Acx9Ke5$MtokXNSoKr(>8AV`KZ_YFi)p*Xlm#60t-|+HQNHhiJ$vx~ zM?HQw@Lu4LI2`y-13nplYVRrdenNte0X_-&Z^HlNB|Z^nD*uW9mw0?U=nutr<|X}D z;78&AMT&i>nC_Rkh~ zC-~e1qaTd;(a%Mg{lArmzA3`!S0c>*!}7ELu$XPz;!=VEExq)+1phX{zfSP468y^q z|4V{@k>Gz!@ZTl)Ckg&>f`63Yk0tm+3I0HW-=E;5f0Ey7H}NaIF5!Q5f?t*3S0wo5 z3BE1CN&7E7A)!A$!AW~B-H^~9oZt%+ygtE6dnv6;=wk^UNpRA>c(=sXFP_y$I4OTQ zYc=tfvD)I5Nq*Mv0z@L6zvoKX#XInK2ENOu^Zf8_9huwOuc}oiF({4*n!obu%eHUn zZp~DuXL_=O^@*9it5+>wwfw5u%b0DW2QEJpgQTK^k)6YT5o03BB?gP+|8N2wP}&j>V*kIV#2iBgOSVZ+~m{QAEm<< zpT0IqXXh%P&NY&L;pJCszWTB&oOl~0xCK9_s`bVM{5!a}*2t>#eWHG#J^|Nv&1buM zGuYEDayBLI%^ih%t(&K3y642Xb0cH#?`>`CJSR%OO3){YiO$w!bARpdNK0AoKp`Ja zsx>ASCd_2(rA!y}f@&8oC|}CEvzhEdSEVRELo6GPBo>o=LFRP}5#mVEk2sR8$+~B< zwYiwphO0K&sx6X7<=UK%HO|z}%9KeYySG2|svRhSwESB)&sL{V4Vq2V^WE7TEBM)x zVOpfwvdZePGe2y0Hx&eSrr(%D+D@&?KCvbMy` zy|wzDy)%c`gVs!K|2?P(3s-`=6#se@oD=Fw*s0D~2JA){{FB7UhbK1P%f8~4`ot}H zXK`W_NzNqX(|K%^&J~DDUm2w@6Et+)*3H-D9mI9D>1GBWO-FDGl6tag-!9i19;~-& ztSU<+d-KTsyN4BOPF?QFTrbiYc~J`96{GZ)pnFr3TlI#o$*Q8Q;}2Fx$M2QU@!vMR zlXH0abY5rEJANl<=vs|9Jz}ezJEDkp{8qBpjy&Q=GWwvbtLU$Gxq4i6Rd^RFaK~?~ z?VXPi)V1k~h1%(O6Tu4Yvx9R8`E>j$lEJx=OXsZ9ef!sl<4F;EvY>lYhA_;PVaG2- z*4oRrZgZ6#-EBT;;BeTQs!mQ~Fho~am8rrm*7B!HwqCe>=>q-J-ueBt>0Qmq`goRv z;2$O5pQ5ZTT&S#mF6wlq^vn?5pM`HfjW}u{{U_nuk0Xxf3p!`VhHVS@JyUJ$sWrl| z(eXoJ?zw!!wTlFIvO2xzu-LxHD(v{apy#*c)q7*JIa#YV5ZcDX;k|mZF*7~8z^LDB z?5?64UT|z*v`eQ7*8-ea*9=q?8pHRjt(`BksN*{!gx|L5ov#$shY;RP-ATjw%^>h^ ztiX0c3a)z*u5T)Ji37EX^PW?4_>z2O&$N*2umJQZC4{Rb0gyX@bU9Sz`3 zBKt9yEmRE}Rm{0D0iJB`smiR@jnLAxwl+Ait)XdDNk=8({E`hV&b4Rnl$)40_mulR z*RCo|DEE80;6O|4_@WrnxqW6D^LH5b)+hvDh^ZZ)i*e_>1mByk#5uu{eO6@kY~Ol! zY(1(i&E!! z^S)Sk$2$Zcdv&8ev$fTlt!;14PLHGG>To50?&b9s0=#E)Z9gW(wZ{1Tre>p28)pz& zafUaFq*Jyu5TG)(7lN&1|yB?ld!?vn(+7}q4UL* z$xnx?0V^-9w`Q8t^V#O=OcklF#&&GqTdQIJvBTBwWgDy0*`~c%wZn{j!gG&ci0bvra-MSJmV zL#jr0S$)@ZbsAH&4j1*~7NFcL;ufOpUzE}m%2JgE`HjO;rVdM)l#~^wY9iylg%azM z*m-$#Vs^5IUg!;i?@cYiu;Xh<=i^0~RzU92%ct|5HoeUi+S!YC9apz%)9f}bmRx*o zLdRzLy5a$?Z0CkeJGNf4<$4Hyv?QYIV{do9fR)?PqN)=u)|eJj*GcMeN#T()CX^*E z4on!8gifh4#BQHxnHB_-hJ|HCUOkZ5`Ep6TH$wsf==-iyMAjdObv@a->$5Ha*-SIrRdd^1`5u!?o(S)Vd{ZJz06Rmw>5JBfDUIR+h!*!Q8fdUjrlV_B863)g3`BHr?2 zAf!Tss-~fVI80H-G3Uh|+x{kI3~0P;STlQ3nX}sTG`68_g*d!qyxM1z%>*GtoAs! zwLpIX4jxCzr~Nm=>xY>3e;0Jl5p;DB^6MZZ+D~YAdj}WQ^Afvwc5t@z{!SAvkc7A^l>;#~C+kyQuRrb`g;(v!JG!q%k^GXNldr0^W+yTBmZlaURObxAR&lIl5gp`6`Vp7TF&9F+r(FJ?3}3pvmYys(WwliNPegIy>Arm0 zKN_WfIHZ3lO20j%e;`VKub_EorSe=SjB)OYRdi2U$7S`Y`i$Fc@;-1^w~^Iw?mx)^P60EvY^A1Ni1e$y~`h>kgiH_S^n?w+R05OZj;j5?(4cbz+G!(L4zJ0>K^I zXPV>t0H5vPR-O|BKFz^Rlg-%)oPfVSIC`59mTj1wt54QtVOnt8EZQ}@)l$bb)yV@` z_q9(KH7msYgJf3Dho&Z8=@P=?zwj>+KkpXEX?)QgRy`o8X4<%HU75$&Q9Mh;r0lc4 z&K<^nj#^xNpw(YoE$Bl_uuWK>ME7Q#55(N|;9t(eB_HSJ$l5EX%$S4aBJA-&7xi^ZhP64%>Ml1zQ9mZ$ z3yP7tmS=Z*Y{tb65FfCuE?a*s%yoKey{CT;_!61t3=C+sNWM+!L{Yy3Zy<(@|?41p3AE9wdsB^V_T=>dacEo zx6ijG<{O^b?H3Mj-(MTA@2;a#vNglCCN|v(r_piOxr>K;Db>tn&9H}X6Kq7^T$*>5 zVKdxpjkiQYuj9r9z;7Ryb_w%wH&qW*dna*_)qBM*%7K`NrW8GFC|xR)vt3`0p2O|u zWSBF~RwwJXNPWkiQpxRn9V5HK*}>{`0}X=dZX4{luz87@Gvb_t

7ONSGW~RO$dkcs|cLmLA^_u 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 literal 149657 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Ð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 SYSDYN.SysdynModel.solver --> L0.String -- SYSDYN.SysdynModel.variableFilter --> L0.String -- SYSDYN.SysdynModel.fmuFile --> L0.ByteArray -- SYSDYN.SysdynModel.timeUnit --> L0.String -- SYSDYN.SysdynModel.exeFile --> L0.ByteArray >() { + + @Override + public Map perform(ReadGraph graph, final Resource input) throws DatabaseException { + + Map map = new HashMap(); + map.put("year", "year"); + map.put("month", "month"); + map.put("day", "day"); + map.put("hour", "hour"); + map.put("min", "min"); + map.put("s", "s"); + return map; + } + }); + + timeUnit.setSelectionFactory(new ReadFactoryImpl() { + + @Override + public String perform(ReadGraph graph, final Resource input) throws DatabaseException { + String s = graph.getPossibleRelatedValue(input, SysdynResource.getInstance(graph).SysdynModel_timeUnit); + return s != null ? s : "month"; + } + }); + + timeUnit.addModifyListener(new ComboStringPropertyModifier() { + + @Override + public void applyText(WriteGraph graph, Resource input, String text) + throws DatabaseException { + graph.claimLiteral(input, SysdynResource.getInstance(graph).SysdynModel_timeUnit, text); + } + }); // Scrolled composite settings diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/UnitFunction.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/UnitFunction.java index de8b9eee..f8e5839b 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/UnitFunction.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/UnitFunction.java @@ -78,7 +78,7 @@ public class UnitFunction { Object expr = sm.getMapping().get(expression); if(expr != null && var != null && expr instanceof IExpression && var instanceof IndependentVariable) { - String result = ((IExpression)expr).matchUnits(graph, sm.getMapping()); + String result = ((IExpression)expr).validateUnits(graph, sm); if(result != null) { Issue issue = new StandardIssue(SR.Validations_UnitWarning, independentVariable, expression, unitResource); issues.add(issue); @@ -117,7 +117,7 @@ public class UnitFunction { } Object expr = sm.getMapping().get(contexts.get(1)); - String result = ((IExpression)expr).matchUnits(graph, sm.getMapping()); + String result = ((IExpression)expr).validateUnits(graph, sm); return result; } diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/DelayExpression.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/DelayExpression.java index 6a296c80..59121d64 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/DelayExpression.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/DelayExpression.java @@ -11,13 +11,16 @@ *******************************************************************************/ package org.simantics.sysdyn.representation.expressions; +import org.simantics.db.ReadGraph; import org.simantics.objmap.annotations.GraphType; import org.simantics.objmap.annotations.RelatedValue; import org.simantics.sysdyn.SysdynResource; +import org.simantics.sysdyn.manager.SysdynModel; import org.simantics.sysdyn.representation.IndependentVariable; import org.simantics.sysdyn.representation.Variability; import org.simantics.sysdyn.representation.utils.FormatUtils; import org.simantics.sysdyn.representation.utils.IndexUtils; +import org.simantics.sysdyn.representation.utils.UnitUtils; /** * Representation of a delay expression. The order of the @@ -252,5 +255,19 @@ public class DelayExpression extends Expression { return "This + is + not + a + parameter + at + any + time"; } + + @Override + public String validateUnits(ReadGraph graph, SysdynModel model) { + if(parent.getUnit() == null) + return "Unit not defined for " + parent.getName(); + + String result = UnitUtils.matchUnits(graph, model, parent.getParentConfiguration(), parent.getUnit(), equation); + if(result == null) + result = UnitUtils.matchUnits(graph, model, parent.getParentConfiguration(), parent.getUnit(), initialValue); + if(result == null) + result = UnitUtils.matchUnits(graph, model, parent.getParentConfiguration(), UnitUtils.getTimeUnit(graph, model), delayTime); + + return result; + } } diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/Expression.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/Expression.java index 9f5f28f0..9a326e47 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/Expression.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/Expression.java @@ -13,10 +13,10 @@ package org.simantics.sysdyn.representation.expressions; import org.simantics.db.ReadGraph; import org.simantics.layer0.Layer0; -import org.simantics.objmap.IMapping; import org.simantics.objmap.annotations.RelatedElement; import org.simantics.objmap.annotations.RelatedValue; import org.simantics.sysdyn.SysdynResource; +import org.simantics.sysdyn.manager.SysdynModel; import org.simantics.sysdyn.representation.IndependentVariable; import org.simantics.sysdyn.representation.utils.UnitUtils; @@ -63,12 +63,12 @@ public abstract class Expression implements IExpression { } @Override - public String matchUnits() { - return UnitUtils.matchUnits(null, null, parent, getExpression()); + public String validateUnits() { + return validateUnits(null, null); } @Override - public String matchUnits(ReadGraph graph, IMapping mapping) { - return UnitUtils.matchUnits(graph, mapping, parent, getExpression()); + public String validateUnits(ReadGraph graph, SysdynModel model) { + return UnitUtils.matchUnits(graph, model, parent.getParentConfiguration(), parent.getUnit(), getExpression()); } } diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/IExpression.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/IExpression.java index 48ecdaa4..78f21bac 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/IExpression.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/IExpression.java @@ -12,7 +12,7 @@ package org.simantics.sysdyn.representation.expressions; import org.simantics.db.ReadGraph; -import org.simantics.objmap.IMapping; +import org.simantics.sysdyn.manager.SysdynModel; /** @@ -63,15 +63,15 @@ public interface IExpression { * Match the units of this expression to units of its variable * @return null if match, Error message otherwise */ - String matchUnits(); + String validateUnits(); /** * Match the units of this expression to units of its variable. * * Requests units of referred variables for request listening * @param graph ReadGraph - * @param mapping ObjMap mapping + * @param model SysdynModel (with mapping) * @return null if match, ERror message otherwise */ - String matchUnits(ReadGraph graph, IMapping mapping); + String validateUnits(ReadGraph graph, SysdynModel model); } diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/WithLookupExpression.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/WithLookupExpression.java index c98ee79a..2343eb8c 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/WithLookupExpression.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/WithLookupExpression.java @@ -11,12 +11,15 @@ *******************************************************************************/ package org.simantics.sysdyn.representation.expressions; +import org.simantics.db.ReadGraph; import org.simantics.objmap.annotations.GraphType; import org.simantics.objmap.annotations.RelatedValue; import org.simantics.sysdyn.SysdynResource; +import org.simantics.sysdyn.manager.SysdynModel; import org.simantics.sysdyn.representation.utils.FormatUtils; import org.simantics.sysdyn.representation.utils.IndexUtils; import org.simantics.sysdyn.representation.utils.SheetFormatUtils; +import org.simantics.sysdyn.representation.utils.UnitUtils; /** * Representation of a withlookup expression @@ -46,4 +49,16 @@ public class WithLookupExpression extends Expression { return "interpolate(" + equation + ", " + lookupTable + ")"; } + @Override + public String validateUnits(ReadGraph graph, SysdynModel model) { + if(parent.getUnit() == null) + return "Unit not defined for " + parent.getName(); + + String result = UnitUtils.expressionUnitsValid(graph, model, parent.getParentConfiguration(), equation); + if(result == null) { + result = UnitUtils.expressionUnitsValid(graph, model, parent.getParentConfiguration(), equation); + } + + return result; + } } diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/utils/UnitUtils.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/utils/UnitUtils.java index 85365768..eca1fe34 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/utils/UnitUtils.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/utils/UnitUtils.java @@ -20,8 +20,9 @@ import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.exception.ManyObjectsForFunctionalRelationException; import org.simantics.db.exception.ServiceException; -import org.simantics.objmap.IMapping; +import org.simantics.simulation.ontology.SimulationResource; import org.simantics.sysdyn.SysdynResource; +import org.simantics.sysdyn.manager.SysdynModel; import org.simantics.sysdyn.representation.Configuration; import org.simantics.sysdyn.representation.IElement; import org.simantics.sysdyn.representation.Module; @@ -35,9 +36,30 @@ import org.simantics.sysdyn.unitParser.nodes.UnitResult; public class UnitUtils { - public static String matchUnits(ReadGraph graph, IMapping mapping, Variable variable, String expression) { - if(variable.getUnit() == null) - return "Unit not defined for " + variable.getName(); + public static String expressionUnitsValid(ReadGraph graph, SysdynModel model, Configuration configuration, String expression) { + try { + StringReader reader = new StringReader(expression); + UnitParser parser = new UnitParser(reader); + UnitCheckingNode node = (UnitCheckingNode) parser.expr(); + reader.close(); + Set components = UnitUtils.findComponents(node); + HashMap units = UnitUtils.findUnits(graph, model, configuration, components); + + try { + node.getUnits(units); + } catch (UnitCheckingException e) { + return e.getMessage(); + } + + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } + + public static String matchUnits(ReadGraph graph, SysdynModel model, Configuration configuration, String unit, String expression) { + if(unit == null) + return "Unit not defined"; try { StringReader rightReader = new StringReader(expression); @@ -45,9 +67,9 @@ public class UnitUtils { UnitCheckingNode right = (UnitCheckingNode) rightParser.expr(); rightReader.close(); Set components = findComponents(right); - HashMap units = findUnits(graph, mapping, variable, components); + HashMap units = findUnits(graph, model, configuration, components); - StringReader leftReader = new StringReader(variable.getUnit()); + StringReader leftReader = new StringReader(unit); UnitParser leftParser = new UnitParser(leftReader); UnitCheckingNode left = (UnitCheckingNode) leftParser.expr(); leftReader.close(); @@ -62,7 +84,6 @@ public class UnitUtils { return e.getMessage(); } -// node.dump(""); } catch (ParseException e) { e.printStackTrace(); } @@ -71,16 +92,15 @@ public class UnitUtils { } - private static HashMap findUnits(ReadGraph graph, IMapping mapping, Variable variable, Set components) { + public static HashMap findUnits(ReadGraph graph, SysdynModel model, Configuration configuration, Set components) { HashMap units = new HashMap(); - Configuration configuration = variable.getParentConfiguration(); for(String component : components) { Variable var = getElement(configuration, component); if(var != null) { // Support listening, if graph and mapping exists - if(graph != null && mapping != null) { - Resource varResource = mapping.inverseGet(var); + if(graph != null && model != null) { + Resource varResource = model.getMapping().inverseGet(var); if(varResource != null) { try { graph.getPossibleRelatedValue(varResource, SysdynResource.getInstance(graph).Variable_unit); @@ -99,11 +119,30 @@ public class UnitUtils { } } - + units.put("time", getTimeUnit(graph, model)); return units; } + public static String getTimeUnit(ReadGraph graph, SysdynModel model) { + try { + Resource modelResource = graph.getPossibleObject(model.getConfigurationResource(), SimulationResource.getInstance(graph).IsConfigurationOf); + if(modelResource != null) { + String timeUnit = graph.getPossibleRelatedValue(modelResource, SysdynResource.getInstance(graph).SysdynModel_timeUnit); + if(timeUnit == null) + timeUnit = "month"; + return timeUnit; + } + + } catch (ManyObjectsForFunctionalRelationException e) { + e.printStackTrace(); + } catch (ServiceException e) { + e.printStackTrace(); + } + + return null; + } + private static Variable getElement(Configuration configuration, String name) { String[] elements = name.split("\\."); String element = elements[0]; @@ -122,7 +161,7 @@ public class UnitUtils { return null; } - private static Set findComponents(UnitCheckingNode node) { + public static Set findComponents(UnitCheckingNode node) { HashSet components = new HashSet(); addComponents(node, components); return components; diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitCheckingNode.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitCheckingNode.java index e80e60f6..399d04d8 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitCheckingNode.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitCheckingNode.java @@ -11,7 +11,6 @@ *******************************************************************************/ package org.simantics.sysdyn.unitParser; -import java.util.ArrayList; import java.util.HashMap; import org.simantics.sysdyn.unitParser.nodes.UnitResult; @@ -30,22 +29,13 @@ public class UnitCheckingNode extends SimpleNode { String node = printNode(); result.append(node); } else { - for(UnitCheckingNode node : getChildren()) { - result.appendResult(node.getUnits(units)); + for(int i = 0; i < jjtGetNumChildren(); i++) { + result.appendResult(((UnitCheckingNode)jjtGetChild(i)).getUnits(units)); } } return result; } - protected ArrayList getChildren() { - ArrayList children = new ArrayList(); - for(int i = 0; i < jjtGetNumChildren(); i++) { - children.add((UnitCheckingNode)jjtGetChild(i)); - } - return children; - } - - public String printNode() { StringBuilder sb = new StringBuilder(); Token token = jjtGetFirstToken(); diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitCheckingNodeFactory.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitCheckingNodeFactory.java index 434b982b..e3db8e8f 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitCheckingNodeFactory.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitCheckingNodeFactory.java @@ -16,12 +16,16 @@ import java.util.HashMap; import org.simantics.sysdyn.unitParser.nodes.AddOp; import org.simantics.sysdyn.unitParser.nodes.Arithmetic; +import org.simantics.sysdyn.unitParser.nodes.ArrayDefinition; import org.simantics.sysdyn.unitParser.nodes.ComponentIdentity; import org.simantics.sysdyn.unitParser.nodes.ComponentReference; import org.simantics.sysdyn.unitParser.nodes.ComponentReferenceFull; import org.simantics.sysdyn.unitParser.nodes.Condition; import org.simantics.sysdyn.unitParser.nodes.Divide; +import org.simantics.sysdyn.unitParser.nodes.Expression; import org.simantics.sysdyn.unitParser.nodes.ForIndex; +import org.simantics.sysdyn.unitParser.nodes.FunctionArguments; +import org.simantics.sysdyn.unitParser.nodes.FunctionCall; import org.simantics.sysdyn.unitParser.nodes.IfThenElse; import org.simantics.sysdyn.unitParser.nodes.Multiplication; import org.simantics.sysdyn.unitParser.nodes.RelOp; @@ -38,6 +42,7 @@ public class UnitCheckingNodeFactory { constructors.put("term", Term.class); constructors.put("arithmetic_expression", Arithmetic.class); constructors.put("ifthenelse", IfThenElse.class); + constructors.put("array_definition", ArrayDefinition.class); constructors.put("component_reference_full", ComponentReferenceFull.class); constructors.put("value", Value.class); @@ -54,6 +59,10 @@ public class UnitCheckingNodeFactory { constructors.put("component_identity", ComponentIdentity.class); constructors.put("condition", Condition.class); constructors.put("for_index", ForIndex.class); + constructors.put("function_call", FunctionCall.class); + constructors.put("function_arguments", FunctionArguments.class); + constructors.put("expression", Expression.class); + } diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitParser.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitParser.java index 1579b6cd..eff84e43 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitParser.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitParser.java @@ -789,9 +789,7 @@ public class UnitParser/*@bgen(jjtree)*/implements UnitParserTreeConstants, Unit jj_consume_token(65); break; case 62: - jj_consume_token(62); - function_arguments(); - jj_consume_token(63); + array_definition(); break; case 35: jj_consume_token(35); @@ -855,6 +853,38 @@ public class UnitParser/*@bgen(jjtree)*/implements UnitParserTreeConstants, Unit } } + final public void array_definition() throws ParseException { + /*@bgen(jjtree) array_definition */ + UnitCheckingNode jjtn000 = (UnitCheckingNode)UnitCheckingNodeFactory.jjtCreate(JJTARRAY_DEFINITION); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + jjtn000.jjtSetFirstToken(getToken(1)); + try { + jj_consume_token(62); + function_arguments(); + jj_consume_token(63); + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof RuntimeException) { + {if (true) throw (RuntimeException)jjte000;} + } + if (jjte000 instanceof ParseException) { + {if (true) throw (ParseException)jjte000;} + } + {if (true) throw (Error)jjte000;} + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + jjtn000.jjtSetLastToken(getToken(0)); + } + } + } + final public void function_call() throws ParseException { /*@bgen(jjtree) function_call */ UnitCheckingNode jjtn000 = (UnitCheckingNode)UnitCheckingNodeFactory.jjtCreate(JJTFUNCTION_CALL); @@ -1539,8 +1569,7 @@ void named_arguments() : { default: jj_la1[40] = jj_gen; if (jj_2_3(2147483647)) { - name(); - function_call_args(); + function_call(); } else { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IDENT: @@ -1633,19 +1662,6 @@ void named_arguments() : { finally { jj_save(2, xla); } } - private boolean jj_3_2() { - if (jj_3R_13()) return true; - return false; - } - - private boolean jj_3R_11() { - if (jj_scan_token(IDENT)) return true; - Token xsp; - xsp = jj_scanpos; - if (jj_3R_14()) jj_scanpos = xsp; - return false; - } - private boolean jj_3R_14() { if (jj_scan_token(66)) return true; if (jj_3R_11()) return true; @@ -1669,6 +1685,19 @@ void named_arguments() : { return false; } + private boolean jj_3_2() { + if (jj_3R_13()) return true; + return false; + } + + private boolean jj_3R_11() { + if (jj_scan_token(IDENT)) return true; + Token xsp; + xsp = jj_scanpos; + if (jj_3R_14()) jj_scanpos = xsp; + return false; + } + private boolean jj_3_1() { if (jj_3R_11()) return true; if (jj_3R_12()) return true; diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitParser.jj b/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitParser.jj index c5d0883e..789c7474 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitParser.jj +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitParser.jj @@ -573,7 +573,7 @@ void primary() : {/*@bgen(jjtree) primary */ /*| "(" output_expression_list() ")"*/ // Not needed, replaced with following: | parenthesis_expression() | "[" expression_list() ( ";" expression_list() )* "]" - | "{" function_arguments() "}" + | array_definition() | "end"/*@bgen(jjtree)*/ } catch (Throwable jjte000) { if (jjtc000) { @@ -631,6 +631,39 @@ void component_reference_full() : {/*@bgen(jjtree) component_reference_full */ /*@egen*/ } +void array_definition() : {/*@bgen(jjtree) array_definition */ + UnitCheckingNode jjtn000 = (UnitCheckingNode)UnitCheckingNodeFactory.jjtCreate(JJTARRAY_DEFINITION); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + jjtn000.jjtSetFirstToken(getToken(1)); +/*@egen*/ +} {/*@bgen(jjtree) array_definition */ + try { +/*@egen*/ + "{" function_arguments() "}"/*@bgen(jjtree)*/ + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof RuntimeException) { + throw (RuntimeException)jjte000; + } + if (jjte000 instanceof ParseException) { + throw (ParseException)jjte000; + } + throw (Error)jjte000; + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + jjtn000.jjtSetLastToken(getToken(0)); + } + } +/*@egen*/ +} + void function_call() : {/*@bgen(jjtree) function_call */ UnitCheckingNode jjtn000 = (UnitCheckingNode)UnitCheckingNodeFactory.jjtCreate(JJTFUNCTION_CALL); boolean jjtc000 = true; @@ -1127,7 +1160,7 @@ void subscript() : {/*@bgen(jjtree) subscript */ } {/*@bgen(jjtree) subscript */ try { /*@egen*/ ":" - | LOOKAHEAD( name() parenthesis_open() ) name() function_call_args() + | LOOKAHEAD( name() parenthesis_open() ) function_call() | rangeIndex() ( ":" rangeIndex())?/*@bgen(jjtree)*/ } catch (Throwable jjte000) { if (jjtc000) { diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitParser.jjt b/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitParser.jjt index e7f87938..9e8521e1 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitParser.jjt +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitParser.jjt @@ -158,7 +158,7 @@ void primary() : { /*| "(" output_expression_list() ")"*/ // Not needed, replaced with following: | parenthesis_expression() | "[" expression_list() ( ";" expression_list() )* "]" - | "{" function_arguments() "}" + | array_definition() | "end" } @@ -167,6 +167,11 @@ void component_reference_full() : { component_reference() } +void array_definition() : { +} { + "{" function_arguments() "}" +} + void function_call() : { } { name() function_call_args() @@ -264,7 +269,7 @@ void array_subscripts() : { void subscript() : { } { ":" - | LOOKAHEAD( name() parenthesis_open() ) name() function_call_args() + | LOOKAHEAD( name() parenthesis_open() ) function_call() | rangeIndex() ( ":" rangeIndex())? } diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitParserTreeConstants.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitParserTreeConstants.java index d790ceb2..62b026d4 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitParserTreeConstants.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitParserTreeConstants.java @@ -21,24 +21,25 @@ public interface UnitParserTreeConstants public int JJTDIVIDE = 15; public int JJTPRIMARY = 16; public int JJTCOMPONENT_REFERENCE_FULL = 17; - public int JJTFUNCTION_CALL = 18; - public int JJTPARENTHESIS_EXPRESSION = 19; - public int JJTVALUE = 20; - public int JJTPARENTHESIS_OPEN = 21; - public int JJTPARENTHESIS_CLOSE = 22; - public int JJTNAME = 23; - public int JJTCOMPONENT_REFERENCE = 24; - public int JJTCOMPONENT_IDENTITY = 25; - public int JJTFUNCTION_CALL_ARGS = 26; - public int JJTFUNCTION_ARGUMENTS = 27; - public int JJTFOR_INDICES = 28; - public int JJTFOR_INDEX = 29; - public int JJTNAMED_ARGUMENT = 30; - public int JJTOUTPUT_EXPRESSION_LIST = 31; - public int JJTEXPRESSION_LIST = 32; - public int JJTARRAY_SUBSCRIPTS = 33; - public int JJTSUBSCRIPT = 34; - public int JJTRANGEINDEX = 35; + public int JJTARRAY_DEFINITION = 18; + public int JJTFUNCTION_CALL = 19; + public int JJTPARENTHESIS_EXPRESSION = 20; + public int JJTVALUE = 21; + public int JJTPARENTHESIS_OPEN = 22; + public int JJTPARENTHESIS_CLOSE = 23; + public int JJTNAME = 24; + public int JJTCOMPONENT_REFERENCE = 25; + public int JJTCOMPONENT_IDENTITY = 26; + public int JJTFUNCTION_CALL_ARGS = 27; + public int JJTFUNCTION_ARGUMENTS = 28; + public int JJTFOR_INDICES = 29; + public int JJTFOR_INDEX = 30; + public int JJTNAMED_ARGUMENT = 31; + public int JJTOUTPUT_EXPRESSION_LIST = 32; + public int JJTEXPRESSION_LIST = 33; + public int JJTARRAY_SUBSCRIPTS = 34; + public int JJTSUBSCRIPT = 35; + public int JJTRANGEINDEX = 36; public String[] jjtNodeName = { @@ -60,6 +61,7 @@ public interface UnitParserTreeConstants "divide", "primary", "component_reference_full", + "array_definition", "function_call", "parenthesis_expression", "value", @@ -80,4 +82,4 @@ public interface UnitParserTreeConstants "rangeIndex", }; } -/* JavaCC - OriginalChecksum=e2f99f7df8969b486d8da5159d18ad81 (do not edit this line) */ +/* JavaCC - OriginalChecksum=9313cac9e0951f8836c120d51f6c620b (do not edit this line) */ diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/Arithmetic.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/Arithmetic.java index a24ef52d..d844bb7c 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/Arithmetic.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/Arithmetic.java @@ -40,13 +40,14 @@ public class Arithmetic extends UnitCheckingNode { for(int i = 0; i < jjtGetNumChildren(); i++) { candidateNode = ((UnitCheckingNode)jjtGetChild(i)); UnitResult candidateUnits = candidateNode.getUnits(units); - if(candidateUnits.getUnitType() == UnitType.OPERATOR || candidateUnits.getUnitType() == UnitType.ANY) { - result.setUnitType(candidateUnits.getUnitType()); + if(candidateUnits.getUnitType() == UnitType.OPERATOR) { continue; - } else if(base == null) { + } else if(base == null || result.getUnitType() == UnitType.SCALAR || result.getUnitType() == UnitType.ANY) { base = ((UnitCheckingNode)jjtGetChild(i)); result.appendResult(base.getUnits(units)); continue; + } else if(candidateUnits.getUnitType() == UnitType.SCALAR) { + continue; } else { operator = ((UnitCheckingNode)jjtGetChild(i-1)); if(!result.equals(candidateUnits)) { @@ -57,7 +58,7 @@ public class Arithmetic extends UnitCheckingNode { } } } - +// System.out.println("Arithmetic: " + printNode() + " [" + result.getFullUnit() + " : " + result.getUnitType() + "]"); return result; } diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/ComponentReferenceFull.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/ComponentReferenceFull.java index d771dc3d..0f8ec704 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/ComponentReferenceFull.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/ComponentReferenceFull.java @@ -18,6 +18,7 @@ import org.simantics.sysdyn.unitParser.ParseException; import org.simantics.sysdyn.unitParser.UnitCheckingException; import org.simantics.sysdyn.unitParser.UnitCheckingNode; import org.simantics.sysdyn.unitParser.UnitParser; +import org.simantics.sysdyn.unitParser.nodes.UnitResult.UnitType; /** * See UnitCheckingNodeFactory for mapping @@ -47,7 +48,13 @@ public class ComponentReferenceFull extends UnitCheckingNode { @Override public UnitResult getUnits(HashMap units) throws UnitCheckingException { String node = printNode(); - node = printNode(); + + if("dmnl".equals(node)) { + UnitResult result = new UnitResult(); + result.setUnitType(UnitType.DMNL); + return result; + } + if(units != null) { if(!units.containsKey(node)) throw new UnitCheckingException("No units defined for " + node); diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/Term.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/Term.java index 77408c00..33a37fd3 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/Term.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/Term.java @@ -40,7 +40,11 @@ public class Term extends UnitCheckingNode { current = ((UnitCheckingNode)jjtGetChild(i)); UnitResult currentUnits = current.getUnits(units); - if(currentUnits.getUnitType() == UnitType.OPERATOR) { + if(currentUnits.getUnitType() == UnitType.ANY) { + result = new UnitResult(); + result.setUnitType(UnitType.ANY); + return result; + } else if(currentUnits.getUnitType() == UnitType.OPERATOR) { continue; } else if(base == null) { base = current; @@ -50,24 +54,26 @@ public class Term extends UnitCheckingNode { operator = ((UnitCheckingNode)jjtGetChild(i-1)); if(operator instanceof Multiplication) { - if(currentUnits.getUnitType() != UnitType.ANY) { + UnitType unitType = currentUnits.getUnitType(); + if(unitType != UnitType.SCALAR && unitType != UnitType.DMNL) { result.append(operator.printNode()); result.appendResult(currentUnits); } - } else if(operator instanceof Divide){ + } else if(operator instanceof Divide) { result.append(operator.printNode()); result.addAllDividers(currentUnits.getDividers()); result.addAllDividers(currentUnits.getDividents()); - result.setUnitType(currentUnits.getUnitType()); - if(currentUnits.getUnitType() == UnitType.ANY) + UnitType unitType = currentUnits.getUnitType(); + result.setUnitType(unitType); + if(unitType == UnitType.SCALAR || unitType == UnitType.DMNL) result.append("1"); else result.append(currentUnits.getFullUnit()); } } } - +// System.out.println("Term: " + printNode() + " [" + result.getFullUnit() + " : " + result.getUnitType() + "]"); return result; } diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/UnitResult.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/UnitResult.java index 27851346..72fcb73d 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/UnitResult.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/UnitResult.java @@ -32,12 +32,16 @@ import java.util.Iterator; */ public class UnitResult { - public enum UnitType {NORMAL, ANY, DMNL, OPERATOR}; + public enum UnitType {NORMAL, ANY, DMNL, OPERATOR, SCALAR}; private ArrayList dividers = new ArrayList(); private ArrayList dividents = new ArrayList(); private StringBuilder fullUnit = new StringBuilder(); - private UnitType unitType = UnitType.NORMAL; + private UnitType unitType; + + public UnitResult() { + setUnitType(UnitType.NORMAL); + } public void appendResult(UnitResult result) { addAllDividents(result.getDividents()); @@ -139,6 +143,9 @@ public class UnitResult { if(getUnitType() == UnitType.ANY || other.getUnitType() == UnitType.ANY) return true; + if(getUnitType() != other.getUnitType()) + return true; + ArrayList copyDividers1 = new ArrayList(dividers); ArrayList copyDividents1 = new ArrayList(dividents); reduceUnitLists(dividents, copyDividents1, copyDividers1); @@ -190,4 +197,9 @@ public class UnitResult { public void setUnitType(UnitType unitType) { this.unitType = unitType; } + + @Override + public String toString() { + return getCleanFullUnit(); + } } diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/Value.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/Value.java index 3da4c149..1ba0fc00 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/Value.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/Value.java @@ -31,7 +31,7 @@ public class Value extends UnitCheckingNode { @Override public UnitResult getUnits(HashMap units) throws UnitCheckingException { UnitResult result = super.getUnits(units); - result.setUnitType(UnitType.ANY); + result.setUnitType(UnitType.SCALAR); return result; } } -- 2.47.1