From dfbd486ed9275f240a7a10156f9bf88283943bec Mon Sep 17 00:00:00 2001 From: Mikhail Abramyan Date: Tue, 29 Mar 2016 19:12:56 +0400 Subject: [PATCH 01/12] new PT4ExamBegin (fixed error in the ExamBegin104 task) --- ReleaseGenerators/PT4/Lib/PT4ExamBegin_ru.dll | Bin 214528 -> 214528 bytes bin/PT4/Lib/PT4ExamBegin_ru.dll | Bin 214528 -> 214528 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/ReleaseGenerators/PT4/Lib/PT4ExamBegin_ru.dll b/ReleaseGenerators/PT4/Lib/PT4ExamBegin_ru.dll index b3e5ef9171bbd907c13a6eb1bd7163b17dd9e883..4870ffe8691adfc31f2b40b0437afc74a9fedee0 100644 GIT binary patch delta 57981 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 SyZ_ap|ECV|*|pH$GyOl0HSClC delta 58821 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℘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 lFX9gpgg-j)&qKbu^; diff --git a/bin/PT4/Lib/PT4ExamBegin_ru.dll b/bin/PT4/Lib/PT4ExamBegin_ru.dll index b3e5ef9171bbd907c13a6eb1bd7163b17dd9e883..4870ffe8691adfc31f2b40b0437afc74a9fedee0 100644 GIT binary patch delta 57981 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 SyZ_ap|ECV|*|pH$GyOl0HSClC delta 58821 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℘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 lFX9gpgg-j)&qKbu^; From 4d8bd0058ced30bda499215a5948976011f35421 Mon Sep 17 00:00:00 2001 From: Mikhail Abramyan Date: Tue, 29 Mar 2016 19:20:08 +0400 Subject: [PATCH 02/12] Update Exam dlls --- ReleaseGenerators/PT4/Lib/PT4ExamBegin_ru.dll | Bin 214528 -> 214528 bytes ReleaseGenerators/PT4/Lib/PT4ExamCheck_ru.dll | Bin 427520 -> 427520 bytes ReleaseGenerators/PT4/Lib/PT4ExamTaskC_ru.dll | Bin 309248 -> 309248 bytes bin/PT4/Lib/PT4ExamBegin_ru.dll | Bin 214528 -> 214528 bytes bin/PT4/Lib/PT4ExamCheck_ru.dll | Bin 427520 -> 427520 bytes bin/PT4/Lib/PT4ExamTaskC_ru.dll | Bin 309248 -> 309248 bytes 6 files changed, 0 insertions(+), 0 deletions(-) diff --git a/ReleaseGenerators/PT4/Lib/PT4ExamBegin_ru.dll b/ReleaseGenerators/PT4/Lib/PT4ExamBegin_ru.dll index 4870ffe8691adfc31f2b40b0437afc74a9fedee0..8015453af3efee5a4d5da9c3d8d7926a552b08bf 100644 GIT binary patch delta 54930 zcmaHUcR&?K_cpWGK|!f1AX2Q@dq>p7-Yc>97GuM%S4E77*mdlRCDEwSSOO9gQLKrv zCz6O!6O#;Tq9*zV8+^~1ncaJ@^8Nf{@I2?t?CzZBoGDxG+$BZlE-89&Cu5ns>~o{m zsti_v4PC{I$1F4UsgeBDU{$Jy?u=~iBEB!5n|myui;GLGYbn_T948>Z0{ZgiHCX?G z3z|1~$;iKme^P_BHHGB=YOpQ_>&V;GW?hQ7xa8trThv-L=w%>3QH@pM|I}t*4PDxz zxy#Vp>OBDH-`9CpR*ob{rid zpTY}dNeVP zx-CqW7C;!%8(Kh2jbKc;j@nT6IY!alDVI}NVxLi4F)fI zSYEtvPUoNT~1(uNQ0PN)94Ox3z0^D{eSQNsagqvcvl3t?w5_-HA;~4Vl-N z7v!$)WO3&{t}p)+ShS1zMPKc!EGW)Gq1$^%@|Td6bGv_TIyV~EC_u z?{cLdq6?-_!G1-TItHr?p&wB32QS!^HMGrqfd7B<2a2S7)Va@O=fXKMQr?hu5h)6G zjM=ZlX*XF<0;rAFkvs&l>T$N$?D2v)M^Oxg)#InoTiQ=wzRp39v)#!jo3i`N*1BUJ zT|N+?>heYC4YSMV0u^Qa0q8EzAfOlly2~qc0`SHUfbQ}I1Uw=@cliwhZUJ!Y@+F@* zclm;sPF+5I&%0edY>({nz}P=!pt#_V>TfXt{}mUh=*8DIXZ3A=Q#aN44TbkF=+FY~ zVls6HPA03|+a|X=#T?c>U7D=_fI=I(k^CcM)zgzdHG6snPEE{1VfAz;^oj22ib$yF z>C(v^qu8I!_FdOJdip*<)zjJN1hc2}bwe*L^9G=Mx;FuH2+%!!kbn;f&^=wKJAl3f z=$`INKsx}nE+Aa?b|&TtSML)FG7XHdC%!ie?iE>TzWcAJ~dTxNV}!lkTAC z$$2XlWORGL=e1>}A`T#c^u>#IWE4V1`Edk_h~wH%!$|XlziGv)8@IA}^WMylck0aC zY&TI|d=7Vu6+e-CRdk`6jIO^(JB<`*Yn5(m9a#?nsErnp+zqnw`BU_n8m#`?iHpfW zVfp+ToTz>N$usHmb;(!XV*!Ti`d-cXiu#7vxL&54BhilO<|{zOO%DLt&0)O(oFzcJ zc@_aj3D9o7LBLJ|w3{pR0k8^ybn`Tl;yk36>uz!Oa#f7Z4oNFC>0K{-BuOs^RY7ON z%b%eOw3ka$_fMgM{mB1n!^#%FwkeCj_5HRI*)96lTD)^$UD?Z$C#tq5uCIk{5!N}6#d=7sf9^#7akGmH^_JGV$!s) zLP_&Efx0cO+xnKQ*Fd2SQ%R14tehH(E>cddh^rCRQCLph2Ipv}W;~Wo{Wf`PJ66iD zW%SJ>ke>ilfjk*(H$Cjx5B_j-1E4)Tlz^8-0B8>%As~wY?P2%+05S;B9v(@+IRMhb z$NN`drRTq@kInytv$%oF~!BMWycL8|6dT;ydtu^^A6jSi82{4O8VidA+$K(1H_ z|BF#q__|gs&=`JK#(tGk8Fs4lC#yPS<$r~IZjXJ6U*UR%KkUTX6}SdwMrLx>js@8+ zp}N=wAB#noi4iLHcWMUQC+$b1DA>^>ZYmO!rb+_U=m~{3oJsO~kQG(#uQRFgU<0V~ z6oo~VJMg`x%K8WSi7N@ozjS6EuD0KY=0TO$02NgtIozx#Gy%ilt(*A(XsV1S;4A@} zDi;YjN`R(Hh2a2p5}>Ivmw;6OBvmqo+aSi7V(k%-rkc_sl14$Y&t$19SM0Sh!7yZj)*=A`4Nbj<0b+UNmNAelRa6GdmH+H@Ff(k7x=@T zER4P2p1qJ6dpOj3ivNrA-=o-j-sEm4%8b%41*wUZ{DWRB)L5KBnK2}6A=T(dH6k5q z9Mg2%MB4KFY%kW_U>Uq{Zx&eU*P9L(okY>0Gx!A_*_(yh&LGglCOARZ&Y9=XE@qx? z@fK-^O9gdgCy%)HGKS;{&Y@aupw!0WNNxaG#n8>=W(?h4i5R+%!iu3s2nx9-D3U9d zV0=!`nsbY9Ysac52lQcAjG>>8&Lfge15}aJe3?CP1W=KIX|5SKjmH2uM}Q8TU@qU5Dic#!H3$^39de&tEdQ) zDu=CvKtiWc;VM<@a2>jqL1=!sP>7R!U4L z3?!fj0h&5T2xv)w&bfsq0;pvNut5+GNw06#jC{@e^<{<2{h8gDj({ zsq+s9J6v(okNK8SECdufFocEmsYtd9sPI4qr(h~Z=qM_lePs>P1IV{X{B1 z4QCR3Ck@4^uXx&47HF#n#EPLq2oBk)ViOr|CBylsPbc}kZsJ$cdE6J#zlw|U_xJ}fp{FjvQz=LY&{LPm1k@rxhtYWgLI}`d6g&+;aR6@xPVlL@&ViGP zd6`4t9N?u!ubDdA|}G*2n-@yc;xy z?FLOvgJ{tLs6)`q<-d<)@4IiBXEk<}*B`~o8K0fyorf_0@C7G8qB~TK{t{6#Cbw8@ zQtPH_^!H;=;b)0&?gg)s3W(ZyhezMUZna}svO3gd!%Yis&k|=!{l3n zzfVPR@Tdxta3EHgY(reBFj-87iDWn)^&P|H3TZw7sKaC~8MTwL43qIBH-fCfl1yvV0mcs)sDh4_*Q%!^gz+t5n!{IZqSRx@?@jR~w` zOBqSq4W`94JhN?qv9QpECzKk>+QBngh9TxA<1dk^_%P zPKB&E&>MZOI;}shK@3A-abS$i&ViyB3DUE2lSfZt)mishv3YP{H9*CIRcO@YKnhS% z>Asx79-!s9Y^<@(g@KXEn;&NtZG5stn~TRJE6!y*C66g~gT1Cf zv^Wk_(k3;DBP65>NpJa4M%91%ZN!|`w zF((q9QrY7@T!!d?!eUM=oUT_d&(m}AgE@a5=VK;euhe}S`_a~JaUS#;3Q*Cf9a^@} zyMDielh=Dli(n&e5TGYwnFOR0peJIr6960{K(lKJ0Z9btk>_qgejv;5sGQS$oHO5O zRq2p(s`8D~Ss?Dm9-Gc87W-p7j7{H{DkFm5p1~^CKlPDCng5RHMB+r5B)h?nra`p0#hcE=WM=3`{IeM> z*lRv%oSGlc*Uv=r1?;sOnYEpo{~Z^uL#LE!5G~5^mor(Dx>pek&dr_x5=C6Sm2@9V zZj8ga@+V|k>lzJ){N4l>P`{bI;mM?XXYCVYH|S;>M2p`1yiiqzPlpNSgW~B54i^E0Ve{w&&n-NdM_s{>feDuqwYP_ zx41Nt*I33%7K<63N?AfB@wVJHALOhu(qjE!)yi4tMD1=jXl@!ri?00od=_CVOo-FD z{s-bkX7)Xsz46Z7Efe!$bJ!)fU~Y%(m~ZFK&UKj_kh%mNs~-i}aROd1^$Chyo50jk zsq5^zk4cxa3q?G1CRt_oFCz3eD%dz~i)E$UmXR)AK~{tvILsvMaBxEe ze~8jz>=1A(QSNRFpJXCz!GpZfN_LO8jAL_b+t%j6+7y6_wPVn-mD_;|Hr}FnIf+S{*Be4K4-e?PJ|{O;u!#jHPs@6S^Ku~ldR~1I3vMuNutoa) z$UJECEz{#Wf#0eeNi!Mw|I z=EK9{SxK+&KzQe#IL152v&wbmZ3U+?sTi^LEy@ok^duGSp-Np#QCyR{yaqoQ&&s=Z zAyox9O}MS)Q&+GuMuAWGx)s=R8nDGq_*eM9xCUQ}qiamUCu@RxQ43oDYdM|FmP%O? z{xHdNAS=QL3;^M!(?f8@q9O{5@1KIEn(tQ&V&RdVmA*$2eo+GZ%vO6#9)xcXP!axB ze>>sF0~IST+6jM}fO!PyG##)Nz<2<8@Vo2>&S|>j0it&m>b3)`o%p?tL`u_&?kh<2 zr>uRG|FVRQ^q=1^FS?KICzH5GPiQTUPS~#a-WDUEvzP1htBGuCyEJ5yxA?vvP+ojr z1N?2i&y$$s`%1oQDeLMJ`fh`sNxbZQ=F75q@ny`*{XUXaWTLF|oL67Q$^{l%`Tq@( zULWupi&&ZZb#AtP`sKeL>L_L~M`=waqB zTHp;`hvM;4Im|4u>#mZnHR-NH=QPY*<3OvBDg`QsnA_Zke-Y2hxqVFrt5>0z%BQSg z!E7SuD{wpWJA|k?#*84FresqVji@ok3^^O=iU8IjSB=bGCXy^et_;Z!AghpD)XN-W zmi9r&twCXhTqDGV4!I@;uo6nos+QbvB^$@OhwR8B+Uf&T(H4hB&EcglP!Vv(9&HB+ za3erRTQ&hNPs@cuxxL*eyzGy#?m)g%@zVh3tnPx@deNR!^^jteu;i`eUOnxhByX|N z{@<#HLK|B359th&9Z*Qi>+Z%?$df$ zwA;`7u3`SAy4#U>WU|Oabq6k5B=DtcSi4fy0Gc4Vqs;z=+D^ zkT2uyJgE(rile0RB-KW#a=4YYfmEB}VKJ9~xR!<3p01$E4)>!+VyrTcD>{*RS2C}I zmdwX5PwCa?3epBZq2=ae=q_bBhps{L>qRDAHgpADXci#0b;ntLilSB-^I6-9aHL+2 zcEXG(J*)XcD44b^3#4r0q(J$74zTQB`+$i>B6gBW2JfL z^~|U25SS$R&$VcFX=(-?>59(?J+tQc3MZ1O=;pAC~FtRRB z)L778f$URmkjSoS#qub$yXt(6!lRDlXEehz`0o{C`G9oxZS}6&ABin z?DQ;O{NS3Km!6a)mrZd zP~j`JllD^^XR2KV=N)!7&bH^_AF`0@+wpjVYnpu{^crH;+E2ZyLaG!lS#fh<2iiuf z$ZcCN(AGuO9mKYT!23LC0`vDQAse&u6K*SQ!Cu5q?JP;``=*9Otz zA6|Ydb_6h8+{%2ScR&%v^3&mHseM&(SFiPFkYj$JV&L4jXfuG&R4Q7L%3SNWCZt^) zimLp?Rt#f15P#N*2hqXkMwlo>c5Y<%w+)1GSmbvk%})R|d2&D~aY4$GEPs=H46-6i zFStYXWdFg&&KYvFY?`y=+m=ulE-XgwOF@&U*tiL0Dy`f%h0Gvk4T`RT(X@W zs|lbbm`RUE1mxpSlbCP0qph6Tu^*XPon8x^vT}BO8@lUUhPU6&+}H%(dpirQ(4lp1 zZoC|@Z^<&FPW?ml$WvpK*cdf;V~6t{+gU}1CDL|mot8peVWQ)-by^@%Zk^WO_`XGs zD~MZ=^G+7THt>&jGJo3(M1(o% zSwl8s$)*!pB#NBSlsG_|h5)rZfQ%|hSyH4E$)zAGilnqODe}#GpvV~%7De3PJDpBG zT$_^*6d90QWEUIAhE4o34~i@Ts3?+-Moo(B11h2q*(u_Z44@4GI)ij4fVQ~I74>cc z${&&`B|Ib2nKW0BR~2c7&oD`|j~D)wRc5PsoljY4i$yI^!*m3NnA)OOL*C=*@?o~} zmce{!;LMY8eB-BJQa*l$+RKh|XwU1d_6EG&-aj9|%e!BA<=w23`y@1^=li?)pxw;J zud5yTnCcM`qs2O&xSQ22*2-!LkI6mbS9ddi+N#{m>P3WN<9k7x$AZ^ya&z_eWK2M+ zOA7f*dU*>%OZbqhxA6{pK*6JkFma!XkEXmu!EuCA5)s{}CY z;EyI@?s7@Or^(YkV~5zV0mt(o;WU7Xgsy1RB;h)sV#7W=2_F#3(0Wd;|3XS?u$q@0BjIZ;}zSQ z%~fpMGR=NY4aurFSv~v6nQh%ka|fViTRt+nEM>{IXK;Wx0a>xFUjvhEL*Q018imES z;oya4TZsgD6Di*UKIa?uHGh=O+<4V5*pqG@Pv*h9p#T-{JkY$!y9GeSC)kZLXX+UQ ztRX=2uEHq*3;2XX%s0GF9cPwR!Dz22ls?W(b%pu9L#&bCy?XYExqN7WmVe?qo^yzW z27U^qHLdu0mY!RwC*8{PriWP>uf0Gq9e21zw4RSY%o;TaL|vVux{}R1^QPBzErS}S zLA0n_k59P-QWZFYB!#yYj(}npd6Oe7q}gWb{cI{?$Gk<1`Gnr4VkD`|dD0j{#(^rL z%NRYqJ~fG|I;`p%AUUboQYcxMBkRIw~Yg*9SJ`0NziXd5?`H$B42Hfu(Gzk!PI5pOXgj8GdDMMz~bqbMPsV^RD& zTr*=R;@XKBw=ljbW}JaaoChhy-r?^uqad}l5(=F)lF4wslqEAhC3zxb#SBk4K&5wI zT%rg>VQ0o+_);_D4DxS!R`Lvf;t9jnF_^J-FALzFlbIJEk;-NcoBC}Y6j=^XQKTJ? zV^ZWGQ1L6)P$ot4eFuORRVGFH5|BoK9=3K8aA30>wt@#nIFqI~CIk+{RtG-oD;8R% zc{Ny>^QFFs7sp2$Xoo@U7-mu|i(mYTH8D<9m7|o;ZG`39lWaWkew@-{v&9Ns%S|{ma9yT+OX5DfI9%5<#<0Zak z;T2EodYBkp!GHBAw~D6PMTkLb24ihp5%YFFs1x&AyOZUwaFASnhlBEu(c2&X%3|!Wc30x5}AXXhpon>IR{V^@DUj$OIZ>y zljKh!D+0EvY!a|t6%ep13TxP!1EOgDy__W{Nsp3ef5WD-?lmsw!M4@_726u1QIl;W zfr=~GF)-P7oPZMq=!E2b1;FR)6uAbJcP3XaWMqf6etSMU4bMDPsN}rV@6EqRW4=C{ z2bzrf4F<8ob+Sk67(OqCmE_N%$9U_0l7)J%ujusL)wjIaNfuGGA5c9;tsKYutzmwp z8rY$67%T0YkK_5CldQ6>Hi7z`fZZ&nqLl$lLlM5ZXA*2h1rTf<3VVjD4=!kiMPhVF&#F0rr)9G0YV13n&c3xh`XLXh<@?d3+NWsV ze5NK0sA#&{ijtIB1XLkFZ)x5jAbe+&iF<_)tK%PsX8NFB?o|}8SU-rh^t+GXJbWUtq zQ0z6A&L^|WG&SS@xu z%X|k94Kw%5>d;meUL@{!&XpD}w_82Q2yabYl^@mZmpEyZy2On9QYoSxl|7-178TH@ zb!OOeJByT`5o*O{Q5e0O@{{cbk49>PXz_+uILF!qa3C_}n^zubwLgm|p2LK)Ki_)} zn<|a@_vctCR+bBZhU-XP@I0$->yFDvj3YOTEwpg)LE;qKdLb-_tGyX>{W8#Q7z0By zPk(`oB<@l%29=zbJmc+Eq8zHsA?y8A)bGW=JkP=!b%cQTI=2q6x7&#Hqp5h_)1Cz+ z5ud?KbRyNyJ>{6<_HA&})T>+r0Fv@Gs$p#4;90o59T0}(Y& zXu_W(O;>@jhmPK#gE*s=9()^1cPmH7B5pfeJ4@@1c zW;#zY@%Y)3cC2u6hi~yAm~L-w<&h1%GtF$U42_xtPi>&0+!FMe4*o?1_z<9jKa&9L zB3`6j#8S@V&VJ--H4|>p-Hd_wAi62m(0@>1UQ^+AfpjY@fN%Vs6$uK3iIrG;A|tB# zu)OiUqZ?oSfK~7g1nfK?b{ovEJYY@hCj?lOPXpoJT`rBb8*DWVqQy=ga|!cd42G9j z+0u2Pz!*d?`Ogk?n#%_8zhKbp?>=x)8$_YF(b>+S+LX+$ld3AIj*-foC?6;IL=P0( zJL`$E7a*s`7lV0fqCAFv8hLvO^(ASWL!pO};bd4t%5oU#Npe}piasYwn)EqS z8Yg%W1q~y9atW0Wj?}}*WK4h3vxXFKej?F zr8fa_1Ze&oBw#WDnm;bT0T@Dn9z41e&=r7wGloa^W$xjwzRuKog)FA1wW5^1mY=xBnl!!WXHkujDekY5snY|NyX`i&F*=zx(c%toc%7BEjetJE z*Y%pdRksc{lJ3^rc_Gy@Pr`2a5gAs->vFQPt{rW!jhi`oNNXh{O)zuw)ihdHxx6EfS6N1p@6;hY0`$a zvTm>{eJUZ|MI05L?TFhnxap~l2ce^>c;1#&4zEN!>jtzFseUGv88NpBz6&>t^tS3T z`1(Ms%y1YXrh;WN8EzxPSk$NamiY+gZ=@LqPzTB?GU_j787Q$NcZ940<&l>eDF65% zP+p+0CiFM&+24^#!qhK4YgK=lXOj#4$d0pN$3!0Cas{9Ymr-ci%&t#>3YU5I=xCh< z;PG60bZjEv7Xoy2JR#uwxpJOgXO4$+P)r$upddrx-bM$7ijg<1A)-nOMd2ORv%k@IX|;< z>^={_#e!YayXUMb_QaR>zr`xJZSMf@U8SNgUvY~Cm7h-k-%UlWmTz&aCZUN`__yS9 zW107=&X4oEH6XwfohJU}FK^*99(cAi6E}8Rw@26OCnoRX|Kcn3q}bBJo{Cd6qh69W z4hk)QMuss`mJHiK@-WDXVXj3@h82brg(nJ&VQHX+%EX04N`GS5XUQir*+ypD`*$AP zIt@^9>$XhU!er31Wu-eb^Aa#3yiqu;R z*c0YhprY<%JBQN<2q!>u*!wvEZvr%j#}eQ=S=}r;VmK$veMm$O3&EuPnxksrR<*HH z5-mfbOrpbh=ihO&s3gqaxmkqwIeupqjZ^v5&7!-=DQ|DXU2LQ7bq~sC(RMAFy|WJ& zX*Y;54WjY+!>xa?n(ps#vX4{+Nwu=RT+jHs zA0}uqTqi!PulC4Bw^n;(7b4MpI_V7~tHxwi25r)idO{~S8)=FF)N(a4dRdQTnefVx z`~b3|#v%r4$j=)rb;Sv-L19s&5xl6Uo=v*RTRYX-+c#;G(*!HPj2qc};6UcxG}|P` z2()O9r0y@^@b{>_USywd|#KCr8c zLsE)sWhN!L6>*KPdcZ1rwFl~)lN$2N4_LGMsku4kaQGNQ(7P#Vz1`rFX%H>0^YBLPk_!283arlEm;vxAFy*|MOoxUwQWklAbfEpJ2Lr-D8rv$`I{9f@%O8@x-gJG z`kVFiJB#>%_vnE-`rM3m-a+2yF$?uulBaSCU-g*PZC0xRx@ajCC96~04s&CFLMKs? zQw=Kfc{fH#zB(xWtfoEN8xC;t?B!$9u8S~Hs1?#wpj!nA&R3Q&#Kkr3HU;L_86ws=~;V|zj?w|GuI+U6i-TGUN$32 zyYN=FN=5jI;Hex6NDjTINC!iYvdJc1+fG7gAhwHlns6l}C@FD_&0jO_8 zkyL`DBJ`QS3i%*n^Wq=o8+P;=y3OHzko~Q5a_Q?%YJ89k*upFS%fgE-{|}btdrNq^ z_g~hBb>UC`W!|&__AfrDftLYE%E$9RV~dUHjrh}lnU^uN5x?{=^X12%v5GDIs52*0 z@um{_>yca`$w!}GBX~qFQvE7biUkpr$M2DHZO?03y(d{R{u^&ZmI2CU^iWELi6c}{Ie_J*u{f9PM+ z_bJbzIDx{-=EdO?J!u(H0QoUJt534$|5&_X`@CS(yYGsh2B>0r^*`3RreLsg5tRo5 z(4KBw2tX+U%vdI%Fag@rcL~VGhFTtPL+tq*ecZyqyGa-eQ->g|)q~k0%swr!E2&KxVmE@S@dxgha(%PZ{4xTf<`>5h~jb>D5CCI z$U4=isZ;{x7v}I%n+NUd;3C!9Ub5sfs-B-Lm%~!`$Wdx;u9OEx(WG$~0pkHEE*1OR z%pt+QeEQaqM)#tOlj9SU!6>H9154%V4s}V>h?k0!wp)oUCJOL^; zV$;IpP-Ia6iwV#i+C;!~0EvlV|D*RDDbMNbSLp#dX$`?@nG=G!wF5i+{&HYPb4?>x z0?FyM($tf%ni&XKJlR)SGK0e%ni++Fh#^$`&2!&i8@)9T%wdhoe)Pz}Kig}Ne;l96 zUtWWMkjqL3q@>m$0u%j3c~rq?5Q5spzM>BlVf!+N`L%KZs_9e*%|yDUCFYx(xZq3$ zT$M$=(sY2t?#uUClqyWNi3>K<#S3>{G?!HhUGb0(V1F?9Wc9aC>j00=Wo<);LZJ?n zu=-5KbE`ii$?Gk`QIzB7a#>K1jaX4wC*k`}bNPTYcfFA49-p}6dwIg$SL_qNqLTO> z+!5!?D1si){;ELjA70ZCFR1MzBNvhrV5Id2snSd-%h7Bb$zvcZ78cGjS?GZ)6}~7e z7N&wo*r2E0_@*JT@Ziy7Mi18QjAtJCEEAy0XJyc&$wimqVA_{hZkSx`Ou#MzG#B>~ zu$m7t4By(VekbnP-?43iQQqOR2Q`JsJ^QB+g7{v;2nei$e1!CK2>q-{779enp`tLq zZy2GhA1~x;)b`x@XHKreBf4Mn_O3>qhyg$?9?U@G>ziO^Vi_SJ`GoBgzTefT=H8xM z8d?@bfdILVXyt0!INTEflq&|K%XNo{9P0ibf>ETDR*pQO^MyY(xP!ONXOtPdimd*o zVmhp}!4|4DO3E_pEG4-QWaY{K?wg)`^9L09a7C6UFTy!GpX{qkp4^iBT|T2Nv#s{d z!7RHk{=^NP$cuZ1&wCm-B8hCuvvh}dS|fth;Jxp1h~CNb=w3| z1N>w`BgmEnzgPhtfST4Y<4UFl$TZ7OIUhI1sy7W_H}=0H`-Wt*4zQ8WXS>fTBf(dnPTa;+jMq6c#Nu!ioC5v)eU^7MGJZ6f!0; zThmf`(4sp)MT=mxX{SYMM@ah96w_cM_7I?_uIC9@M}X!@SZM$s6QFrAmVhY)XrAmV zP1Dn1e0dSWx3uqV^vRmW*(NWFAxEdkS?NxGvWQXE_~Q1!fV})(hM*7xEmEBPlx8@w#Ynw+o{e0 zfRVR1NpPdp(t1L3kKCp%z#poCPc$xYH(JxI+uaCtt4|L1@JI0vf8}ljc|8V^oezGS zM-(+eB5ER8n2G2T{x5ccCSp+ua0{PV-l6l1Ak8E`qo`2@U%=X3)CjfpBd9hR`$=PZ zxBnZ>oEXx%0M^yR$?QpSl4Y9mA^9$3#m70fOg=7vYefPIi;t~9mc%%^Qc(+2s`RXI zexolB^DutuHl<7+^jrc^(X%=ZVe;=FP;ss`0L?#_U;tkdp!wIA z0DKhG)9|g{^Cq#))5<~}F-dXALM?uF%0gE>DGLR+p)Vmznj!bdN3f}7@%pE?$R`86 z6#NA8ade6~8zRpQp#rlZPorFcW}fsy0I$BE)v7!ijr>=IrkYkp;oxah`~rEFG*i8* zW_`Se0dpW( zFY47Z@W_q%3pcZIX9GRy2C=N0UbFaq^-Y z3X4Xw;qyd!1>#kCqS0T;v%E0cxw3LtgkQwGxtvLr5opGwN@JiRr-hv=O9=Rj08JG^ zKqi31#EXxSf#oARiE+r%xVLhRs6((Cz~Vq%2kOlDL9>C9mn%N{#{2siWmy|O*T?Xw zRg1K=nlclWY_f}&8EK@sXEU+N1&mEoWH8f872IGI-C zKl>VC9z_5~S@l6CKcks#)^&?sU-+Ya*EDnbeFbNg;HUS6)<74PxZp}}q&3_zri)i2 zd1HJ13I9j^9uD=R#Sm0NFnGjGq@mH;rKrI({ET`YFA!}}*7WWn5AruEdz=7he}MA~ z-rL`JpY7t?{EbSiDgVyjDDPGmktm9SbM)&2{zj0;Um&Ty!|w1(C5?&^RXi*Xi3|9@ z*aoMF*a9l6ZqxkujWqalNlByJkXZWvAu5`{N*fHOT2-VhA7<%Fav)?y_^&RTggR^U7)8p_mklM| z&B+?IB{rC-s)6?c@DM_?NkHRW9~M`$I%zmiLJ3}ag%bw{A*CAlqj)4Hk;^Vo(TA@N zFe-$(qlVKH42=*&)*I$BUB~ge0Y?Bj_Q3H$V|vxwmh7;JBA@OcJJFhs@1(WUhapJ-qg~j&MAgP}09>LrrJ?j&1V*3If$uL3K z8Eh=IeNZzG%1;KUDE|tro0MM%RIIFLr@SCw9s!#2Eo%W7Pk^TUY61oT$YcA&^DH{i z-(mlxP$@G6w&cFy1Ci}j4BS1RR}6e>qACV@@nRu{Uz;6-(md8FUJ^~z95m#1%U-w? z(NF<@^q{exocxRm8y^>9M1)mEMJI0e!%*!U4WIIFLW~f6Yx!OX*yq7th8RtXt~h5A z?5w+b%K1Y(wB6kv4)S@jP@`t4K?LfjoEsIGR@Kk>2VodG@#+Ts8O^tb8UA5is9yYnqqJM$IGVgTW1VwVek;rf z4D}>S+V^pM=HeB2jA@UoE^>J3a3iqeX;*YvnS3Zdd-(<*LZe8FyXCR;7?PFx*&8cL zcTsgY%sFrV%%dh2586PoLgkLRhc-w*-n9gY3LCjx0pyhisScBbQxj-3b8p{-q8NgNYAoXODj9=HmLr4P3(ipU^6P{c3rLOMxTu6(yADAsq(mdow zgwcf^<=rDNwxJIqj0S@{qQ2NeMeToykg|vSWJ3;=2C%?i9OS6JQYV z``=dfXiMM^QkFx@OZZ8gvFjg@d=#>BUN>C5S~~Peh4TiYu$(s@{jA6ALdbFHSuc?Y zv9j;~LBj9-(p{2g)iCNBwq{Xzc(OM@<;j`J@PfI~1Qd670BBEMB!Cg1JsHsgz!U7l zn4X+Pz#Rg#CvOmN34ruuSj+qn)56qE@d<~WT{)_tlPmjwX}Qv?BmVE`%Hglx@O#ya zK=+2!pKGWHeyE(;oCN^nuKbt!^;>vR?0?|w%A!<%9l#`- z4d}_<&X@d)>P8v29aL=wRqMx>*D(T(50t_dO^O<%@Ye06>+xYSX>zm3A<)@bF?3mWSU%|7#D|L?%kl3d7hVJokb+}Vx$K)Y1? zhpCdjFx}`MaGtge>tppOrUSM1?kG4h32$Hoh0Lbj$e?1#9~dFbr%Z+uGU_3U_B;u8 zwvz}6YgOF%e{V3r(??XwkzGZyb4PVbqUK||V@dPh@7k@g*=$yw_yX2?_2u(7$k6z* zth_?)x%D`P$b>t^3Di?x??-dwwE-fK+S?6WyY+jrTPJ1d)~`ukM8}iA&|2<*>DCBb zxu}K0a_eR|K)dx8hQai#?_cmPBaLe0&+a_9k@3Ige2LQtXI6f%f&Tp@?qdhQiJEY!x;DO!=rpQri zwa5Db3W#d3SK!b4dGq&;GORH7Y+{5A_#8Hl!F~20I75A4TmMq(H7u*phVJSO@Gqti ze)yvvZV-zUl3yZpaQt>Cy8kK_$jVKOQblLe|GWQ*qTa7M$JhQx<@hSA;43pRR3p0r zWS4c%IWe>$&5e6}Olu>+xb{>fgsbG{-QXHNcs97H5o*M0#e7oqAw^^UMN=cpsHGIP znxrU9ibr?V0nAL%o-{WB>g#+B_K0&*mXvx#ax!E^sUDx1l=@&FC^Z;`MX7P{xu#SR zOb^ntUL&i?Op%OC!Hi)acg}-Q+W;y;CGWBGCk?3R=x66oKoORK;5*`7vFU`g~SNU;`ur010dsgDO!@z>fGU_deY@9%J`IG?E*aORO>K+P~z zGZ~OZ-OR~uMy4|ZekRQ@fbB1x9gx6)ws~;Q+PWHh2`y~@R0WQ1Ej+AtV|>)#U@QUJ{ksYHfB^0OX9Tnb z;FvxFUu|>d!M~uSS~$f2tXAzE=ye(eeYZoi!rbqt*KNd66ICv5tJ29I&A{m8>CdGas-yQ{##JZc#6w4+}EFaw(bBlR@Dss&wtQT1~Ts4%! zR-F_DN%7!EXL7YA%?|)Ixn6=t;*69fxgL;w6tW^$H@HSmE4PDO15sGy8V~<#auq^i z#Tqyt*x$bNQF*La{fQl*D2{FkP@d1Eg1ZZ;2C7?S2np`&s zXhDD`mw#UXH32x1tKn}Ooym0z5#VrZ;K~*=$xySR-w$Sz*|C-18HW9$$eu@iM@Hy>`O2vaEYJWzhGd~8n*zcQhSaWk98;%qh&z z1mA|c@vv2u4n|0`8UUR3Wp@8+PGeS*?HaP3h9=A(-ZVcRc!RV9_|gtWsB13_W&J-%YB;blww8HQKje{uM#Vh*0xlg#j< zCbj_7%t1C@kiD3U6!XTzy2$Nk__4%=x^daheVL zZa^N)xerh==c^5NqU0M0uXinECrWPuniHUjvX6l31ZbkXCZJ3qIS2(_S?kP?^B{4G zTru{)qPGl#x)??Lwyn449s9c^i+QsyMrh!0D6K8B^}oPd_Ag%k!EIfPGG3#BM#=|t z%`Im3=nX!mtKr)$7rb|xbx*;OFmuN9y924-5UTec>Y0Z$DYu=pRd`xg zqZuo_wwvL@{^h>ijPk+Xf#;YwFMKWCpgA-ehY|b15wV>2>t^`%69i1UXpw3i>4r#I zl4=pj-5@JcJzZmx>OT%r<)E-gbq(~;r1}K2wDc_eKy)`_4YQpZng^LO04g$_Lz`wA z$_6U>y8_S)+wQ{vbRa;dp`8RYCP1_683C0E(CmsB4xkhOr!@543TK)TyW)=k+jjIztabp{S=XTb!V7UrTn=&#NqOLX+z!(hTMCy)e}slA-4~ zgf$>*%yD`d-bScagplF|yeBew@!pu%XYd-m@paUjR{(uZ_=cb_G z(O4-*9}z|&e9eUrQQ zF={f~wNZI6L;zF_`4mSn8B%C8yxSD3Ym*^E38+GVX2@{@0tnCy@f-udjR4J%z689) z-kr&i^^FbpMtheyGh_!wY6pg_Tjs=&@UtdE#w>T74F@b!vtf6bJ8~rKhMEm$qXR*b z82r&B`GdN&Ie8C1CEXV!`HO(l@VodlU6W+zbv+$+h0Y|&R5CpoD<(wxonqdZ7c0iYtyR2)xJ0#EN1$I`~6P;1x-7XoyW*+~F))J^-8 z*981RfTmFA@c_OjKvQVb_yRzVV;6o!W5c__haWq0XBepNz@6yDPTcu3&E!rMzG$E^ z*!U%0k>*moGim;~BuNvLimn7{>fw(j&2H*kSMuZ1Z`2I;03i$Eb1~{0&6?qt-teS9 znO_9BYLaFUnbjw=(%(3fW+rJ0e8U&_GD;iyFDbs{Bk&fSD8Av<24f5T2HFyP3Bc1Z zgN-uA;_s!UEuItuNzvkKXQJ#NO;v!JDBZ{?NXn8ZEl4f~SrKL5LX#+m7J(?oP*_Cq zgJU#N24xUYx*@}h)I-}Q4dwzBm#_zD(%>!uUlX7+N#hs* z`v}l9SWdu30yGUW30MrkF_Q#0n(xepT41vS8!GUmVTM;F?>LZxZmT6x;hLXTF0t9g zZRgc;d&O5KN$`n-Vc0puFP#iG%9j|p0F67o$%(t;!;PTUL(z-i$i0)q5o%F%Rmf$D z$aPU9_4Gz6${mB5IRUOnNCfC0JdVBLC%3YI9t)_FIepFr&(tnn7GUuRt`e71l#|U} zylT`&DnO(h9K0PqrBLr&0a{&HQ(WAH8DV(4^`bU5P#d%P_z^}qw{irGA^=;6Bk-_t zOKE8P4Phe65nfmy?6RK5jG`LPk}XD+B%}LMmW(P)@(sv}Q4{BxjG7h;M%hqUjOqfX zYetp7PK+vvgs2#WQ3^L$5~kXa}hPR0h&?4GXb;(;KZm`vz!_AFNSFcMqyKAwBZ$T!}fnNs>_!qqxf8hAqy`c%o}5r z_X1n-HrYvrZrpDQ4{<%Y9_I3=KH$4?iZ&3~E&}D-U8#=gY@}SpH=A0X2blZpPvXrauru zq9OtA{N7kRdFLt(ZQBX|9rO_A52<6B#Hv6|90sUURR$UDkg_D!d6HK_R>Yz&ZmKm_ zy*VIOQxq1lR)P$gSbtz}PtVFg8dStu|Dln|Z2RWsL9EjN6|qug+KF`^sOW?{5hk%3 z&jZku08Omb1XLkF6YD+!0R(7bHJ%T^4S*A|j!$(a))5Tq4#dKbca1kfi*23(EAzQI zgzF^6(xGK1#Y4JtQyIP-S?`mo6eUqokJ85Z`hVXa4^O1P4;nQm4L^(8XO zi_zknY1RSs#|-@|-bLgI58}>-{Wy8YS3K8~>KPR_sOaUs((ao`oCKDMp8NUbsUR-C zUp~<&U48daivpr08I>lZoP8j%d_2Bg%u!9;Xwv@93r#Z0Gkk+!60$0OY8ZdKzCasd z(HAJjpx(n-bdt?Fv(lwwNfAwoCQvv&AJRtFbZbQh0c4QN|DJ>g1()!Wla2B=aRkr_ z_(*KuOOYcZr63uvl(M|JmQ4EjcKxR$PlT)@$uq``BwsL61fsAa=`h%@Bk2rc2w(FA zjbtRr+o$|+M{$%5OHhgPb9x;^yP{q`&$%rXE>B|5ryneNZP{cw21_3&R<`VGq zo;`#z2)KJs&H2i%81Ec9@u$Ht`3QzwQO=pf%Z@ifiqXe3t=LKAv!)tB#RgL+eoaN| z-P-AH!$@ol4&VnEFHJSV4WAVL%|xSA^$F-HebS;R8Qq6_#JNx3b$Tdi@euzsqmkcI zuyq%ui0jP4XO&UHkxtiIh+5hd!p=?M?37 z3Wet1X);_UWl4u4B-cL$>HRN@Ss2zOUPVY&MgI7Yks8piqbtkbD*H=oeVyzhor z!~^)Nnlf2L@qgJs* zsH{OUjklR)w5~Q4LttcrdN(wonE88%gMc<~dPagEw?rxF0}j zSw15#WoSv|yG}9YPX#?B?G$+khsQi)2%ScCJ|I<-OkQ%15fF8851op` zfm-MT$!n=Zm8wuB&pZw^mbCxz|II;G{+pM!837DGE^jmHu#J42&G2tHACVB15U_?E z(kOjSog}*dp&wQl4qarzb;&I=PvTre+g)@>o@O)rY&E2f@`R(|_sA5&lMMgeO4m>C zj^`HWbLN@7Z8h5HpWN5%({e8_S){-$Sb;Fn{K+ASxqFprhA z9R1mObe~!m@OzqOY*!j#&*uk$ijz0&k(+NNfP*(wEH)i9#5orG;4rC;F(Xi48SOY6 z`-SoiJb}9+c#er4&`LOaEP@)@bBsS-Xf$AT`Sk@xxJ`VGUK~JO`CtPPNxciLI(P@r zmZZ82mG;6jbhtPnWodMuj>Xjf=8u4B|Sd++omp!YS^J534?a_$|5(c7VS{)f)f zz4Jcxi`hHts1bYxVWH8G;YT$-M&~T2xpl$qC|0g}t8-Q$oWvt4rb4AVXVYfLBcv=l zX9>x@Agj)KjuTUz^9tu63|x}cIoENej-7J>xh`LN7T?Eb#u@Rv?;>NYEoEIEU33MY z>Y`zT?SsQJpyKsqbdjDRv|bP3Apv@D*haw51n9xxH31h0(1Szg4FFOAI8L&|NA-8^ z-9bp5>I?7xadYn5ginh{5=rKt$Kw^eXZ(kFqfGdXf%x8Sc4K7QBFIOH`S2!pTH^B6 zp2*Q>#izL3gaY`Md&$K{h|jKjkhEXKEabDSPh4Dh(gJ+9WF+(qUu;`!lww2pCyR}s z@RrCUh|`uvuJ~dtrnP7;1}?`fl(@9X`5Se9Ju$xs=2?sJQV6z;6L7aSnRiVvx-{&7 zQ;(Ow?0QR;>UT4q#-7f;9T2ur%)>VOg0#t{W1G;j&?TmX`q-=dTu}lZ!P|sy78(_7 z`N+$)sQ6~pn_Q1CeIoFS7Mc-}n*jTfZaZ|=?UQ(#(Yg?v09e}|1X09HDNFWjBY6yD z#h$|b%mn8#0POKaA=y)UXuRjh6Y#eqeQtkFi3gu7Sz;72dd%CD2XWQ`RKyw4*B)EP zfr^|9cAga44B#&UG*7w{kaQQT_ zmRVi-=W57@q%4hYlDr+V>dMGIW>?aujYS6(Rv<1y2RQbm_ue=3d+)#Q;GV0E+Wh!( z4nZegTm^3PjrQPyFFD7 zB1^C^NY9E+_E?Qg{Nc-XlmJcRkp#>pK&QLi z1dPQ^3fcq@4(#ge1|Q_C)Os|;hLRhK@Dpp0fgbXo*PzS4Lk2RtJe?Og!kINFxP*|bA7G75$|4yZV6a_G` z1c^A2Xg>GfY#ei~w?B%nxX-+r?Kf%D7Y&-UnG96?n`);`8Ueo&plRd&Ie@FFnl|&> zIMZeZhGPfXe8i)-7^U1g168!aqZeC@l9)oQ-vZ9K^JDnq`3U2?1844WvBjv^YzNLg zZ_aFPN9kL>75evYl)mY|3FpK-YDb=CnwX9sh%^FA{5Q{uLw@2tZrci`grNzOJ_SW3 z5Q{(FYJ`+{(pKVj2K~$bUuWL|6~*Y6_r7=b?%ex6Z=GTGuccJA z;N*||_yG5QSNUaB>HJd`WuYX%{nXWH86`T4z{`4o(gTaOfr7l^N5(p;~iAFj9 z1C%OcXfYY8W)EevHbG=)92v@sAumptiRix@L;5yODxhz=AA#Wk%Cv?)b2AHP?{?uO z3n(VUnjI(|kbI=2*Gx7NsrG(7(zk!c&Nz1X05ca8`v6lJTz42EF`tk4o-j%fh8Hkr z2_uj&ygs7*PB303y?34a!>@>QZC!$(kI#`M0b4c%&2Nw;>jyV|vi7*@p*Yfms=Qe9 z#|vlp-TUAP699ie;se6zg!$3Hhv)vo<@OwQ-}V7)ZA_9dze&~sg>j3vuHCr7I~WxIX!m*SH1X8rW*7j^t9Gbf7Gwd<`& zEI1AinD$sy&xzx~=c}la1xFzm$?iM*xMEgOO^TA-Gd@lyY82w00S7uni4SmfUWL2u z&a9&HI8!k0ai;kb?QO{b<6(g3KKnQi-k)RHHr~tN3_Kq8rjHfmRe|c{&&u|YaGr)e zbMGBaRDewAeX#6LWT+?^T4oQC#bOB8p>U@q8GADxFLCymM?LK4&&HCWn`EdLhP-pl z1Ss5X?7n@Flk^**@6ir-lutXJ0DwyPV_ zPfH(>{B$)n+^ zB--)uPpIx9;;>Hvaq0C)R0~PX%A*d0UGLXYAt5^nm!w*_8<#j#yKIlg0oGVYg1t$X}B9F)C=8se^-TVK!mlP zDugFBq^?6a$-1trqbkw8hWX~r@tJv-A^q~rdll{M6H&==u0!jnqQ#fRA#qV#`ehEu zm1+Odf(KOtU1Qf%VNMZh=-xymC=Vf+A(ykgW=|sAIpn1bhP<{hY6SZE?7nRqS<-($ z*eCo&*jA4kCPqN`Yw?mL{OS;Zx6Bnii-igu-4T!&}g(JU^oTa>w)&}Pug&-<+H;0iv`EAI&TxHLOBD;*M0o!r zSeJ|4M1@5JVrd@1E{7U?D%j(06YGdS2Gt&JH&V8e6X{FZA-ngH_7d0PO;qW68wdGj zssEW-?jZHEXDO5IlT9JdxYRLTnIXFR$Mt>_Rn@s4fN}F9@p5n=K9*fz2Z$_6kfD_r z@(S$aQ1s{7eOq9ANPi;w9&N3t`2{PhP&6GX4C{ zxNdKuibUKy;1gI=%(KT^%?Uh+mET+YQD7|z;{suL1-6VZ4zKkHtkxjuQ-Sr4|0uAo z5N0-Ad^gP_Go7&iM`rk?p{-PSf-=W{p?%T4PNczpt_sH(C=#$;wGGzA#FImcV8ItkJ zZaKo6wDfu7-X~w#PSy15F)r;hR`mxkJytag((p-gAGq#Ah}nHsHSh=+TM5G}$(Dq% zlrX$O$YR2nvC<=2)8alAtuz^;wY|Qb4%Ea7JkljR_ntloHwwTtc?|C^*WR5}xvEcu zPi5_~FIRnB+v~aqE=Zz6BQ;Fm(bh}Qh0lnoANC@<va5Fz)r8{WTzitJ`T-tGThMiD7leNqsCG9c61*Bq zgr6-6-Ajg8GPEBzB;z}|1bTm96Up^vBa1M~60Qa|evjesaa(%;h>sRCy$ZvN) zywvHA!+i3$Wm}buEg@soG3Et8(_ZKoxBK=%2I&W)?*YJS?5;-@HqrpV4!mRmpbP}# z1wh-e1OQEkyAn53zqs-qq9R@ z&@dQWcL?G^pD9Qsj9i4_MMK`xV7x$>>_bBn!no%uxSuK(Hb0DDfkb|u$5ti4jC#aa zsoN(?k3Xp0PZba8SnG2l$78Ja<1ulEy81-k7E0q2P>}$Sb$kI#a=WP7nZ=8g0%x(u#(D&W& zLLQB<3m?k<4Xcr&cx=N&SKk9vL+4lIfOv8W_Elx_nFz3Ozt;SV?tVDmq227Y*%zwG zXvM72i=(guBrsh#l^X7LOH{Pj1W?_S#zFI=aOAdi69-NndI0vRff zp#<_YCEWi4IJ*PwzI{+F(tp+QeM2wE7lisizPJWJz5*{qV0uNj<07+b+eNFaz$m`~Q`U2*3sUPXxZ zJ!u5K#iI#NJA9%EkC0P*)*O=G8TnsxSk$%iFmxjUlX%QwH8>0(QteE{qaLa7jGw5- zDV%LK^;nF(%&s1{;8T4-v2lXa@~Fp`L#BJwqeRws?r4sqKl7zc@TJ)`WGwpGHDuI( zzN8OXJ5gbGBiEWVJcAOCd{4s-RvE71M<|9m*xQwnhKqMD(k&M{q_+Koi9`eXz-N0j zsW7=egRo-2@@T+hSIQBp^jB;ag9KbzA1y^bYTJRVj|OHP`N2NYr##PKinH&@Em!DK z=+1CglcUfbvY}bC&LxNbM|WyKQ`SOxcPSQ>YoHviF`s$^&h8LEyUFOr&e zM8CM*w{^!L{lGR^y0f~HPj@x~bM75@$+C(4U|T&|6T>D^ZSMP>Cy1PDdp)YJntBB&ac{6{sVqCuk68G-xttHfRxO6=(}+ z4=4?E8gvD88}tzL0+b2LeKpEa7*qyS4a9&nP(4sHP|Q_ll%p#eeL=%O<3RDC`Jkns zb)X%f{h;HZbD-;>`=F z<>+O5kMh@j5j44nW(!if_XM;q7#ft%eQMhK z%(Xd#C;m?2%!BBxgUj#>o_N{`Mr=zQ89Sb|&O+z*j6yeM8D4guB~v6$g$=z&T2E0h z*xl|1TK7roB57SGt(w21b&j-FlGbt3xXzd`ajij}Xv>Z3lS~~N+6BCl= ze8N0STJfZ%-$H8~X)PnIVWd^yHd=j2>wD7bN?JEaD~7b{-a)GwT3NQH8crGekz!Z; zhQQFLrIQHw;lr31Jdy|1)J*u%Wa$hQ8{qW6>)YJj({UG)`w)V|-Q<2GcQR?&f8Ml- zw2mNXb*~^TJA?m`wCuw3OwzJTsd1!b`;d`nWt~nCz9KEXQ+u4jtM+LmVkiQR=bx+W z6{^1fygN~IJNqx$b(L!D=a)CR$u;WxAiopINAFVKR`$D?Tr1FjP!VS$vyR!x9AMIz zi_CrIUnYPJXB)6h*;w{Fc0GHFy~n<0+jC>MmO@9Nr_fJu3bTYnVY~3B;1I(_Rje;| z5pRi)#9&F1T1$RPZl#D)R;i@$NTwm8eM?b(IwUiLPh&i})I;QfUn zLKQ(28VIe09zue!T5zTaslrv^vG7s|7AuOOA}h8PzZD0F6T}_jDe*GamMKO^vC>p& zlai#QDnBb{lv_%MLaBw-$||cys9&n>)CuZhb*s8d{Z)OgzE&%0(ONq#PFt-#)H1c) zdLg}vuIfGXHTnttwv}%EV|}o&nofR>0!}EIKV5{bLW^_*x;5Q{9!!s?*U^XR%k)e7 zJ?+mFW=b#>nJ|W7ET$9FgXztTVdgNam`zM7a~wju!#u=l1K0v=X|_6Bhy9A}!VY1_ zW8H_@hwMw%!4>A}aP7DrTz_snx0yT6UEywXPq|lI9=;&&4B^9gnyfK~6-AM3e{JVqaLl)1z_XZ~qEHD8%QR;X3mX|=NA zt+`f`b<=udIR^MS_F-pgLavAC&TJ31A3L0#z)oS;u)Eol>~E|eSCT8ojpb+Y+xYwZ zU;Gw_*|J>AQ3gQ;7*> zdNN~~1c+`0bB?*f6lN>2b=iJSb}H7@nCrux<1h1n0H=TRulNw5x}XS+gto$XVUe&* z*drVijtXy}asi?!wh%jry#dh#ajv*d+#=o+Ux_88hSHZ(TdBL$TUsXVlrBj*(39<6uQztbn^>-7WrY5h8Af|E7Hi&Y{$Yk&jjZn0O3N|J&+!Z^uR%AVw=uh5 zO-?cwn5#@W^M=U-Sk_^`fhfmdsj~sgWcDDcnC?CKttb<>&Kz z_+$KS{t5P=w9sDYBTN>y2`R!IA-C9HoF!I}tIFZBBG-`{$}w^;tZccwOFk-Jlr!Xa zatYNNu9FN^@S(-fDq* zC7sq|^bUF|)_z03r#p;NMm^(8W2mvj@HZ=)i?PZr)*kDCb;i17Wmt}7enfp8#p#-K zU97ql{T)4po=2xbZST?V=z>fLls24^nJA_sly(9$lUdBHX2|ZOGCwoFGk0NYKQK9* zY(Cg28Cu(q9f9px$?jn@*g~An*X5h>F?tMz%3x5drglE7>4zY^ZSZoDT)>9lT4i_hiGsKnRKJl>li+EA|9f)}* z{wwB{Dof5ViIa3GN@^zck`_yArGwHvskCg!J(YgSP-UDFugp>smF-HJ@|WVT=2ja+ zQ~Ile)rsm{Z09-kwn}N?8n4A_gR~i1s>bWB^aNv$vCvp$Y%z8kM~%zIpGJPOA`E$i z+1l)2PBmu&JqOIw<^?m@X_d1gtiIMDYqYi0+F+$&gD+WbVjj0*fAPN{-JHHa|3k;H z9RQ+%>_~Pj_Gvl0gFOQKmdO_3DsTd)ajUsq+)?fqPU0KzvB1$HemTFEKgD0=pYbnw zO2{J=6lw^Z5G{NSCw5SXgySk9JIex4jI7BKa&x(hJV>4>Z;+3`P~4H<%9IkM6a$>9 z!P@CceWg2$#sX!PvO)P%d8rgv>%sPat#(wqs|oOEN$MH(F>FXKt&pZ@^|U_PMlD=# zrsp#YnI+9CW^I!<>zQA}X3Q{`nR7W(@WqVQtA728OCJ#!cC80IfqNrgQLm ze~9Vg-!Ln=rIJz&;G?TFN*XU6maa(;q=(X5DM&6LH<8=PqviGTR``Y+@*BChQcH_->^GxRMw zgU+P$F+9xcI;I>eum)S7{hIC0_J-kE1cP&j_2(E)g)eNvwczG*+qk{l6V92JFUD8l zIX;?ihb@`OzvdNTuW&<1kmtw?FN(^qMEFxsh8B>)hFs3wWQWWYpwOy=4q$2$66Vqq7h~YhGo<> zS{XfzVZ^llXrvk!jlYcN##^Jf8Ey)u3RP)hb~Xo_v&{MCI&%xaa>_gpll#QXV->P$ zLuV#gH>|tXW9x70J;BN?KSvSlOeFmU_GUd?Pa6FP{hF@9EQP_@&80#!E^)tc54m?- zKE5np54I(iAIm%A`MLZueht5uKg9nG7jz3w)n5n_DhQ!4GmW4wZG^7C#T+=IRl*kG ztnjbkC*~20h^1g;!bD5#D8`B-#c{SfS|V-`lVD`7z{uPMhMtHyr2JA*U`UjjNMB3s zq@L0oX)h2I00c$LQ=IZT`3qZ(I;*|a0qQt)j=DnKsUB4ysSYhftE`1;^$|?PYAdvh z+D+|GEdzimtw-sd^nUs<{U<$HKd(R4bHY_gMib+N@y5tymVs*?VJ3FQr$~N%S%L3hkzYnd*$hIO{VV;F$*^sET9anR(1IW<9)@n|XzhDj)j=8w2%P z#cqXaT}3SX5XSix`<~6g<>!iUrMU83RW6bn$NBS>`6Rfh!@_Cd3efXd_<(p)6q~^W zFBI2`m+Tn%U(q2|kQzwMrS{l|@1!Zx8mF{X+9w^C&Ptc145^Y_8v$2uc?C>RKDDS? zUJV1ZBGl$Ex`Wh(>JD`epmhU5=36zVRzxd<{R!7N?F+4k)>oUL{iLnbHfbr^B`rWN ztcSt)OxD-xk!F4KOEbpo3dcR!`~i4Mf$6!1Ff702tYOhsXKSD}%o=Mgvi4eMt*d|( z0Og?UXeN*@Ko_UW(LCLZ?m)-F&yAwz(rW>*%TT$zOf{w%Gl;ncPoDszyNqAYZ{bt< zbNn3yG9_Vd8z6}3BE$+4fS)aJQWp?y|0NVhtX)m4B{p(mi`s}i#0BDd@sM~!43c=M zjx<{ONh+gMf!S3RONmxGE8i(U!U-KyPAeA>YC7Q0E2^>@rS??g;nDMJ#kBHTBbeMV z+H`Hcc0zlhX?jC_yuLzzZ%}5CS=1~CH!ff&zA?v`E^~vq-P~=SHJ$g&7iOT94{oTn z)y-N^8QNq!ec8 zLn8(m<49w=vBNlSoHEjlOrxqDoVPItm_y8w!2DuZ&|e_!d*)x}douvyE`j8uzSY!n z_OeD=6Rqh8J&sxDkc6aL4w`aY#g65t4J4Ukkz_6h-Vf2~*sjuu_#6AR|E`;o1XO(2C+W;*a81 z@wihwCq5MOOVuPR;*$HB-%@71gS0 zlGad*(Y{5{wFdi2si%~ zx&z6%<@`u7D#$ftT8@-k$X(^Za-6&o{_+?3H~E(Q6bZ*0*-y!(6jVwfGH9fHrSw)t zE6GSczE%4oU*7LTB>s)o9TNP`7;Q|36qgvAjf2Kn<0Vq8a(2+z#B61DGyB6Ejxwj4 zb0E!~kmg16ky#Zn(`D;-%MndE9$|rB)5GX0Y#7VJ`!`^lAp7sfI@wulB71_p!QN&+ zAX+TRg>f_&!PVm$LusAga9xmmP2?7FE4h8#uaIGHem8%RmxUO?KwR8NY9)1)x=BNz zqAtY8d!$>^Ybj7JFV{pGV#-Y+qGM3kaG0v*h?r*~Lfi{ObsO<=e|47H8F_y{eK?|? zDf*Adu1LA#Z#}@sYlI>SXzVm58Og?B<7Y$we*n2v;Qu?Beas2wTJw;3#=LGmFrS&Z ztcq5+)xlZ_1C3>Nq8vBy){1GvbYc23!EPrCQz|)_D<0{COM@CVXZEnXu15gbZ z%_gvO*(Gce%+@9LFwWGhyQkoi(#D(h-cufGQ{E%BSlCt zQfH~JG*pU{W=Zp1FlW`q!ufj6oG(g}woCUz+|aOxAT6tqlDwGV3s>!5NK>IKyppG<%pg5#>1sP>#y5 zRQKt>=;x?_1TcA-GDxK?CYtHYOkon4Bqjwby~sSmT63~NYzek98;V*_BxK&4?S=ec zDkQ#xy~*<2P~-(0xe~m}lVF7v4Y7gPL~Jki6P?H=6Gi6<@wWIvd;`y1M5-kTP{Kx7 zb2r$wfzmi>vNT&-FQrN+rQ4{Almot#Pz8A`w}El)sSVUdX_K^gZ7~$^02J^R+-`Zj zs@@X8Nq@-PiST5nenx+wztr;?RSd>3VX#^ltpW8Z#v+usjyPelZW{L?`JC`iHO!X4 z`48qwbCa10x#zY*tnwCTDOO$U8!OJ*3VqJ7UJ?w9r5x|@=11p8^{6~O5|QvKb`z>3 zhmiwZWz*R=Y#xpU#+!3aE*`sZhP%$)gORGnN7$KVM}7=Hk9TgdHT)hD?w5QJN@M+m znL-6A6mHmrV`_M(7ZHdi|YFMb`do`PbMY&EyOvvyj~vGz=|`dJj7$K-GXVeKX8Fj}L#py;xY zzC-6gPSlZU#5P08p$nY#Kvcr!vMKBX_BpE}A6mdAbIJTZ{s@1DzlM5?^C|B@VptK8 zN*kN|LZ&xP&O~o{$T^`(IJEwO|7De;bf+Ub>1LIRoA<0GZ=>IP4TSsMG2d z1ZI!b4{ER`0uigA2N_ykR95=vYmDv2KI4#a3)K_K3`I&a2!Z{NQ1D|;l*4{Q2oena zCUTCk23t;Rnl;P%(Yk;_p<@~4$N_CA!Bk*s!c}Wb6Q(`Wk8z@yaF%(-6oQ+!*e}_Z z$d1P&E8dT+_!6X_1Lc(%ZUmPbiz_WuMdqsuO@$6Z9D=Yk;e_zFP*~&;ygTc`6D<{! z#Wc8~mtr}T1ZdQ8y952hqzO{IZShVb@5>>VL&0T)d=w$rRpkyc;8#j+wWJz}u-%Dj zz!qe`PZ5^-X@#}6s0BFTmUcjZx3ouE5xs(5OXqY`Z-hEie|@Mv4z=Iox}QT zd@oECrV2NO`$9gkgg8(fDozz=ii^ZuD3TPEIs@hXg@I&k)DS15WjzIO9=ror?(fGNAO7eT!;cG&hhV3iAN*%-bxTsVnqGF(qD@FKiZ$ z2tPw>-Uva+3@eG%MOkcz-5iFD@V=N!nu8K#B4WawhziqCuDg$@FhB`+BB5>o$Jt96 zi%p!3O9g32tbavJcn1LUS3^}!Rn$6ajM`NlrcQ!GU4YcOwpK@LrnN^}Js9S9nYI`4 zela+k6ypf&=@k?zA0U1RG)tIare=0Ahaw7$!+z~V=5rJ=;8XJrJWWn3$cid~WLgE( zx_XOHqy)3gO0|AQCIky}ma^-7N9l452e>tbap}g4WM(lNaJ3{CTaNvcOI|Pd=kn`$ zQ+c5ju+Oz2E^)NLMS&j3XGcIaW}qmrT-^whmx{{cMVLJ|GPrlhTJQz8CC*hh#}3UH;7VAe#m!gDgJ7SUWwBpIEOOG*CsDXP{&S1#4REP1c0`itbf wgSS5hKR8&j*22*ZF){uD8u&+h-W)h?^XJB+KaT(Lx$yy6)T=o11(0M#fTj;6FyC zMJX(V4P3;Gmn>z*Ya`*c!ODIav^}(5HgT~;M#e$sY}v9^`YrJz0Y?aMQ9w^#uLA3y zuYyY<)Az_njTEe!;-{*;)_oTi&$34Yvo? z&lcxNWqfSq^o$I#>VN4O;yo4L@IGI$kU}N#e|fk=jA|7kRky!Ugz`;aG5_dV|E6bz z##N4`L&W8nA&l@DX$8i*h+x8*^ZzAb(wt5p(^RZoyS7xH>}(WUm{^2vdsJg!$%MNug!vUBIYv-1vI zj{c30r4ADJoH8qBmLLSx zGEij?u(&ikU>y&v!J0?Ug3tB_2xt6>yCEhh=^Z*NuKhhbFiq?-wuY08(Av>w4 zPH_8=8m~#vQYr!ozpmk6LZYe2MX)c?YQ{6?$z|)GapBKvumaKlkaJp-#jQuUK9^Up zXcl!>U+w!;D1L@QxAzyxdm$@Vw%%#FvIDMBbVFgeax{89K9)L4xFG71Q{RJB&tCNC z-X-pFw`3KFp4k$n)?{%k`gqeU+?xVWxwi<8bCAf6B#;JF>?;gF$7Jhf0KO+c$K*N! z780QSokqYk0<^!wn*$gQAU>YB7Qd**bGIr1KRO1dPkMTWa+(aY+;IGc`{*4z?BDIY zS3TxY-1`~2WfT>k9-y1;qxa)epdCr|kUQ03HKNB6aOeq&)v(QQc`G{{4wJF+FKJ^) zk)vhQ4joY&$$B_IZM2x=9*~t6KH^jW&cEx z_bxgvd$Xw9x}!#r)qi(PUbl+cr+d_!tRF(54RetE8)Vg^BQ~2oIu>Uprl7ETv>kdv z_h>QXPV}gELentz7mL2!HVYC9fQrO#(FbP#=4^+)iSq!U`?o6r6A94$yPtqT1nB;C zivZAx0NuYm31|$U(m901?g$r%)jg=Yt33VQvAZ9>bLj3Hn?CREYGxCd2xW3Z^-=e%t7_I9D4lN#Je_RW!#pL(eQgH+Wx_(w_?6VtEYTjD^{q? zwucz4)K!YcWaURz><>lpBibRoNb{Wk+mMxax{;dBkBv40qpzZ>_z^x8@i)nbDpXKK zhDs`F$B+V{vPieHn5=sM)J8ERw}Px3`vM)KLgmdyIQ9by%dywtDec(r-%7_WPPo{J z6)~b$cg(`E`vEG))rIXrMa8Gzd1@0D znD5fMjEwa(0%+$x;f0&B@~*#ACvJzw#C+bNDJy2gK9;^M{{RtV`gRH#MUYX|-^p3j zOv|VP+AoVp>&MTaIj1ikYyY|scpJ_U$FGqan?)sQxA~LiM*?*_T(@(YtQSI|4Syne zI%MTvfAo*?Z!uhoD1*ZC??$*r`}f*Q>EF`{E1R)GM)d8jS@`!YK;_>NtKl0x`gnAM zGjg~B(Ec4rz`I-kw0{!`cuauyZ{F?zt`VU9JA{B_0Mfrn-OE8dV2U0+AZ<3Kfg~+A zrQIaO<&sROwcL>jl`)RnF`?wD&za!4N;08LB{&I8*p05!Ob8^mO{OBpuVyoH>hhew zXvvDX=uS*S2DX z%N|Ry5hjvsDv*uG74m+|C^H#QP>YPq{I6E5S@ugHXy|QzVzlAs`U|Ry_3*Zc;k{b3 z0{!n3@bzU`-92_3W?Pykv&g6|6q+aFNDhOncyfQ4$&)85z>^m!ES~%c$7`M}!DyVE zIxFFi*38{0I<;>WG|AS_q)9Cf7i*dX02NoA0ce_xA>d~MG)=A$u!jImlQR7QtRq0v zB!+emJ)fQtn-o>q-mDK_)1DP#;rw8GR-5JG z?{N_K9A`2zVv@$>y_5asgB0Hjyg>)nr2K&2B)=bl%9`Kp74jPpGhGb>Bvw-q!jE=f zer^rv|3xmL$T-XY>cE1He^MyRc~+6#*v78z3;bW4yoh4+SxQkfF14amCoP?*p?SPx zM;2tvOyRXVv7*7>P>s%1qn2HbgPLZ`NE^g|?#Sv@|8#?T!&&ym?cCI@ah}wE(-|M= z9_}vGVP9Nx&)}s~bhhKCfjGCSc zP|JJBXtI>$m98gw2xLW(Z7$# zf+)`cDx#d9VUQ0Ls|_+~x;D(l>!i27cr( z`m-+rf1Bw@p2J7U&HySkUZ)u*D{ z&p@V;=kct4T=sb9(6}qMbNrKZ)L`7%CQWAiOGyP|dT-{PKhf0aBW=0JhYe(9+SWkp z8X69h(D(+kKDJhwRWZ4s&7h@e5GmRLB?9eNfwbV58A#W^<+pxiAxrx(54Y{JthOKU zfIh4g`-wN}!wR}CI0ZUAqhc%{-iLV`HD>V@gIH0c!v%h95DV&DjC9kea6OVKN^%j} zkBV1^No5x$FA>h7DXD%ZmA58y3cN@*oQnE% zc^7pPcS$n{pqA&6QD-U3_?Sv^6UZt){)#cv=?lN>^8yvuyx zI@W``_h3`_?tbi8^j~AMh?H#O%t%Q<^ExoV@;3iN5a^jmFlM#>P9t3p5WxZ6Socx;o z+|PAV7LgJRP>m^T(YzTO;XuV#&uy`>ihyDS=-3bhco3jtBV;lFr{{9=5wL%vV?1m} zu0E8{8u8cjfT1j?{FEsf8BR%|R-f&_P%cSGousE7|LilfWzDH-+Oc{l`=UfA98J$G zO8kyqT7!HdO76wXV(1|{A(fBc@{2=Rq3D~F={OFV`ZOR-$p0`@hepysLWezjsIRT* zM7mijM@=8vLxizo#X<6o2dUPQ%4Eg&1aJBY#kT~@b!Ogw81sz&bkL3+<8e&Ij^0$E zA5{oP1$%aEAx$NKnjM|UC`ihZ9pNMwfUMZD2VJh_840*HaSVmUj{K8s?C6g|De^+**D10B9OO%@7>IWXMLk3;Rmg7?MUnF#&#o*!%mw@iabai3Qh#X_7mA5G`GTNr_L#!+AYMn$(B znTXJp&;%;NNM#bCAtB))q$s^ZrH6G0Wb5<_<5-FSE@YUK44-XxBtSFLTnDHL@E?3F zPD@!5;2Ft3K~@BaKo_e%io`XEUMMUA43D-E;0p`~$*KP(@#t}EHh(pm{SYy2Mizcw z22lBZK3X>Yegvo}{>bL{yfFYg3DABYNPzPr<@W=l9R0onljB1)8&(1OJ@=1dL3x%& z!796s$347t6!UOR+h#ht4j&%HDwo=gc6G>?!sJSP%XsNCZkTx&P1+ z+tGVmz=5xm$9iqeM24P(9;TuZUptl+avMPZud@?H;8vb=l=(XO9Zcuzdl_EQQ{X<` ztD+#8y#jy4)h&ty$F(gcE&oYIJEbg1aFygWkQE7Pp}$oY2*at1CMYZt%!2Fm z&Bp8GbZ3y@&xEPtSWgz+YEBmZ9|%zSzcCuM&7mIL!+GoFow=|PR|wFPs`~^SCqPfC zs>K1=Nr0xu0s>YOpa+gean3;I@?H~|S3vDyj(njTKf63pit`D~m$~r+6IjVS4@bb* zylwU5&nK{QfsYYop_P6!)A?WOfpY21CYeU^S`*noR)lYw$N~%0AnW&CXJHAA=6ZUwawr+(;!mZ;58<(;;bj{H3_XxC51!lL->+OXx*??u4-0x z7@i)W8+15$nFf)fFn>3R)h=@p#CL4=Fpx0f>88WHFyCy!Y1D3J+2|qhc%+4&!PRp;xHrLMk(zb|<74 zyeJwFjB%B3nZmrI4nGoD5dMLbPJVZ~F2IrZGlfGUc7o}B8D&|)e}WzjtsWD!r}0jhX zQ)~hAihw8rbijl!1ke{id^{~W#>*wl_}DVIF5x+V!i8Y<5I#31B#DL}QlZ$ePE%gp zbuK2+gO+dp;8&-yaGy(x9BNhs`2gX?K=?)CJo^kYEvZg;(uw({QnHDk+IRW1St+pedzj>}=P z^q|BdE~Rx6zYOGM=d*%*=r=4kwxvw^h83w+a-bCq-Bs<=s4XXBD&gm}8PqlnBC-5> z`5RWIfD0iGXZ?ofnZW{DEI_~N=kjZh!|7f>pjf{OL@jh^l}$H;bRRaMh=tDNs_gw3 zLhn&Am`|F)3c1G7|9gWxq9I?0W3W(uVg~bxUb_+QR2fp#B%AzX^Uq4SFh@p7qFI{$n27o<^F*;aH2Q{S&_4AKa-rj!2>Y}g+hjlA>pwXs#M&*vbvrtxz#Sy}goeeB5kX$v1VofRu^ z9b=-S-%s+|vsmxuy`acM)|P-QvW~Wq^($&46IqK&Op>)yA0lfp)|}`27LU)C^yb6o zGym#idRu(mifn=gGV!&Y&EQ+pAW|&v&Ckrox=z8~{2Bh{{s+CK(|D=PywCzx*!!Xl zGHewK@LaQ5xdLavU&jkRz?;uzrN5f87OY93qR-My4DLAaN1>!jnVJ%e{l&O6ML4Jj84!DcBlF)0BiX;naz>1 zWb`hQCqh&n2cGcEoLF?84 z6|LWQx6yhGP%-a)sYxD@zXjUXi#FMlVO7R^}Ju*|=s$kQp+Ocq^c+ zNW2huW)e@4m?ZH$K7Sr-+syy-2Hor%v`gV{k%clhcwb_&!PmUZd{(?juJ6(_W(YPa z$C&Y{Z$YU;l>bz|ZpVksX93kJqGL6|2dE}9#YsM!K_k;3Qgq~}=VMLh27ih_Zu=sw zMg%XofEDqMvmr@fpA5f9@hfk>fR%3;Lx{s@Fp7}deQ8uP$D4|{KT_#VtmiTm&*sVT<6E2VBIz2C?lN=^JKd z=@%?QF?t@qH=Fqz!`3XFgC)K*2v&1E=|e^}$jBFssPV*%zDcCZ4p>KDX)=2kPqK`@ z!X!U|tfDWbqdA_;>5S-Gh{B4#x(E>+ebsZ|wkJ8YG$xl6eLjoW+=${EvWUJ~09Eu& zN6Y4*(i5ogIc1B!{RHG7Ku6z40^XgJcaX(5x1;d0Z53UM#HRwR3Qk--k($(zmWIl6 z_vI{?ce@U@Fq6-_Xj7u7&0`j`5&@o2TJyzl&@>yuSdIlCLX7M>oShGT<0h$k%;&RgiM?Fc(&tEQK z)$3hAsE88ei@mdL6sZhvian%qBNdk_yN6jzNwpl#6_fd(rL1W5i-lB~n%DO-eV5yg zE1HpcOERy3mdyQ)KkM7dc+&bnq2=0Sm{ZDfT3nXov~NwOENu&>(1w3tjBizf6BD*BPiOH*JVAzy<6qGb&Cf6fAPHiU2YWBIE36 z!(`Vf-BfSVzL;ULD?b_Dk+Ni$LGne&Di3|#!erOTR$$k76qJX&<<96%aJXhy0J3s& zYW{>)t5^vZF=%@hoSFtuacUPDHB-<=prX-X8;jBis6v2dQS%)Df)7g;1^(W|kwq6* zJ1k24+?*bz7cI92dkCD8Y)g=r5RcaK?#d4jsxPzGp!pO~NxW zX3G)!mMl}M)Y?lsj6zXjG1FWq#a6QKSxFe*%T&eRuds=Z-;3(_P^GF7wqg_<~LB zdcUzhWsyPV0#q5~I9fLOup6l8u-C>1=L7%^3DA7#L;$TwnRmw92?*M&2y!jdksue4 zNfkkQPc#X#r2+3Xk_aN-ppcu?7Vrw2Sy26$`lxNvfWj&CPS-POde7Li33AU^3Cm!r zG;n0bV9qzQk}MlPLG8T_vun>iQ+r)9xA*s~&zbfIFR=wo8;*wblz!tZ#k7_-Xa-eO zOk2!nZ((2Msb@8XU2AFl;udhNFn_XzRW0L>rR$g^_n42LGBWhiVpNes&WYqf>Gu_g zDUpwyzlt~63R><#Xo>q&d_6W3Ee8`y8AG%lt7tirgmAD%lpd>S88TDTa@JHEErZDH z16(5RL^;y3HfhcR)UM-WnWX4xD(0PDWza@UAvA@GKGa$c-4YJQcaCMQZZV|l z0U86FJ;NbS8$Lx3|XYiHABDxn!QhQ%W1cw4#%u|_cC&*lqV0(+*fHS^=QK*jf1kuvA$w+UEC zfM#Qvp8-t!L6Wang({BZD~Skj(^K`kRAP?P!oZ%n#Vj8sp zN^5FyeX^c^sZD4>yv9D}Utlv(IR&!pmhd6_Sj}n$QCH`#mSpqU{3`7$%b=`j5GgA1 zd#KIuhQNM2nL5j>?`K8pET`^%OGWh8nW!+8(3@2BC6zg88bHWkkVCZiTFthPji#D* zw{umHt<+S>pNxx=u?yPBJlpO?+UJ8UF61M_+ftTXU?g9Fthg|^vdM)JxIi%u1#v;m zwmZXZnhgFkX}Xjzq4fc5PK(%mDhn>01*o{N4UL*y5I{v3?z~Jc)H)5I0s)!}3kV4K zUUH%IujL)Na1P_Y;zAFcvzj|?Li00(6MsFB1@TL{jO@Hn8zYxbbfv7gF{l#%Z!atA z*AQCE>EjVra&oT7acU5+xsUmIGy&|$j;iDN(0#0i+u@3q_h0dRiOkbyg$=npP7@|l zT&u|M!=8Q1CnVzSpTXmJjr}aJPEG3crBnnC$i#>MLMKs?om3_xz97VH2#S~e6(f2g zejONb1LK@x#0jXxNsvKo?*BO>oT#aJQ0VNij|`_uSu$b+$-^KkM!3NPD$VD|C5nP5 zY>Y^NH#H+pAipN3?n~HtkdPg%49^&^8o0!%49@O z0*(-%$Eqy^Y+EfU64Dm zus4<)OWtvzF_6Em$UIAICs*F0qCa#FgHS(0lc;FcTTX&phmcSoq!Y#Y@uSSoDQJ`) zb-qEUX>SQXvib+?5GlPJN1bYlqIiHNZtTh@v2^FlUI$)f>$k3SfkE2 zpoFH?yUB8DE~5C(hqynUc7R1JJ(4I-DAwb0itfiWiN+RGe z0XoU}TmkUoGRdHTE+rfp)DF4TZl6IopOD0YDh8KwyrYjml$i^L#GPx3JIi~T+_}du zC9&%4AkTS%1?62*(qTK(XSWztJt8y81HNgh(q|M6PQ1h=f9p{ zKHlEYh1Hbz=~D_=nT##{nH3(~6IZ9{v6tq=CCRJ%yMZ2s9d76MkW1W1$)R-M$5K+g zred;G*{wBBB6KPUC3 z;tPP9GhdR?zgB$x6P2;S)Rl2XiI4=VC;2mw+7E?L0;4&& zSWqk@<4(728A*OKe#_SSM4EripF53l5z7#-tw~uxDh*TVFSV1PjT9|p z8?RQ{Wy+#_?I{*i%L|$~Cr!!z6KR|R&7uoiDkq+PiWSKh*2N5gZ_yS$ zwZQLVZG$&G&Aezg%xUJ^pgCPVgPrZHhYwO`o#G;uk0R}rZJ~@5!NGQ?R+s;L8h4r3 zf~*MoVvx$X`)rUHXl2}gdGHz51dGnY&ftxy@qG3fjL4A#x%*Kph#fz}zNlFZ#_B$z z+bf-k&3^Euc0Rj%Ftr&2xYJoyKDraGDn6DRDOS+kLOx_Wv8p5DuD?pl=1oIio8d?p zn#pwsa)-E0#Q;=tyw4b8t5V0V%0#l>N=4<4eD7HnT)im-yvVq+hppYJr0-9~>khU! zmsEQNGtrDx*SY&SRw(*C0hizzv4?D{&^Ff@e;bp-8=Y~Yr*@XJcOrIWm*|Vy8=%>n z+wRC)skLd;S|7BQ;nb2=a^!)NNz)RbmPeCOoeqr%kUiLkfG=U7V*i4_8T-ElqJM9q zu*Qq`i0k-RiWf0`B!&Lygul4AbLE&(d`}_AF=H#zv6`6HjWF3C>qk$bYWQ^X&1xpv*q1kd%8GO^E{5V|D zWH*|xrLA6{WO*2)_F#yo@j!NlQ_(_)OTG*Nkkci+^0in~1eH&(Pz4=Cu# zCMg_hG~$PUW3}s?^|l!G2_p&3M99=(yVXXU%}qO-NO6mQb(NJU+6VeLFQ?!1qq4=Y zk*v1nxZm*TtIVtP*Q6+om&By8w(elF#X5m7AhkubXCyfmiK-HY3$_ zQkgMuli=I%oH*W8?e?w=#0uu45Lw>=0)a1j(emT3{Z1_J{d(yS#m#` z?l8RgL$;RCQQ!v zLu2Md`YllLahi?d%~Jt9BS2Gp9RYt3peg>AfOFGimaII{-I3X&`heMFC~`K@%vMDI zHyol|Gpx&prLb_k%AAnG8nIhEJ%xF*XWZ*1E5|1BMmO3Br?qCBs>c;qb>;<}~<{BV(qPCWh=^D7=j|KCVOxdxfo@+G0Osqo;x z-oggKD)fIh^n-ZG-`&F2vB$i~ZEO&1&>X#~HwfOx|3v~iN35uCOOc717Vk(q9SSY~ zK!ziwENQZow>u;)-&MV0>%{ zjXGCz5}ycH6XWwp5Q;#(!puy$*^O@5OWCgkx!RJZZIy74t6m9$)(Xz?7*Fh1g6ip& zAi$2JZq?R$B?zCP&>09TLHDtndW8+Sj4+ksFjj(i?fa}Do62Y0XT_^@gd%Kq!;h(p z5exS3^Vgvo^h~y9!;e!cJB*t_{O*11Xv(gtrafz9Uk}HAzzX^N-V*KBZ1{Gnr$g0a zy#52$5T6SJ9nMhEwhqYIK27i8i6Cef6*VOOR^zn@;#3qRT)*)o9T7~Bw z=0l+mxStH8rA!;2#YU2cLspE>ox@~&fiIvf^hHJy8|8ljTlHM?=T5}<{RulBvOBC_ zwYOO?zBNF__?6jh333EbQE`lo;3o+PBtR3~=N|xh3D5)|K|sc6nIN0&HXIY=79=RU zTe8(Inz?Fip;Rr0q*<6mnKXN4=fhK2Ek64(t6_M$@LoGu0le>c^D!O?A9Gf#R=1I9 zGOt>lZ9=P7Zrz+M5+k=h0f}qbkdahREn0oUS3Y4C-71+arTDJnH=nRhC6eo*+x@8T zw^p+;r80%=7E(EpYF;(qS=8$f_`!q`~pH z&T^ATlO3RzOOw&NswB&-SD54{kQE1F7&su`xu4^N^I3?(%6fI-Ej=%+jv?0>8`+xE z;24{5M6m2EA|)*gCcFZun9v7Jn?q&Zf8o{-xC<~-U0(uH3D8VPBp_v&T63EH3H@ZZ zlWlq%INtU}hOxZaQ&z&aWj4FqG`*pjo8&6MB|iTtD_I~MsAFpSil2YV>Q?(HBi+nQ z&oCB!em}6pX7Gz?5GgM6uxGd*n8Bw$!|giWQF+Fi*DgR^I*f{cD`oO;8b~PGk?Jm~ z%t_D#f*-+2cpBsP92?TA0dNTUT}Tsp9z?dQ$Tk{H*oC|#&@IyTheEqMjto0US-N`? z$&DZ@cR%`wAwjzPX*v|IQINaU8qqztPWyW~Qe|>#Tx02O-t`4L=yc>`J>ILZQJ~dF z)4_S+CDXxgfr`z8Z4Pem3BXbUw1XEA5KDj#_1grD8LT``-$k?cxGz$kT4f~0i~M}o z->gLbr~hT@rh;7j%{s83dEJ-HlWphiUt+)Ow@Mnt=f7lM)hSmU7dnRu&+=5;?#)yW zLWfiFp&V4^cCJsC`*8L-&_KU z08rl=A}J4~hEgo!3^5zTEZ%L{^A??H_iDq|@bnD&YLLq8(%ma~i8riRp1JQ~X?`_s zGmm`3I(xMM;mwcTShq>l__;T%sF!C}x@?@iWpliuYGzRnH#l!uXoCXeg<(|uTZ$b0 zT;AZweZOf49np?dccn_PrwrxpJEW>cs${5m`KHW^FPOnxTF?5Bp=c{kT;R8JYX%iC$j)4%QI_8a$d-aIy>K()Y<7x_>oBze9a!nI~Fq-1+V`#%=n3jonB; zl`#1sP1_(am@sljrKAmXM{0ibMt1Ua>YUqD3@A<>rMkKw`vb)a;GbU-PW43u+3hNq z?u02G-}Wyu$UJ`eUsgHK(O0lBUw6bL@&haGHyfCq(jG&K2#xoUU-3z#M*!Fr*8T%4 zRjeM>OS9NHitJ|BQXkhfAFXxc8$YlRw-B6$C=D-)JjLYW0{-d)bEz?-tlg2*!7=M` z!DDEID2d`ctrV)q1@f9pQ&T_ja{n>^-an8PBVaD9^p)?ST9c(L8ML0{A&?b=a{X;G zC@;=mc%!fwbPycS^WNh~ee&x&|KTRkNN`isx#DJ0CmWhE)5=?*f_Je|r$KH2GYQbt zSw}z=fcW^}cl630rA3`Ai$6stEFoCk&-h_7ZAXd%FKna;GhdjMEqhqs9It$4g1S`CR@7HX` zfAmcptP-X(Z?})nEQa9K`gB$>z?&L~k65tXqJ#^O(D<0uba5gl|008x3W`TP`%SS& z%V$39Hr^qFHN{hc^%=~&NiA|;-C`(;2H)Jtc%J2S*zKW zFvBzYE{wzjkU^aESG?M#s|V9@b`dB)tcWjwVXHVg&~6!MJyrfl#VpwAdfTb7aZ;9J z-71m?Kvr~fNj2%_iVF`E`B7SYI|kxl>6?1zPz~bS_DZ~aapNIh#*9(Mxx9*W_w$;h zD~!fW(mCe?rS{@h!OT|?1gs}OlWsQw3jk!1p6WeDXW5NT)iFJ=+jshlZ++`@?y{(&frBJviZVMb}H1{=Gl5vZ0Sy2B^B-^2&< z&#$18*k4#N;J8j49@OAk-pJYT?=zpQo>CD7D{ZiXYW0({%q(+AZVy?x`pqNL)&D+$ zA{(yA^7Iw>P-m7cUy-L*l;cVMMhst2*67N&xEO75odk@|LDZ1j1CdEbaS4dG5 z`*_71M%}!vP~C12nZ~E*Fg!xOMv#Rv`TjWN{uAa$+Yr_GtOm8w(3cwGM{^i{?N?J` zFb6OnRJDeY4DygcrjNaqv+>kfHqww9xdPCPaQSKV%Vb}QRQRHAPNQIp^F{Fgr7+V| z(!(Urgsfa1{J?a1DO`uBfWmV5TKGu6R&}!?x%_;>(wxR*baW9kV{`OR zEg|XeDNKfq*hB#3I(*Ie0s)H&(4G$|3}6NU+Vdj_7)5~g{B8nz0f>*Um1cWiJV1s< z{yXS`C4{TdCl^w-^71-R%W21{z&chw!LyV9z>gwTxrcj%(= zhm_(dpXO$SGt98vj3C#_y=pGa9*=p(CvA4Pq9-idjvOo$Yc; z-9KzO1+9q-d|_TA(1$*#D>;R9A~ze;kwn@}&X5;;z2FmYYY{rYoZ66=dQgF>OV&`zctoZ?S{r_vn8!J>z{@Ie9jd1U3NVGrW9L+-c)PIyMfv&)9|Is5TY3 z1Ni!U2DT`JwxRD=#nN?HIi@5}$!8Snk(^>pfzm*6%ygug!?UrqHk)g9Hj&~w6qMU` z#x3!nu2X4gqZh7ZGZ-P}Qv#R8!=91$5fC@?3c34i#JK$2w5>M?7GRg za9o9Gg~DRobdV-q_Jep|f*6+?!0Y8PX7G;%jMIioaYeWy#ZAKXL0cx_LV=18^=*V( zKtL)1nsCnvNC6NZf8iw&PVSqDMcT%5mEVYP1S`T#2i5HeH}-eUETlJNM&aZ}qga5^ z@OOScm*G*V9O-FBV`ekiXo~`palfFOHREam5lg8E z!{3r+N|kCQ!tjz#End&d@W{KZAf*t~k*f>xT;7In&K2rO*i}Bq3)!nM|G~=$bg%AU zTAE+?GJ@T+0}Qk3r|~bmjk+P@uUZV;;e+;_lAMy_ou|deoVtSZi1XIZQ1S57+wf^# z&1OCH|6|<-y0G||E1i%YBSjBX0#DszN6~cHT&5_?uX!6)-Ty%#hFOgIix=`SO1mEh zXxqQIgGcxnjoEs>%Eu_hYVb2YMhVx7dC`4efKT*gdmqEkJrxAB_0BC`yr5CCOi6^N znOsld|6-LZisO~P^&F>*z3 zzofZqPQs`yvD8FWjUX5G0>1MY&u77h=Ihexahh6IO*56)}nh=R_rkEd*5&BDg zb+@lCS}b12d-)n3g__xrX^1@A{>N|ld|#s$c79&)H3FCif8lGi2%32T2R6BW5UI-C z>0r@yBk$&iJ&JLpE2+O^3<_4Fa=Zb*ZY4^5GDAJ){xYVLe1{r64=e zfR67;|JD8FoeLdP2n-XSvO(obS!KpEgTM7N^4A#kh27b{Kp@a;l^PS*pb9*?r#idMvsarSC6k~GW$K6F`2yzsF+vP#_Z<=Od&usJG>HrAp~e< zFC(A}fGk!)+)krc>{daX3z89!=H~ zPE%Bez?f~KW~!G92%F(Busj%lbgExME__ABBtE#PQ6{()DmqZSGe%xVif`bDiW)^( zFuzmO@L{g}T~VX9Tl^V|K3K#LGJFaRvLS2S>=}-|SV2a`Lfr_|-_EX?eX_U3Z+yBm z$Y>Ujc$&_{?)&F|AvnY0-1Ub9Fg*=60^Ab;hFVpB2jp3}K_x7qP?FNVmL>fr?j{ zVwq92jDULt=qdJF0xl7tqo{HX0JKPEM$t3^w)1)+n80>Bj_z9W9MgL>sEE)@DNn#hC5pc*lJN-3ik zE6VSc!U%+4ODJWuXZv}J(nc}You6?2u^@mL$fuOXeP2IN*720_@$u3|aG4+Q7OFWl z38PvCsn*9gU>WB0>-BwKSJM2&(@Ps|7`|dz2E@lDmocjMZi@P16BXrAN1L~Y7es)R z<$Yd5lJi1VeB61&kHA+vH3Z5-ySkyS2(2 zen$HY&UzdEt`UTlChI)>MtP*75(K29_r-(1tsK#az+a^-$BcKRKVj29A$bpE<+4`j z05!vJe+Vw?io$Z)7<9EBcb$>el2hLy_t}01E@6BH<153cA13`btZSI*zi|oZdvkdR zC?2T*(EhtZz$dJZnEoqYAHZ`0wEw0NaEk!#zZ3#~0U-Ss(g4yCUZJw#6*zRCqx<^h zaByGbPd4}EZ~Bv?`+EP!PlOo-_{(yJYwoY8TNhGMB3s= z(1oT8Us89ThWEtQr;aZCg6b~@xSmFL%^A!ds~7>UYpK>)s@0j#tz!7HjuMaVKzLcg z^Xk@;b?P5Mn*UPC&C;y_Wb{nRaypflgz~IIJ0twI#98W-A0<;595|H7q zLT>j?N1ts0sSeQ_v1%T>dXMy3k+XzU!&oSy_Mn3OTcwyQS2z5EC(tEdqoT(XBzSXA zM{h#^iT#ey_{Ct z@M$(5y>7;FX)-d%=C~IW-kORBdz9WRLR@;SGW11q<3?}^pV8`G z#|Sc_wPGqM+LNLh-%-a1Hp(eQ^p~V?A%(cF4r>N{IBBi|)RajBJ4CXSC1nK3`yeaI zwE5AbOvmk@Om`F(Wk$idnljljpeLuMAvMW7&VO%blulSx*SOA%xYjD_H?}qzvu~@7 zASZ!}rrtJ!1hfHAod8XcF$9DVpb2u80B>(ekeX*VIT9oZ1Ed{64s6kLz(o0QChXoP z{o3@mThn=)e9V_u|JtZ;RNunu^f!vu<|63<{3%ZI!1{(CJHbQigAD7wXU#t(OyDLR>9#TAp>%`exj!q9D%|3wI=_zEiLCVtUXGvZJSvkD|I#p%) zs+-~TIw&lse+P$Yr$0f)OHNHe4zhFlkp{+COupLdG|}F4`kRgLpdP$80u^(xykVsY z0wxfk(?moE00RloEZ9y!M*=hp(glKUo8kt0Q?lMs?JzyR^^hME`L`%BIXn$R(HGQp;ne9@e}nhT`NnmEZ^ECLl$LB^6fIsBfWyMa#)syNV;`L4 znf(W9U4V1Nu3r@`u!&8&-JRN70Z`N8I2p~6vefS)c_L&*3m9Xy2Ikd zHaJ%E;^K4S#qq~{*BGM$W+00b2DUP?Gvjg(HI|4TCNmON*ocs`C%oD+r;P|*38+ng zCc@2=qy6t*6?1n+?GXbZ&b|WHQN|LzP+Ke z)}5Bzg@42mlx5aBQ*N^P?7N5wHiPGPv_YhJ z%>&vR1%nS$UwaV=)?Wlu%-yaV3Em85i8&WP@qp(npzeR*u*1xE6dJ?a7293Al64QV z4nrfEx4W((ZApHltx?z8#jNA7bLu6}-_9rzeFk&}jb?t7J+H~qABPoNK?X7Rg4MQr z>@c}7CF$~rEQUj=>9m-Pdq`R8V@PfVS<&gm5|d7EIN0<7g<_K@emDL)IHKwFJ?3A@ zsrc#Mb_VuBo$jmB%k91p>1Eau?%v#}&UTc2Dz{s72>QOV7?&fKD;WD&#L(YvY4*+NRh)!V0W^tLT&iyHj?F!G3a|$e`V(CM`r)P znIeVf?qv8I*KWxA(O0hk`;ip!XVf{Elh+rd84pmO(`qsrC}qiyc#=CoR{VIkz~slr z@4yeIMJ7K$kBjiLrpGqq(d5+CNM&js6EV;T;h4vCO=#WOsK|`#gA`$&4>Ad}0S%jk zaT^S0*TAi=Ntl5Ilq5hCCW!za0yJSfz6Owk08N;l1ibsi1J@XyH8;<7B+Ob2y>^6I zJl}yZfu~Kv3|L@4rS+Mw7?Ts`_KXSO54wOcZ_!g=%t-vvjCn|XSDUUS_ySj?rjXyB?d@a^r@?q)Kzx zh>uuEGpVwL04!LW_KDd>0QiFdO_c}&&Jm!gvW|enG)a}}gJwBWr58ACN0kn99H{bV zl1Y`4Jf^47+xTO)Sx;e7P~%!x5>!Z7+CB0>};+(ox~ zSC0$DL-*mRRAV`hLUlTcVpX%ByDrUYFjrg$Q^srwy_ zGMiQS|5hxWZo#HvDq8_{rqQB7Bq4wtUhcTIP`gMNrj&Afg; zvU&g#h?9HO5l#98Q-iwz>O^ymjMhq7(&r?}^C2tx&_@*2eNm;Upid1H7JZh&|M9tF zdatOGrf}>~WFmbQ0zHixEa)w}{;)0ar}45>zm6G171y zFqh7?1Pp8+Ra!#B%9X^`v{=(?0=_AvzL1*wJ#KC7pPmebo%zmLii>RM?k@X=n#15w zAG-Z7#E*|Oe8Nk9USowrjhrxOeaEF5&OW7>Y;mH4o>EyPhBE(AMzNB&5m&;MD6w=0 zMF_=%Ce9L4y`o|gRP+*BVYg)@4hMNe+a3J;IIQ1~5{&FB~D<#V16q}- z9vZ3|^~k`74F2O!M`N$s0`55mH-V4#13CHKSzw z7(|J_ySoikxIeT7MfsTk(jVA@B8Gq$1n8i+O~7rQZyX*J#*c7}iP)1Mirj1fUhT@7yZ8)yo_JB`(>O_jNt=_54DN=04mYk~e?uRDaU`2nFvx!l>pm2aNhW?8YSUog<8b#XCcrMcjo+*o?c@{Ni|{ zijn>kZ!_8`>iPj37QezdVn44i!6?uzFL`U_4_2N_B3+!6rMGvJJPES$W>L`ig*70OW(<@OhBxnbHE1Dna5wYm5SwAARlU@Y|rAT@w6t z*yn@iQSLn1sFY_mRMx0%3U4wQd)U3)<3f%D)GCMjq-W+4z)WJwi-?`!rQJwCZI#nemmQtW&)){ z5o&*^VZiB7%35!&>P*J^Gf1NAP=0SRW{Bsf7;e>k;bx5QD}FSymvAM=_ow3ZdIIgf zp!f<_;te=KA6=Vj6z$enRt5q5SforK*X>gq$t?T5w5yd;^sWpRjsq4z)Bfu{? zikLr^grDG!HmXE(vavoaMGq9T|E59_7FT2m`L$;9)GF&qrx!(f%Su-zMa@i!a~6#@ z(W$MY3n%Mm)z;I?%eqooSxNcSsu_*J?%Wo-7OMJkEmfsD8QJk>UwhkHTSIF83e(wAIAu9k5&)W!q~4qKiRZDc5%u##snTpV3QARSc*G+ zusk)f=^%eG)2L1#l8eC#`=g`i!YCUGNIMEe=ary5K&^ z+aN0!H0cW$P*Rg`@{0~Q6RR(xaY^bW8u{yD!WZK^KIrjmC%-()n7wqS(b2fFNaoQm z#Uis$E}=oQPuv#c{QLc8>yw@YMEs`aelEQnJLMCGcDqjbAHO`)@Xo%9shI>E{I302|>kZsB{-BTMfC7lw}uuOL9BNstaD@JX9CFhnqw? z3abll;JWO);1n{WQ*!DeercBR&N#A6O_r}MGq1i^Z`&x622`Y7#?|Y2LG$GR{vtq+ zA{z;~PJkXovaJAciU2)|L=dq5vh1*8{kl7LSU2QOwG;deH|Ma``Iy;86}FH6I2*5q zVaMTY!@t;-p4h9NRtuRuI}%d7Gu~=QieIoeFS7P&u>qG9mmQx|@|mqKbT)EjIVuh<`jp}RlV=(Hkbri3tyO>vkZuih*0YOPnx%du-7LV` zc01T0#z|RHWEIH+AS;TvbTbo`YY$K)KMF~a!hNyon+!kObL8euN*S9I4$U=k8b<6Y z$&tFNR+${>)72IsNkGMib2du2tp<=vfTlzz0#eRN2DF{s$&mrmk>Kn?W^5NLkDPyF z%OfHZX4dr&+J{TKzZ}Ka3orv&6JvPu#q+Vrx+zbXZv>VM!N8#0D3&Z#e(H=dLEnSh ze1&ghEHDZWIRX-jO4Qu3`Br!Sxft?JDa-D>O7a@Wsyl0SHoKEPY%7|eup(|Qdc?jr z^J2VDPQ8oN_Dt}kxkhRb8dX@|{5mQLjid27a z*F{EcmdKkd0{fToL5uKCQ%)WWX+UMN+O`D6S7<<2?E-I!;!>8K-i%}~$g0!#<6_i2 z`A|o6`Uw2w)BYn!-Z}m_UHeYTF4In5;UvU|Yvd&W99rs49((LDb3F`Qat#5`7)yN9g_C$%2lq^iu;VZ*`j`2PdGNR-dbuDjDAG(&o1Agc=Bx~-<=~> zD5=g%6;;#ouAQVRMylOVX@~tD4|$!GrNd5@QL{Sq(r6j+|&hp#b zE70rq9y2iPC#POXSjdfO@YoiWbhd9XJ?4SN%qX}5RBStL=drB-RuG^))|Y_U$CZO> zv~+Y(MU1@a+u8JC6;Xn(SZ)+@%?VTuMr-)-9a9zff)$2ufn76cbGWN}~wY zaHp&^Dwdy)+Hq%{&Nq=1IwbdOoI?-Cc}j|87d>GRn-slgJvA$G@p~)rIgCeOuINHe zd@>_5HAodos`FB1H*5O^5h{w2YBy9SHNXO~PRfcJBrkxhsnG(|kY6#bjH?heQP@!f z?p5DzK1A^*49xf>HCEwWFQeuTNsT%YJ4|YHLSrU1#sd{E580@3l7PDeXlmr$3E(0R zSYvoKn%cyX8DlZn+A-tn=GJhO^vE2J5@nAyhoxf6!*6)fa>L8%3}zrp)_^cM`2qaN zD=MFL&k%;L-6e_DJwBc@O#d7?=osu^Fn!YGpe&2$ICc#AMT zX{}MrJpgT(e93`dXxIg?;Pa*uw2|c{M#E>7*N5bcLyoZt48q83eG_mNlYL}%hkAgPv-DoCpA(nxkv zO(9iIs5Do~#z0P+O0wjNFXTEx08nI^8E)p0xj22X2!)mS!{A5K&QM7qNoVdr@QWeu_~OtWgm)7HqMt4I3IXQP*C29WTK8ygx;n_m@Z$8xt^n_$5+8 z!8~9pX!{xbt)<-7hV}zyO6vK)Kd5PY7|-B|rUY2c;eFf{ZW3UTCXToX1ltF!b*@T@ zRJk%WCfK+NoI0Nz+IBl3?xC(Wi4+sq2#5KAt>&(|=qyQjIzM2mfa`1`#nn8}Bo}i4 zRR+L>>k5p+j|O{upXbV4t~yCn`JgeN26^LJv@0@+Y8^lly7)MqTx^JYwkstGrP4j< z^Mtg3HMZk>gpLRPp2xl8Jm7qcdD-Bsh_ia)+*My!5pS>;l2%?9VBCaO~K1#d(4An`-erpBtuupP(KWLj};G{x;xw3 z_D8^GgafArhxnz{s`;GP;0mK|fD83xoi|+{MT~#+y z^+-askt$Pmc^nwN+Q~0xWWk&Q#CAMb80;Fqk*eclVJ_}uvhMsyqG_^&*Ryb>_Z#w3 z4ntn|V~)jkVSC$lKM`d6^$4HJTv!?pi&@bCDoeymuFC3R4ZSs<*2qONvdmfUTpgDC z1-s79p{lsfZlxBxo^GNhQY-g*g4V9RK4qoius&s7La)2+<`2pW-G>f?ba<6DlyuZ{ z9obBkseN7jSXURm`Jk&a_~y8+D{zkii?&c9Ws^w{xp#uEyb>Z}->PtbXSh~xL*CSM z3stf~e$3UQyOlt5{MjS7^4C2&cizdupeHBXDkc_x99B8fZtUGfE@c2|hol`Q?Io_o zTc`?6HpKdl(&)b&6!>sZ{o z)RkK)(~mlL&|_fkgFcG+v+cy*RYIu35I4XoY}>0_n! zkN=>w9#Ci=1AFBf2GxYfr1yU*4u6ql8x>J3VW@AhYdc-cZmM*ZqqusHwUo9qwZDAZ zd)?$Z{&WRwry7#mS=%YO*!dy8kAF4M{&r1uti8HgdTa^?-k_UHDtt(-|@yA`%Q%E=Oa%6TF~Ie+0L z*SxM^<-N*T3C@s_HE;5})N?!F2&lLWTRH8QXZVy8h86ZH=P-KR2f%lI-mh3DIyRFI zuX4JOj%B378`)Qrj@gN}woHxtSXbkHj}P}YxXFN^tpErLL4uFpy6?lJ6x%| zsLEmYg^%^;@ge7Zy><+A4|e^ti>h5z!Vx?c_=}6)jaz6jm~LKelIh#qdo#&(Cd_m- z+(Wgd3Qu<>?4g>v-tMM?i?to-I|!ceAeac6jLXh@l-;fdd#E;k^ zfkbx;qLlN|M4x%sS}GZeAVcXG^6K*jROe2%w{3m?M7Eb;+oMm3_36{#q0h#6$<^l^ zsKu+#hX}W*ij4nX?y`LvlH&3wJldsC__S-`us-c}La+NbBn3Y0t|lGFNQYOu4@t)^ z(&5!^y_4uzx60No(<$O(?Y4%$@^bn9UQNR9{Q=tTQPL&X{B#O`UW@scLdnV8ey+pm z_yMP{@kx&cgMt5#eduv_3TB%l<%rQEa2@d{Y$&-Gf#%vBIbx1LR^5}U*^nBGu^js^ zd9@n3GHnDoQAq9?wv({-k(WO1bhp7Na66!kdnOtlf>oRx6g_*%kiWYR-fXJ$jFjko zPa7FCp}t*T;l=8U-SVox8W~zbhC(sqRey^ZY?rdPZS^Z;JHLz$kN($UaXnDqKtum2 zc*)g&Rj9?Q|Ia27{kQnqwPGuE3V#lbYTydpPsNtHfb94n`QGm#5`MVDk(rG)TAS8}zfl6+F-=QTfY{th|D&%>jVo^YH%$iYBh{2LOr#eSDz!3`XQrStR0_5i#Nw82eYx_{YxGqq?3NN{+Zwy3w zc)hzBh|An2m(t0@5b>oQB^uz#B3ODxR#>Wbn40DnxCKsUAAvtXemI`)#gAL}Z2YSa z`CV}u-y@RI=yg9`1YCO=$u81ylXMXH;KuF}CD1JZGTba>t30@8t7d`GD= zb)sr~4E;zXEgtAU=>8G%-LA<;f&7|CtMc*_&%QyfZAYo<#b)6n9(P!MupNtf><4lC z2<>Na?mTE;jHSto_G<`aifRFjt zL8Ea{55Swc)@9%q|4O?aX5itUN3O3jsmd-clPXE=8|ZqJfm>1dk+@8R%VS@S z`fTB0%)5Y(7Ui0Û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 delta 153 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Û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 delta 153 zcmZqpAk+XvEsQNpEzDb3Sk^EXtj(IvzJ^5>%urv$VhU!&!$j)Wu!u?n)p#&~0V9|+ dfKUt|z3Z_l2tZPBADe;#go5q-Ygs;W0RZYtB~$ Date: Sat, 2 Apr 2016 21:28:35 +0200 Subject: [PATCH 03/12] bug fix issue #128 --- .../TreeConversion/syntax_tree_visitor.cs | 18 +++++++++++++++--- bin/Lng/Eng/SemanticErrors_ib.dat | 3 ++- bin/Lng/Rus/SemanticErrors_ib.dat | 1 + 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 9961bc4e5..510c7f26b 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -8515,13 +8515,23 @@ namespace PascalABCCompiler.TreeConverter si_right,get_location(id_right)); return create_static_method_call(fn,get_location(id_right),tn,false); */ - //if (!(si_right.sym_info is common_in_function_function_node)) + //if (!(si_right.sym_info is common_in_function_function_node)) + if (dn is compiled_function_node) + { + if ((dn as compiled_function_node).ConnectedToType == tn) + AddError(new UndefinedNameReference(id_right.name, get_location(id_right))); + } + else if (dn is common_namespace_function_node) + { + if ((dn as common_namespace_function_node).ConnectedToType == tn) + AddError(new UndefinedNameReference(id_right.name, get_location(id_right))); + } if (dn.semantic_node_type == semantic_node_type.indefinite_definition_node) { return new indefinite_reference(dn as indefinite_definition_node, get_location(id_right)); } - return make_delegate_wrapper(null, si_right, get_location(id_right), true); - + return make_delegate_wrapper(null, si_right, get_location(id_right), true); + } case general_node_type.property_node: { @@ -12165,6 +12175,8 @@ namespace PascalABCCompiler.TreeConverter } case proc_attribute.attr_extension: { + if (context.converted_compiled_type != null) + AddError(get_location(_procedure_attributes_list), "EXTENSIONMETHOD_KEYWORD_NOT_ALLOWED"); if (in_interface_part) AddError(get_location(_procedure_attributes_list), "EXTENSION_METHODS_IN_INTERFACE_PART_NOT_ALLOWED"); if (!(context.top_function is common_namespace_function_node)) diff --git a/bin/Lng/Eng/SemanticErrors_ib.dat b/bin/Lng/Eng/SemanticErrors_ib.dat index ce30b545a..137f6e6a4 100644 --- a/bin/Lng/Eng/SemanticErrors_ib.dat +++ b/bin/Lng/Eng/SemanticErrors_ib.dat @@ -117,7 +117,8 @@ EXPLICIT_IMPLEMENTATION_EXPECTED=Method implementation expected ANONYMOUS_FUNCTION_TYPE_WITH_GENERICS=Anonymous delegates can not use generic parameters CLASS_NOT_IMPLEMENT_THIS_INTERFACE=Class doesn't implement this interface INTERFACE_EXPECTED=Interface expected -IMPLICIT_EXPLICIT_OPERATOR_EXTENSION_ONLY_FOR_COMPILED_CLASSES_ALLOWED=Operators implicit and explicit can be extended only for classes from another .NET assemblies +IMPLICIT_EXPLICIT_OPERATOR_EXTENSION_ONLY_FOR_COMPILED_CLASSES_ALLOWED=Operators implicit and explicit can be extended only for classes from another .NET assemblies +EXTENSIONMETHOD_KEYWORD_NOT_ALLOWED=extensionmethod is not allowed in this context %PREFIX%=COMPILATIONERROR_ UNIT_MODULE_EXPECTED_LIBRARY_FOUND=Unit expected, library found ASSEMBLY_{0}_READING_ERROR=Error by reading assembly '{0}' diff --git a/bin/Lng/Rus/SemanticErrors_ib.dat b/bin/Lng/Rus/SemanticErrors_ib.dat index 4722b6f64..e8a931ed4 100644 --- a/bin/Lng/Rus/SemanticErrors_ib.dat +++ b/bin/Lng/Rus/SemanticErrors_ib.dat @@ -113,6 +113,7 @@ ANONYMOUS_FUNCTION_TYPE_WITH_GENERICS=Недопустимо описание а CLASS_NOT_IMPLEMENT_THIS_INTERFACE=Класс не реализует данный интерфейс INTERFACE_EXPECTED=Ожидался интерфейс IMPLICIT_EXPLICIT_OPERATOR_EXTENSION_ONLY_FOR_COMPILED_CLASSES_ALLOWED=extension-операторы преобразования типов допустимы только для классов из других сборок .NET +EXTENSIONMETHOD_KEYWORD_NOT_ALLOWED=Атрибут extensionmethod недопустим в данном контексте %PREFIX%=COMPILATIONERROR_ UNIT_MODULE_EXPECTED_LIBRARY_FOUND=Ожидался модуль, а встречена библиотека ASSEMBLY_{0}_READING_ERROR=Ошибка при чтении сборки '{0}' From 7396c71d89edb1149d2b2002ccdde4a39092285a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Sun, 3 Apr 2016 12:57:12 +0200 Subject: [PATCH 04/12] bug fix issue #126 --- CodeCompletion/DomSyntaxTreeVisitor.cs | 1 + CodeCompletion/SymTable.cs | 54 +++++++++++++++++++++----- 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/CodeCompletion/DomSyntaxTreeVisitor.cs b/CodeCompletion/DomSyntaxTreeVisitor.cs index d1f15e1c8..79149434c 100644 --- a/CodeCompletion/DomSyntaxTreeVisitor.cs +++ b/CodeCompletion/DomSyntaxTreeVisitor.cs @@ -1383,6 +1383,7 @@ namespace CodeCompletion if (_function_header.return_type != null) _function_header.return_type.visit(this); return_type = returned_scope as TypeScope; + cur_scope = tmp; } } diff --git a/CodeCompletion/SymTable.cs b/CodeCompletion/SymTable.cs index 2d2d35f2a..32bf2660d 100644 --- a/CodeCompletion/SymTable.cs +++ b/CodeCompletion/SymTable.cs @@ -1844,6 +1844,7 @@ namespace CodeCompletion int i = 0; foreach (ElementScope parameter in this.parameters) { + i++; if (parameter.sc is UnknownScope || (parameter.sc is TypeScope) && (parameter.sc as TypeScope).IsGenericParameter) { int ind = this.template_parameters.IndexOf((parameter.sc as TypeScope).Name); @@ -1863,6 +1864,8 @@ namespace CodeCompletion inst_param = new ElementScope(parameter.si, parameter.sc, parameter.topScope); instance.parameters.Add(inst_param); } + if (parameter.param_kind == parametr_kind.params_parametr && i < gen_args.Count) + gen_args.RemoveRange(i, gen_args.Count - i); } instance.si = this.si; instance.return_type = this.return_type.GetInstance(gen_args); @@ -2517,6 +2520,13 @@ namespace CodeCompletion si.describe = name + " in " + declScope.si.name; } + public override TypeScope GetInstance(List gen_args) + { + if (gen_args.Count > 0) + return gen_args[0]; + return this; + } + public override bool IsGenericParameter { get @@ -3855,6 +3865,8 @@ namespace CodeCompletion if (this is UnknownScope && ts is CompiledScope && (ts as CompiledScope).CompiledType.IsGenericParameter || ts is UnknownScope && this is CompiledScope && (this as CompiledScope).CompiledType.IsGenericParameter) return true; + if (this.IsGenericParameter && ts.IsGenericParameter && this.Name == ts.Name) + return true; TypeScope tmp = this.baseScope; while (tmp != null) if (tmp.IsEqual(ts)) @@ -4767,10 +4779,19 @@ namespace CodeCompletion { Type t = this.ctn; if (!ctn.IsGenericTypeDefinition) - t = PascalABCCompiler.NetHelper.NetHelper.FindType(this.ctn.Namespace+"."+this.ctn.Name); + t = PascalABCCompiler.NetHelper.NetHelper.FindType(this.ctn.Namespace + "." + this.ctn.Name); + else if (this.instances != null && this.instances.Count > 0) + { + if (this.instances.Count != ctn.GetGenericArguments().Length) + { + Type t2 = PascalABCCompiler.NetHelper.NetHelper.FindType(this.ctn.Namespace + "." + this.ctn.Name.Substring(0, this.ctn.Name.IndexOf('`')) + "`" + this.instances.Count); + if (t2 != null) + t = t2; + } + } else if (gen_args.Count != ctn.GetGenericArguments().Length) - { - Type t2 = PascalABCCompiler.NetHelper.NetHelper.FindType(this.ctn.Namespace+"."+this.ctn.Name.Substring(0, this.ctn.Name.IndexOf('`')) + "`" + gen_args.Count); + { + Type t2 = PascalABCCompiler.NetHelper.NetHelper.FindType(this.ctn.Namespace + "." + this.ctn.Name.Substring(0, this.ctn.Name.IndexOf('`')) + "`" + gen_args.Count); if (t2 != null) t = t2; } @@ -4778,11 +4799,24 @@ namespace CodeCompletion sc.generic_params = new List(); sc.instances = new List(); sc.original_type = this; - for (int i = 0; i < gen_args.Count; i++) - { - sc.generic_params.Add(gen_args[i].si.name); - sc.instances.Add(gen_args[i]); - } + if (this.instances != null && this.instances.Count > 0) + for (int i = 0; i < this.instances.Count; i++) + { + if (this.instances[i] is UnknownScope || this.instances[i] is TemplateParameterScope) + { + List lst = new List(); + lst.Add(gen_args[Math.Min(i, gen_args.Count - 1)]); + sc.instances.Add(this.instances[i].GetInstance(lst)); + } + else + sc.instances.Add(this.instances[i].GetInstance(gen_args)); + } + else + for (int i = 0; i < gen_args.Count; i++) + { + sc.generic_params.Add(gen_args[i].si.name); + sc.instances.Add(gen_args[i]); + } sc.si.describe = sc.GetDescription(); return sc; } @@ -6275,7 +6309,7 @@ namespace CodeCompletion generic_args = new List(); generic_args.AddRange(args); } - if (generic_args != null) + if (generic_args != null || declaringType.instances != null ) { //TypeScope ts = declaringType.instances[pi.PropertyType.GenericParameterPosition]; this.sc = CompiledScope.get_type_instance(pi.PropertyType, declaringType.instances); @@ -6911,6 +6945,8 @@ namespace CodeCompletion public override TypeScope GetInstance(List gen_args) { + if (gen_args.Count > 0) + return gen_args[0]; return this; } From 00ec273bb92e6f3a240875250a7f5b64de20c42f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Sun, 3 Apr 2016 14:05:46 +0200 Subject: [PATCH 05/12] temp debug output for #127 --- NETGenerator/NETGenerator.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index 8c2fff500..03bd533ef 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -2260,7 +2260,17 @@ namespace PascalABCCompiler.NETGenerator if (parameters[i].is_params) pb.SetCustomAttribute(TypeFactory.ParamArrayAttributeConstructor, new byte[] { 0x1, 0x0, 0x0, 0x0 }); if (default_value != null) + { + try + { pb.SetConstant(default_value); + } + catch(Exception ex) + { + Console.WriteLine(func.name); + throw; + } + } if (func.functions_nodes.Length > 0) { FieldBuilder fb = null; From 739208edae84e12184f16f4ec8c1a9f9e1b7370d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Sun, 3 Apr 2016 14:14:28 +0200 Subject: [PATCH 06/12] possible fix for building in mono/linux --- NETGenerator/NETGenerator.cs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index 03bd533ef..f915d990b 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -2261,15 +2261,9 @@ namespace PascalABCCompiler.NETGenerator pb.SetCustomAttribute(TypeFactory.ParamArrayAttributeConstructor, new byte[] { 0x1, 0x0, 0x0, 0x0 }); if (default_value != null) { - try - { + if (default_value.GetType() != param_types[i + num]) + default_value = Convert.ChangeType(default_value, param_types[i + num]); pb.SetConstant(default_value); - } - catch(Exception ex) - { - Console.WriteLine(func.name); - throw; - } } if (func.functions_nodes.Length > 0) { From e6de5d72a9a8d67d67e9f9fb4440b16021a9be16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Sun, 3 Apr 2016 14:22:23 +0200 Subject: [PATCH 07/12] possible fix for building in linux/mono --- NETGenerator/NETGenerator.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index f915d990b..5e91e06e2 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -2261,8 +2261,8 @@ namespace PascalABCCompiler.NETGenerator pb.SetCustomAttribute(TypeFactory.ParamArrayAttributeConstructor, new byte[] { 0x1, 0x0, 0x0, 0x0 }); if (default_value != null) { - if (default_value.GetType() != param_types[i + num]) - default_value = Convert.ChangeType(default_value, param_types[i + num]); + if (default_value.GetType() != param_types[i + num] && param_types[i + num].IsEnum && Environment.OSVersion.Platform == PlatformID.Unix) + default_value = Enum.ToObject(param_types[i + num], default_value); pb.SetConstant(default_value); } if (func.functions_nodes.Length > 0) From 4d7eef92ad9bf026736fde9096bba622909227c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Sun, 3 Apr 2016 14:26:38 +0200 Subject: [PATCH 08/12] bug fix issue #127 --- NETGenerator/NETGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index 5e91e06e2..9b4815f71 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -2261,7 +2261,7 @@ namespace PascalABCCompiler.NETGenerator pb.SetCustomAttribute(TypeFactory.ParamArrayAttributeConstructor, new byte[] { 0x1, 0x0, 0x0, 0x0 }); if (default_value != null) { - if (default_value.GetType() != param_types[i + num] && param_types[i + num].IsEnum && Environment.OSVersion.Platform == PlatformID.Unix) + if (default_value.GetType() != param_types[i + num] && param_types[i + num].IsEnum && (Environment.OSVersion.Platform == PlatformID.Unix || Environment.OSVersion.Platform == PlatformID.MacOSX)) default_value = Enum.ToObject(param_types[i + num], default_value); pb.SetConstant(default_value); } From 6ccfe636e17d5dbee025e2ce35b9b0b1959c52ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Sun, 3 Apr 2016 14:54:55 +0200 Subject: [PATCH 09/12] sudo gacutil in _RebuildReleaseAndRunTests.sh --- _RebuildReleaseAndRunTests.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_RebuildReleaseAndRunTests.sh b/_RebuildReleaseAndRunTests.sh index 9707cede7..106790ecb 100644 --- a/_RebuildReleaseAndRunTests.sh +++ b/_RebuildReleaseAndRunTests.sh @@ -29,8 +29,8 @@ if [ $? -eq 0 ]; then sn -R PABCRtl32.dll KeyPair32.snk sn -Vu PABCRtl32.dll cp PABCRtl32.dll ../../bin/Lib - gacutil -u PABCRtl - gacutil -i ../../bin/Lib/PABCRtl.dll + sudo gacutil -u PABCRtl + sudo gacutil -i ../../bin/Lib/PABCRtl.dll cd .. mono ../bin/pabcnetc.exe RebuildStandartModules.pas /rebuild if [ $? -eq 0 ]; then From a35f63bbab417991dd35703791b8a8129c35b121 Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Sun, 3 Apr 2016 14:58:20 +0200 Subject: [PATCH 10/12] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6495518cc..f04c11098 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Build the project and run tests. ```bash $ git clone https://github.com/pascalabcnet/pascalabcnet $ cd pascalabcnet -$ sudo sh _RebuildReleaseAndRunTests.sh +$ sh _RebuildReleaseAndRunTests.sh ``` ## Building PascalABC.NET in MacOS @@ -32,7 +32,7 @@ Download and install Mono from official page. Install the git-client. Run the co ```bash $ git clone https://github.com/pascalabcnet/pascalabcnet $ cd pascalabcnet -$ sudo sh _RebuildReleaseAndRunTests.sh +$ sh _RebuildReleaseAndRunTests.sh ``` ### Run the PascalABC.NET command line compiler @@ -73,7 +73,7 @@ sudo apt-get install mono-complete ```bash $ git clone https://github.com/pascalabcnet/pascalabcnet $ cd pascalabcnet -$ sudo sh _RebuildReleaseAndRunTests.sh +$ sh _RebuildReleaseAndRunTests.sh ``` ## Сборка проекта в MacOS @@ -81,7 +81,7 @@ $ sudo sh _RebuildReleaseAndRunTests.sh ```bash $ git clone https://github.com/pascalabcnet/pascalabcnet $ cd pascalabcnet -$ sudo sh _RebuildReleaseAndRunTests.sh +$ sh _RebuildReleaseAndRunTests.sh ``` ### Запуск From 272ca3d9fa95565268ca460aa19c65f864802771 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Sun, 3 Apr 2016 19:02:46 +0200 Subject: [PATCH 11/12] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20GoldParser-=D0=B0=20(=D1=81=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=BF=D0=BE=D0=BD=D1=8F=D1=82=D0=BD=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=BB=D0=B8=D1=86=D0=B5=D0=BD=D0=B7=D0=B8=D0=B5=D0=B9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ParserTools/ParserTools.csproj | 14 - ParserTools/ParserTools/Errors.cs | 21 - ParserTools/ParserTools/GPBParserTools.cs | 433 ------- .../ParserTools/GoldParser/DfaState.cs | 66 - ParserTools/ParserTools/GoldParser/Grammar.cs | 624 ---------- .../ParserTools/GoldParser/LRAction.cs | 61 - ParserTools/ParserTools/GoldParser/LRState.cs | 84 -- .../ParserTools/GoldParser/LRStateAction.cs | 83 -- .../ParserTools/GoldParser/ObjectMap.cs | 448 ------- .../ParserTools/GoldParser/ParseMessage.cs | 108 -- ParserTools/ParserTools/GoldParser/Parser.cs | 1074 ----------------- ParserTools/ParserTools/GoldParser/Rule.cs | 135 --- ParserTools/ParserTools/GoldParser/SR.cs | 100 -- .../GoldParser/SourceLineReadCallback.cs | 31 - ParserTools/ParserTools/GoldParser/Symbol.cs | 142 --- .../ParserTools/GoldParser/SymbolType.cs | 81 -- Parsers/PascalABCParserNewSaushkin/Errors1.cs | 16 - 17 files changed, 3521 deletions(-) delete mode 100644 ParserTools/ParserTools/GPBParserTools.cs delete mode 100644 ParserTools/ParserTools/GoldParser/DfaState.cs delete mode 100644 ParserTools/ParserTools/GoldParser/Grammar.cs delete mode 100644 ParserTools/ParserTools/GoldParser/LRAction.cs delete mode 100644 ParserTools/ParserTools/GoldParser/LRState.cs delete mode 100644 ParserTools/ParserTools/GoldParser/LRStateAction.cs delete mode 100644 ParserTools/ParserTools/GoldParser/ObjectMap.cs delete mode 100644 ParserTools/ParserTools/GoldParser/ParseMessage.cs delete mode 100644 ParserTools/ParserTools/GoldParser/Parser.cs delete mode 100644 ParserTools/ParserTools/GoldParser/Rule.cs delete mode 100644 ParserTools/ParserTools/GoldParser/SR.cs delete mode 100644 ParserTools/ParserTools/GoldParser/SourceLineReadCallback.cs delete mode 100644 ParserTools/ParserTools/GoldParser/Symbol.cs delete mode 100644 ParserTools/ParserTools/GoldParser/SymbolType.cs diff --git a/ParserTools/ParserTools.csproj b/ParserTools/ParserTools.csproj index 91744a9ce..49dba70aa 100644 --- a/ParserTools/ParserTools.csproj +++ b/ParserTools/ParserTools.csproj @@ -70,20 +70,6 @@ - - - - - - - - - - - - - - diff --git a/ParserTools/ParserTools/Errors.cs b/ParserTools/ParserTools/Errors.cs index 7f2d87001..1ed1fa0de 100644 --- a/ParserTools/ParserTools/Errors.cs +++ b/ParserTools/ParserTools/Errors.cs @@ -46,16 +46,6 @@ namespace PascalABCCompiler.Errors { } } - public class TokenReadError : SyntaxError - { - public TokenReadError(PascalABCCompiler.ParserTools.GPBParser parser) - : base(string.Format(ParserErrorsStringResources.Get("UNEXPECTED_SYMBOL{0}"), parser.LRParser.TokenText!="" ? parser.LRParser.TokenText : "(EOF)"), - parser.current_file_name, - parser.parsertools.GetTokenSourceContext(parser.LRParser), - (syntax_tree_node)parser.prev_node) - { - } - } public class BadExpr : SyntaxError { public BadExpr(string _file_name, SourceContext _source_context, syntax_tree_node _node) @@ -63,17 +53,6 @@ namespace PascalABCCompiler.Errors { } } - - - - public class UnexpectedToken : SyntaxError - { - public UnexpectedToken(PascalABCCompiler.ParserTools.GPBParser parser,string ExpectedTokens) - : base(string.Format(ParserErrorsStringResources.Get("EXPECTED{0}"), ExpectedTokens), - parser.current_file_name, parser.parsertools.GetTokenSourceContext(parser.LRParser), (syntax_tree_node)parser.prev_node) - { - } - } public class TooBigCharNumberInSharpCharConstant: SyntaxError { public TooBigCharNumberInSharpCharConstant(string _file_name, SourceContext _source_context, syntax_tree_node _node) diff --git a/ParserTools/ParserTools/GPBParserTools.cs b/ParserTools/ParserTools/GPBParserTools.cs deleted file mode 100644 index 94effb695..000000000 --- a/ParserTools/ParserTools/GPBParserTools.cs +++ /dev/null @@ -1,433 +0,0 @@ -// Copyright (c) Ivan Bondarev, Stanislav Mihalkovich (for details please see \doc\copyright.txt) -// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -using System; -using System.Text; -using System.Collections.Generic; -//using com.calitha.goldparser; -using System.Runtime.Serialization; -using PascalABCCompiler.SyntaxTree; -using PascalABCCompiler.Errors; -using System.IO; -using GoldParser; - -namespace PascalABCCompiler.ParserTools -{ - public class GPBParser // Странный класс, не являющийся парсером, а служащий для передачи информации. Состоит из двух частей: ссылок на парсер и грамматику и информации для передачи - { - public Parser LRParser; - public Grammar LanguageGrammar; - public List errors; - public string current_file_name; - public int max_errors = 10; - public object prev_node = null; - public parser_tools parsertools; - public List CompilerDirectives; - - public GPBParser(Stream stream) - { - LRParser = null; - LanguageGrammar = new GoldParser.Grammar(new BinaryReader(stream)); - } - - public GPBParser(GoldParser.Grammar grammar) - { - LRParser = null; - LanguageGrammar = grammar; - } - - public GPBParser() - { - LRParser = null; - LanguageGrammar = null; - } - } - - [Serializable()] - public class SymbolException : System.Exception - { - public SymbolException(string message) : base(message) - { - } - - public SymbolException(string message, - Exception inner) : base(message, inner) - { - } - - protected SymbolException(SerializationInfo info, - StreamingContext context) : base(info, context) - { - } - - } - - [Serializable()] - public class RuleException : System.Exception - { - - public RuleException(string message) : base(message) - { - } - - public RuleException(string message, - Exception inner) : base(message, inner) - { - } - - protected RuleException(SerializationInfo info, - StreamingContext context) : base(info, context) - { - } - - } - public class parser_tools - { - private const int max_char_const=0xFFFF; - - public int LineCorrection = 0; - public GoldParser.Parser parser; // Ужас - два разных парсера! SSM 19.01.12 - - public virtual void check_comment_text(GPBParser parser) - { - - } - - public virtual SourceContext GetTokenSourceContext() - { - int LineNum = parser.TokenLineNumber + LineCorrection; - return new SourceContext(LineNum, parser.TokenLinePosition, LineNum, parser.TokenLinePosition + parser.TokenLength - 1, parser.TokenCharPosition, parser.TokenCharPosition + parser.TokenLength); - } - - public virtual SourceContext GetTokenSourceContext(GoldParser.Parser parser) - { - int LineNum = parser.TokenLineNumber + LineCorrection; - return new SourceContext(LineNum, parser.TokenLinePosition, LineNum, parser.TokenLinePosition + parser.TokenLength - 1, parser.TokenCharPosition, parser.TokenCharPosition + parser.TokenLength); - } - - /*public virtual string terminal_token_to_string(TerminalToken token) - { - string name=symbol_to_string(token.Symbol); - if (name!=null) return name; - if (token.UserObject!=null) - { - if (token.UserObject is token_info) return ((token_info)token.UserObject).text; - return token.UserObject.ToString(); - } - - return token.Text; - } */ - - public virtual List GetPrioritySymbols(Symbol[] Symbols) - { - List res = new List(); - int maxp = -1, p; - foreach (Symbol symbol in Symbols) - { - p = symbol_priority(symbol); - if (p > maxp) maxp = p; - } - foreach (Symbol symbol in Symbols) - if (symbol_priority(symbol) == maxp) - res.Add(symbol); - return res; - } - - public string[] SymbolsToStrings(Symbol[] Symbols) - { - string[] res = new string[Symbols.Length>0?1:0]; - for (int i = 0; i < res.Length; i++) - res[i] = symbol_to_string(Symbols[i]); - return res; - } - - public virtual string symbol_collection_to_string(Symbol[] Symbols) - { - return PascalABCCompiler.FormatTools.ObjectsToString(SymbolsToStrings(GetPrioritySymbols(Symbols).ToArray()), ","); - } - - public virtual string symbol_to_string(Symbol symbol) - { - return null; - } - - public virtual int symbol_priority(Symbol symbol) - { - return 0; - } - - public virtual ident create_directive_name(GPBParser parser) - { - return create_directive_name(parser.LRParser.TokenString, GetTokenSourceContext(parser.LRParser)); - } - - public virtual ident create_directive_name(string text, SourceContext sc) - { - ident dn = new ident(new string(text.ToCharArray(1, text.Length - 1))); - dn.source_context = sc; - return dn; - } - - public virtual string ReplaceSpecialSymbols(string text) - { - text = text.Replace("''", "'"); - return text; - } - - public virtual char_const create_char_const(GPBParser parser) - { - return create_char_const(parser.LRParser.TokenString,GetTokenSourceContext(parser.LRParser)); - } - - public char_const create_char_const(string text, SourceContext sc) - { - string char_text = new string(text.ToCharArray(1, text.Length - 2)); - char_text = ReplaceSpecialSymbols(char_text); - char_const ct = new char_const(); - ct.source_context = sc; - if (char_text.Length == 1) - { - ct.cconst = char_text[0]; - return ct; - } - return null; - } - - public virtual sharp_char_const create_sharp_char_const(GPBParser parser) - { - string text = parser.LRParser.TokenString; - string int_text = new string(text.ToCharArray(1, text.Length - 1)); - SourceContext sc = GetTokenSourceContext(parser.LRParser);//create_source_context(token); - sharp_char_const scc = null; - int val = 0; - if (int.TryParse(int_text, out val)) - { - if (val > max_char_const) - { - scc = new sharp_char_const(0); - parser.errors.Add(new TooBigCharNumberInSharpCharConstant(parser.current_file_name, sc, scc)); - } - else - scc = new sharp_char_const(val); - scc.source_context = sc; - } - else - { - parser.errors.Add(new TooBigCharNumberInSharpCharConstant(parser.current_file_name, sc, scc)); - } - return scc; - } - - public virtual const_node create_double_const(GPBParser parser) - { - const_node cn=null; - SourceContext sc = GetTokenSourceContext(parser.LRParser); - try - { - System.Globalization.NumberFormatInfo sgnfi=new System.Globalization.NumberFormatInfo(); - sgnfi.NumberDecimalSeparator="."; - double val=double.Parse(parser.LRParser.TokenString,sgnfi); - cn=new double_const(val); - cn.source_context=sc; - } - catch(Exception) - { - parser.errors.Add(new BadFloat(parser.current_file_name,sc,(syntax_tree_node)parser.prev_node)); - } - return cn; - } - - public virtual const_node create_int_const(GPBParser parser) - { - return create_int_const(parser, System.Globalization.NumberStyles.Integer); - } - - public virtual const_node create_hex_const(GPBParser parser) - { - return create_int_const(parser, System.Globalization.NumberStyles.HexNumber); - } - - public virtual const_node create_int_const(GPBParser parser, System.Globalization.NumberStyles NumberStyles) - { - //таблица целых констант на уровне синтаксиса - // не может быть - 0 + - // 32--------16----8----|----8----16--------32----------------64(bits) - // [ int64 )[ int32 ]( int64 ]( uint64 ] - string text = parser.LRParser.TokenString; - if (NumberStyles == System.Globalization.NumberStyles.HexNumber) - text = text.Substring(1); - const_node cn=new int32_const(); - SourceContext sc = GetTokenSourceContext(parser.LRParser);//create_source_context(token); - if (text.Length < 8) - (cn as int32_const).val = Int32.Parse(text, NumberStyles); - else - { - try - { - UInt64 uint64 = UInt64.Parse(text, NumberStyles); - if (uint64 <= Int32.MaxValue) - (cn as int32_const).val = (Int32)uint64; - else - if (uint64 <= Int64.MaxValue) - cn = new int64_const((Int64)uint64); - else - cn = new uint64_const(uint64); - } - catch (Exception) - { - if(NumberStyles == System.Globalization.NumberStyles.HexNumber) - parser.errors.Add(new BadHex(parser.current_file_name, sc, (syntax_tree_node)parser.prev_node)); - else - parser.errors.Add(new BadInt(parser.current_file_name, sc, (syntax_tree_node)parser.prev_node)); - } - } - cn.source_context = sc; - return cn; - } - - public virtual ident create_ident(GPBParser parser) - { - string text = parser.LRParser.TokenString; - if (text.IndexOf('&') == 0) - text = text.Substring(1); - ident id = new ident(text); - id.source_context = GetTokenSourceContext(parser.LRParser); - return id; - } - - public procedure_attributes_list AddModifier(procedure_attributes_list proc_list, SyntaxTree.proc_attribute modif) - { - if (proc_list == null) - proc_list = new procedure_attributes_list(); - foreach (procedure_attribute attr in proc_list.proc_attributes) - if (attr.attribute_type == modif) - return proc_list; - proc_list.proc_attributes.Add(new procedure_attribute(modif)); - return proc_list; - } - - public virtual literal create_string_const(GPBParser parser) - { - literal lt; - string text = parser.LRParser.TokenString; - if (text.Length==3 && text[0]=='\'' && text[2]=='\'') - { - lt=new char_const(text[1]); - lt.source_context = GetTokenSourceContext(parser.LRParser);//create_source_context(token); - return lt; - } - text = ReplaceSpecialSymbols(text.Substring(1, text.Length - 2)); - lt=new string_const(text); - lt.source_context = GetTokenSourceContext(parser.LRParser);//create_source_context(token); - return lt; - - } - - /*public SourceContext create_source_context(com.calitha.goldparser.TerminalToken token) - { - return new SourceContext(token.Location.LineNr+1,token.Location.ColumnNr+1,token.Location.LineNr+1,token.Location.ColumnNr+token.Text.Length); - } - public file_position create_file_position(com.calitha.goldparser.TerminalToken token) - { - return new file_position(token.Location.LineNr+1,token.Location.ColumnNr+1); - }*/ - - public void create_source_context(object to,object left,object right) - { - if (to != null) - ((syntax_tree_node)to).source_context = get_source_context(left, right); - } - - public SourceContext get_source_context(object left, object right) - { - //debug - /*if (left == null && right!=null) - { - Console.WriteLine("\n\rerror: left is null(create_source_context)!\n\r"); - Console.WriteLine(((syntax_tree_node)right).source_context.ToString()); - } - if (right == null && left!=null) - { - Console.WriteLine("\n\rerror: right is null(create_source_context)!\n\r"); - Console.WriteLine(((syntax_tree_node)left).source_context.ToString()); - } - if (((syntax_tree_node)left).source_context == null) - { - Console.WriteLine("\n\rerror: source_context is null!(left)\n\r"); - return null; - } - if (((syntax_tree_node)right).source_context == null) - { - Console.WriteLine("\n\rerror: source_context is null!(right)\n\r"); - return null; - } - */ - if ((left == null) || (right == null) || (((syntax_tree_node)left).source_context == null) || (((syntax_tree_node)right).source_context == null)) - return null; - return new SourceContext(((syntax_tree_node)left).source_context, ((syntax_tree_node)right).source_context); - } - - public void create_source_context_left(object to, object left) - { - file_position fp=((syntax_tree_node)left).source_context.begin_position; - ((syntax_tree_node)to).source_context = new SourceContext(fp.line_num,fp.column_num,fp.line_num,fp.column_num,0,0); - } - - public void create_source_context_right(object to, object right) - { - file_position fp = ((syntax_tree_node)right).source_context.end_position; - ((syntax_tree_node)to).source_context = new SourceContext(fp.line_num, fp.column_num, fp.line_num, fp.column_num, 0, 0); - } - - public object sc_not_null(object o1, object o2) - { - if (o1 != null) - if (((syntax_tree_node)o1).source_context != null) return o1; - return o2; - } - - public object sc_not_null(object o1, object o2,object o3) - { - if (o1 != null) - if (((syntax_tree_node)o1).source_context != null) return o1; - if (o2 != null) - if (((syntax_tree_node)o2).source_context != null) return o2; - return o3; - } - - public object sc_not_null(params object[] arr) - { - foreach(object o in arr) - if (o!=null) - if (((syntax_tree_node)o).source_context!=null) return o; - return null; - } - - public void assign_source_context(object to,object from) - { - //debug - //if (((tree_node)from).source_context==null) Console.WriteLine("\n\rerror: from sc is null(assign_source_context)!\n\r"); - ((syntax_tree_node)to).source_context=((syntax_tree_node)from).source_context; - } - - /*public SourceContext create_source_context(Token[] tokens) - { - object right=null,left=null; - for(int i=0;i - /// State in the Deterministic Finite Automata - /// which is used by the tokenizer. - /// - public class DfaState - { - private int m_index; - internal Symbol m_acceptSymbol; - internal ObjectMap m_transitionVector; - - /// - /// Creates a new instance of the DfaState class. - /// - /// Index in the DFA state table. - /// Symbol to accept. - /// Transition vector. - public DfaState(int index, Symbol acceptSymbol, ObjectMap transitionVector) - { - m_index = index; - m_acceptSymbol = acceptSymbol; - m_transitionVector = transitionVector; - } - - /// - /// Gets index of the state in DFA state table. - /// - public int Index - { - get { return m_index; } - } - - /// - /// Gets the symbol which can be accepted in this DFA state. - /// - public Symbol AcceptSymbol - { - get { return m_acceptSymbol; } - } - } -} diff --git a/ParserTools/ParserTools/GoldParser/Grammar.cs b/ParserTools/ParserTools/GoldParser/Grammar.cs deleted file mode 100644 index c6edeb07f..000000000 --- a/ParserTools/ParserTools/GoldParser/Grammar.cs +++ /dev/null @@ -1,624 +0,0 @@ -//#define STRONG_CGT_CHECK - -#region Copyright - -//---------------------------------------------------------------------- -// Gold Parser engine. -// See more details on http://www.devincook.com/goldparser/ -// -// Original code is written in VB by Devin Cook (GOLDParser@DevinCook.com) -// -// This translation is done by Vladimir Morozov (vmoroz@hotmail.com) -// -// The translation is based on the other engine translations: -// Delphi engine by Alexandre Rai (riccio@gmx.at) -// C# engine by Marcus Klimstra (klimstra@home.nl) -//---------------------------------------------------------------------- - -#endregion - -#region Using directives - -using System; -using System.IO; -using System.Text; -using System.Collections; - -#endregion - -namespace GoldParser -{ - /// - /// Contains grammar tables required for parsing. - /// - public class Grammar - { - #region Fields and constants - - /// - /// Identifies Gold parser grammar file. - /// - public const string FileHeader = "GOLD Parser Tables/v1.0"; - - // Grammar header information - private string m_name; // Name of the grammar - private string m_version; // Version of the grammar - private string m_author; // Author of the grammar - private string m_about; // Grammar description - private int m_startSymbolIndex; // Start symbol index - private bool m_caseSensitive; // Grammar is case sensitive or not - - // Tables read from the binary grammar file - internal Symbol[] m_symbolTable; // Symbol table - private String[] m_charSetTable; // Charset table - internal Rule[] m_ruleTable; // Rule table - internal DfaState[] m_dfaStateTable; // DFA state table - internal LRState[] m_lrStateTable; // LR state table - - // Initial states - internal int m_dfaInitialStateIndex; // DFA initial state index - internal DfaState m_dfaInitialState; // DFA initial state - internal int m_lrInitialState; // LR initial state - - // Internal state of grammar parser - private BinaryReader m_reader; // Source of the grammar - private int m_entryCount; // Number of entries left - - internal Symbol m_errorSymbol; - internal Symbol m_endSymbol; - - #endregion - - #region Constructors - - /// - /// Creates a new instance of Grammar class - /// - /// - public Grammar(BinaryReader reader) - { - if (reader == null) - { - throw new ArgumentNullException("reader"); - } - - m_reader = reader; - Load(); - } - - #endregion - - #region Public members - - /// - /// Gets grammar name. - /// - public string Name - { - get { return m_name; } - } - - /// - /// Gets grammar version. - /// - public string Version - { - get { return m_version; } - } - - /// - /// Gets grammar author. - /// - public string Author - { - get { return m_author; } - } - - /// - /// Gets grammar description. - /// - public string About - { - get { return m_about; } - } - - /// - /// Gets the start symbol for the grammar. - /// - public Symbol StartSymbol - { - get { return m_symbolTable[m_startSymbolIndex]; } - } - - /// - /// Gets the value indicating if the grammar is case sensitive. - /// - public bool CaseSensitive - { - get { return m_caseSensitive; } - } - - /// - /// Gets initial DFA state. - /// - public DfaState DfaInitialState - { - get { return m_dfaInitialState; } - } - - /// - /// Gets initial LR state. - /// - public LRState InitialLRState - { - get { return m_lrStateTable[m_lrInitialState]; } - } - - /// - /// Gets a special symbol to designate last token in the input stream. - /// - public Symbol EndSymbol - { - get { return m_endSymbol; } - } - - #endregion - - #region Private members - - /// - /// Loads grammar from the binary reader. - /// - private void Load() - { - if (FileHeader != ReadString()) - { - throw new FileLoadException(SR.GetString(SR.Grammar_WrongFileHeader)); - } - while (m_reader.PeekChar() != -1) - { - RecordType recordType = ReadNextRecord(); - switch (recordType) - { - case RecordType.Parameters: - ReadHeader(); - break; - - case RecordType.TableCounts: - ReadTableCounts(); - break; - - case RecordType.Initial: - ReadInitialStates(); - break; - - case RecordType.Symbols: - ReadSymbols(); - break; - - case RecordType.CharSets: - ReadCharSets(); - break; - - case RecordType.Rules: - ReadRules(); - break; - - case RecordType.DfaStates: - ReadDfaStates(); - break; - - case RecordType.LRStates: - ReadLRStates(); - break; - - default: - throw new FileLoadException(SR.GetString(SR.Grammar_InvalidRecordType)); - } - } - m_dfaInitialState = m_dfaStateTable[m_dfaInitialStateIndex]; - OptimizeDfaTransitionVectors(); - } - - /// - /// Reads the next record in the binary grammar file. - /// - /// Read record type. - private RecordType ReadNextRecord() - { - char recordType = (char) ReadByte(); - //Structure below is ready for future expansion - switch (recordType) - { - case 'M': - //Read the number of entry's - m_entryCount = ReadInt16(); - return (RecordType) ReadByteEntry(); - - default: - throw new FileLoadException(SR.GetString(SR.Grammar_InvalidRecordHeader)); - } - } - - /// - /// Reads grammar header information. - /// - private void ReadHeader() - { - m_name = ReadStringEntry(); - m_version = ReadStringEntry(); - m_author = ReadStringEntry(); - m_about = ReadStringEntry(); - m_caseSensitive = ReadBoolEntry(); - m_startSymbolIndex = ReadInt16Entry(); - } - - /// - /// Reads table record counts and initializes tables. - /// - private void ReadTableCounts() - { - // Initialize tables - m_symbolTable = new Symbol [ReadInt16Entry()]; - m_charSetTable = new String [ReadInt16Entry()]; - m_ruleTable = new Rule [ReadInt16Entry()]; - m_dfaStateTable = new DfaState [ReadInt16Entry()]; - m_lrStateTable = new LRState [ReadInt16Entry()]; - } - - /// - /// Read initial DFA and LR states. - /// - private void ReadInitialStates() - { - m_dfaInitialStateIndex = ReadInt16Entry(); - m_lrInitialState = ReadInt16Entry(); - } - - /// - /// Read symbol information. - /// - private void ReadSymbols() - { - int index = ReadInt16Entry(); - string name = ReadStringEntry(); - SymbolType symbolType = (SymbolType) ReadInt16Entry(); - - Symbol symbol = new Symbol(index, name, symbolType); - switch (symbolType) - { - case SymbolType.Error: - m_errorSymbol = symbol; - break; - - case SymbolType.End: - m_endSymbol = symbol; - break; - } - m_symbolTable[index] = symbol; - } - - /// - /// Read char set information. - /// - private void ReadCharSets() - { - m_charSetTable[ReadInt16Entry()] = ReadStringEntry(); - } - - /// - /// Read rule information. - /// - private void ReadRules() - { - int index = ReadInt16Entry(); - Symbol nonTerminal = m_symbolTable[ReadInt16Entry()]; - ReadEmptyEntry(); - Symbol[] symbols = new Symbol[m_entryCount]; - for (int i = 0 ; i < symbols.Length; i++) - { - symbols[i] = m_symbolTable[ReadInt16Entry()]; - } - Rule rule = new Rule(index, nonTerminal, symbols); - m_ruleTable[index] = rule; - } - - /// - /// Read DFA state information. - /// - private void ReadDfaStates() - { - int index = ReadInt16Entry(); - Symbol acceptSymbol = null; - bool acceptState = ReadBoolEntry(); - if (acceptState) - { - acceptSymbol = m_symbolTable[ReadInt16Entry()]; - } - else - { - ReadInt16Entry(); // Skip the entry. - } - ReadEmptyEntry(); - - // Read DFA edges - DfaEdge[] edges = new DfaEdge[m_entryCount / 3]; - for (int i = 0; i < edges.Length; i++) - { - edges[i].CharSetIndex = ReadInt16Entry(); - edges[i].TargetIndex = ReadInt16Entry(); - ReadEmptyEntry(); - } - - // Create DFA state and store it in DFA state table - ObjectMap transitionVector = CreateDfaTransitionVector(edges); - DfaState dfaState = new DfaState(index, acceptSymbol, transitionVector); - m_dfaStateTable[index] = dfaState; - } - - /// - /// Read LR state information. - /// - private void ReadLRStates() - { - int index = ReadInt16Entry(); - ReadEmptyEntry(); - LRStateAction[] stateTable = new LRStateAction[m_entryCount / 4]; - for (int i = 0; i < stateTable.Length; i++) - { - Symbol symbol = m_symbolTable[ReadInt16Entry()]; - LRAction action = (LRAction) ReadInt16Entry(); - int targetIndex = ReadInt16Entry(); - ReadEmptyEntry(); - stateTable[i] = new LRStateAction(i, symbol, action, targetIndex); - } - - // Create the transition vector - LRStateAction[] transitionVector = new LRStateAction[m_symbolTable.Length]; - for (int i = 0; i < transitionVector.Length; i++) - { - transitionVector[i] = null; - } - for (int i = 0; i < stateTable.Length; i++) - { - transitionVector[stateTable[i].Symbol.Index] = stateTable[i]; - } - - LRState lrState = new LRState(index, stateTable, transitionVector); - m_lrStateTable[index] = lrState; - } - - /// - /// Creates the DFA state transition vector. - /// - /// Array of automata edges. - /// Hashtable with the transition information. - private ObjectMap CreateDfaTransitionVector(DfaEdge[] edges) - { - ObjectMap transitionVector = new ObjectMap(); - for (int i = edges.Length; --i >= 0;) - { - string charSet = m_charSetTable[edges[i].CharSetIndex]; - for (int j = 0; j < charSet.Length; j++) - { - transitionVector[charSet[j]] = edges[i].TargetIndex; - } - } - return transitionVector; - } - - /// - /// Reads empty entry from the grammar file. - /// - private void ReadEmptyEntry() - { -#if STRONG_CGT_CHECK - if (ReadEntryType() != EntryType.Empty) - { - throw new FileLoadException(SR.GetString(SR.Grammar_EmptyEntryExpected)); - } -#elif !STRONG_CGT_CHECK - m_reader.ReadByte(); -#endif - m_entryCount--; - } - - /// - /// Reads string entry from the grammar file. - /// - /// String entry content. - private string ReadStringEntry() - { -#if STRONG_CGT_CHECK - if (ReadEntryType() != EntryType.String) - { - throw new FileLoadException(SR.GetString(SR.Grammar_StringEntryExpected)); - } -#elif !STRONG_CGT_CHECK - m_reader.ReadByte(); -#endif - m_entryCount--; - return ReadString(); - } - - /// - /// Reads Int16 entry from the grammar file. - /// - /// Int16 entry content. - private int ReadInt16Entry() - { -#if STRONG_CGT_CHECK - if (ReadEntryType() != EntryType.Integer) - { - throw new FileLoadException(SR.GetString(SR.Grammar_IntegerEntryExpected)); - } -#elif !STRONG_CGT_CHECK - m_reader.ReadByte(); -#endif - m_entryCount--; - return ReadInt16(); - } - - /// - /// Reads byte entry from the grammar file. - /// - /// Byte entry content. - private byte ReadByteEntry() - { -#if STRONG_CGT_CHECK - if (ReadEntryType() != EntryType.Byte) - { - throw new FileLoadException(SR.GetString(SR.Grammar_ByteEntryExpected)); - } -#elif !STRONG_CGT_CHECK - m_reader.ReadByte(); -#endif - m_entryCount--; - return ReadByte(); - } - - /// - /// Reads boolean entry from the grammar file. - /// - /// Boolean entry content. - private bool ReadBoolEntry() - { -#if STRONG_CGT_CHECK - if (ReadEntryType() != EntryType.Boolean) - { - throw new FileLoadException(SR.GetString(SR.Grammar_BooleanEntryExpected)); - } -#elif !STRONG_CGT_CHECK - m_reader.ReadByte(); -#endif - m_entryCount--; - return ReadBool(); - } - - /// - /// Reads entry type. - /// - /// Entry type. - private EntryType ReadEntryType() - { - if (m_entryCount == 0) - { - throw new FileLoadException(SR.GetString(SR.Grammar_NoEntry)); - } - return (EntryType) ReadByte(); - } - - /// - /// Reads string from the grammar file. - /// - /// String value. - private string ReadString() - { - StringBuilder result = new StringBuilder(); - char unicodeChar = (char) ReadInt16(); - while (unicodeChar != (char) 0) - { - result.Append(unicodeChar); - unicodeChar = (char) ReadInt16(); - } - return result.ToString(); - } - - /// - /// Reads two byte integer Int16 from the grammar file. - /// - /// Int16 value. - private int ReadInt16() - { - return m_reader.ReadUInt16(); - } - - /// - /// Reads byte from the grammar file. - /// - /// Byte value. - private byte ReadByte() - { - return m_reader.ReadByte(); - } - - /// - /// Reads boolean from the grammar file. - /// - /// Boolean value. - private bool ReadBool() - { - return (ReadByte() == 1); - } - - private void OptimizeDfaTransitionVectors() - { - DfaState[] dfaStates = m_dfaStateTable; - foreach (DfaState state in dfaStates) - { - ObjectMap transitions = state.m_transitionVector; - for (int i = transitions.Count; --i >= 0;) - { - int key = transitions.GetKey(i); - object transition = transitions[key]; - if (transition != null) - { - int transitionIndex = (int) transition; - if (transitionIndex >= 0) - { - transitions[key] = dfaStates[transitionIndex]; - } - else - { - transitions[key] = null; - } - } - } - transitions.ReadOnly = true; - } - } - - #endregion - - #region Private type definitions - - /// - /// Record type byte in the binary grammar file. - /// - private enum RecordType - { - Parameters = (int) 'P', // 80 - TableCounts = (int) 'T', // 84 - Initial = (int) 'I', // 73 - Symbols = (int) 'S', // 83 - CharSets = (int) 'C', // 67 - Rules = (int) 'R', // 82 - DfaStates = (int) 'D', // 68 - LRStates = (int) 'L', // 76 - Comment = (int) '!' // 33 - } - - /// - /// Entry type byte in the binary grammar file. - /// - private enum EntryType - { - Empty = (int) 'E', // 69 - Integer = (int) 'I', // 73 - String = (int) 'S', // 83 - Boolean = (int) 'B', // 66 - Byte = (int) 'b' // 98 - } - - /// - /// Edge between DFA states. - /// - private struct DfaEdge - { - public int CharSetIndex; - public int TargetIndex; - } - - #endregion - } -} diff --git a/ParserTools/ParserTools/GoldParser/LRAction.cs b/ParserTools/ParserTools/GoldParser/LRAction.cs deleted file mode 100644 index c0fb43e02..000000000 --- a/ParserTools/ParserTools/GoldParser/LRAction.cs +++ /dev/null @@ -1,61 +0,0 @@ -#region Copyright - -//---------------------------------------------------------------------- -// Gold Parser engine. -// See more details on http://www.devincook.com/goldparser/ -// -// Original code is written in VB by Devin Cook (GOLDParser@DevinCook.com) -// -// This translation is done by Vladimir Morozov (vmoroz@hotmail.com) -// -// The translation is based on the other engine translations: -// Delphi engine by Alexandre Rai (riccio@gmx.at) -// C# engine by Marcus Klimstra (klimstra@home.nl) -//---------------------------------------------------------------------- - -#endregion - -#region Using directives - -using System; - -#endregion - -namespace GoldParser -{ - /// - /// LR parser action type. - /// - public enum LRAction - { - /// - /// No action. Not used. - /// - None = 0, - - /// - /// Shift a symbol and go to a state - /// - Shift = 1, - - /// - /// Reduce by a specified rule - /// - Reduce = 2, - - /// - /// Goto to a state on reduction - /// - Goto = 3, - - /// - /// Input successfully parsed - /// - Accept = 4, - - /// - /// Error - /// - Error = 5 - } -} diff --git a/ParserTools/ParserTools/GoldParser/LRState.cs b/ParserTools/ParserTools/GoldParser/LRState.cs deleted file mode 100644 index 153412f03..000000000 --- a/ParserTools/ParserTools/GoldParser/LRState.cs +++ /dev/null @@ -1,84 +0,0 @@ -#region Copyright - -//---------------------------------------------------------------------- -// Gold Parser engine. -// See more details on http://www.devincook.com/goldparser/ -// -// Original code is written in VB by Devin Cook (GOLDParser@DevinCook.com) -// -// This translation is done by Vladimir Morozov (vmoroz@hotmail.com) -// -// The translation is based on the other engine translations: -// Delphi engine by Alexandre Rai (riccio@gmx.at) -// C# engine by Marcus Klimstra (klimstra@home.nl) -//---------------------------------------------------------------------- - -#endregion - -#region Using directives - -using System; - -#endregion - -namespace GoldParser -{ - /// - /// State of LR parser. - /// - public class LRState - { - private int m_index; - private LRStateAction[] m_actions; - internal LRStateAction[] m_transitionVector; - - /// - /// Creates a new instance of the LRState class - /// - /// Index of the LR state in the LR state table. - /// List of all available LR actions in this state. - /// Transition vector which has symbol index as an index. - public LRState(int index, LRStateAction[] actions, LRStateAction[] transitionVector) - { - m_index = index; - m_actions = actions; - m_transitionVector = transitionVector; - } - - /// - /// Gets index of the LR state in LR state table. - /// - public int Index - { - get { return m_index; } - } - - /// - /// Gets LR state action count. - /// - public int ActionCount - { - get { return m_actions.Length; } - } - - /// - /// Returns state action by its index. - /// - /// State action index. - /// LR state action for the given index. - public LRStateAction GetAction(int index) - { - return m_actions[index]; - } - - /// - /// Returns LR state action by symbol index. - /// - /// Symbol Index to search for. - /// LR state action object. - public LRStateAction GetActionBySymbolIndex(int symbolIndex) - { - return m_transitionVector[symbolIndex]; - } - } -} diff --git a/ParserTools/ParserTools/GoldParser/LRStateAction.cs b/ParserTools/ParserTools/GoldParser/LRStateAction.cs deleted file mode 100644 index 3b7301ba6..000000000 --- a/ParserTools/ParserTools/GoldParser/LRStateAction.cs +++ /dev/null @@ -1,83 +0,0 @@ -#region Copyright - -//---------------------------------------------------------------------- -// Gold Parser engine. -// See more details on http://www.devincook.com/goldparser/ -// -// Original code is written in VB by Devin Cook (GOLDParser@DevinCook.com) -// -// This translation is done by Vladimir Morozov (vmoroz@hotmail.com) -// -// The translation is based on the other engine translations: -// Delphi engine by Alexandre Rai (riccio@gmx.at) -// C# engine by Marcus Klimstra (klimstra@home.nl) -//---------------------------------------------------------------------- - -#endregion - -#region Using directives - -using System; - -#endregion - -namespace GoldParser -{ - /// - /// Action in a LR State. - /// - public class LRStateAction - { - private int m_index; - private Symbol m_symbol; - private LRAction m_action; - internal int m_value; - - /// - /// Creats a new instance of the LRStateAction class. - /// - /// Index of the LR state action. - /// Symbol associated with the action. - /// Action type. - /// Action value. - public LRStateAction(int index, Symbol symbol, LRAction action, int value) - { - m_index = index; - m_symbol = symbol; - m_action = action; - m_value = value; - } - - /// - /// Gets index of the LR state action. - /// - public int Index - { - get { return m_index; } - } - - /// - /// Gets symbol associated with the LR state action. - /// - public Symbol Symbol - { - get { return m_symbol; } - } - - /// - /// Gets action type. - /// - public LRAction Action - { - get { return m_action; } - } - - /// - /// Gets the action value. - /// - public int Value - { - get { return m_value; } - } - } -} diff --git a/ParserTools/ParserTools/GoldParser/ObjectMap.cs b/ParserTools/ParserTools/GoldParser/ObjectMap.cs deleted file mode 100644 index 5b438bdb0..000000000 --- a/ParserTools/ParserTools/GoldParser/ObjectMap.cs +++ /dev/null @@ -1,448 +0,0 @@ -#region Copyright - -//---------------------------------------------------------------------- -// Gold Parser engine. -// See more details on http://www.devincook.com/goldparser/ -// -// Original code is written in VB by Devin Cook (GOLDParser@DevinCook.com) -// -// This translation is done by Vladimir Morozov (vmoroz@hotmail.com) -// -// The translation is based on the other engine translations: -// Delphi engine by Alexandre Rai (riccio@gmx.at) -// C# engine by Marcus Klimstra (klimstra@home.nl) -//---------------------------------------------------------------------- - -#endregion - -#region Using directives - -using System; - -#endregion - -namespace GoldParser -{ - /// - /// Maps integer values used for transition vectors to objects. - /// - public class ObjectMap - { - #region Fields - - private bool m_readonly; - private MapProvider m_mapProvider; - - private const int MAXINDEX = 255; - private const int GROWTH = 32; - private const int MINSIZE = 32; - private const int MAXARRAYCOUNT = 12; - - private const int INVALIDKEY = Int32.MaxValue; - - #endregion - - #region Constructors - - /// - /// Creates new instance of class. - /// - public ObjectMap() - { - m_mapProvider = new SortedMapProvider(MINSIZE); - } - - #endregion - - #region Public members. - - /// - /// Gets number of entries in the map. - /// - public int Count - { - get { return m_mapProvider.m_count; } - } - - /// - /// Gets or sets read only flag. - /// - public bool ReadOnly - { - get { return m_readonly; } - set - { - if (m_readonly != value) - { - SetMapProvider(value); - m_readonly = value; - } - } - } - - /// - /// Gets or sets value by key. - /// - public object this[int key] - { - get { return m_mapProvider[key]; } - set { m_mapProvider.Add(key, value); } - } - - /// - /// Returns key by index. - /// - /// Zero based index of the requested key. - /// Returns key for the given index. - public int GetKey(int index) - { - return m_mapProvider.GetEntry(index).Key; - } - - /// - /// Removes entry by its key. - /// - /// - public void Remove(int key) - { - m_mapProvider.Remove(key); - } - - /// - /// Adds a new key and value pair. - /// If key exists then value is applied to existing key. - /// - /// New key to add. - /// Value for the key. - public void Add(int key, object value) - { - m_mapProvider.Add(key, value); - } - - #endregion - - #region Private members - - private void SetMapProvider(bool readOnly) - { - int count = m_mapProvider.m_count; - MapProvider provider = m_mapProvider; - if (readOnly) - { - SortedMapProvider pr = m_mapProvider as SortedMapProvider; - if (pr.m_lastKey <= MAXINDEX) - { - provider = new IndexMapProvider(); - } - else if (count <= MAXARRAYCOUNT) - { - provider = new ArrayMapProvider(m_mapProvider.m_count); - } - } - else - { - if (! (provider is SortedMapProvider)) - { - provider = new SortedMapProvider(m_mapProvider.m_count); - } - } - if (provider != m_mapProvider) - { - for (int i = 0; i < count; i++) - { - Entry entry = m_mapProvider.GetEntry(i); - provider.Add(entry.Key, entry.Value); - } - m_mapProvider = provider; - } - } - - #endregion - - #region Entry struct definition - - private struct Entry - { - internal int Key; - internal object Value; - - internal Entry(int key, object value) - { - Key = key; - Value = value; - } - } - - #endregion - - private abstract class MapProvider - { - internal int m_count; // Entry count in the collection. - - internal abstract object this[int key] - { - get; - } - - internal abstract Entry GetEntry(int index); - - internal abstract void Add(int key, object value); - - internal virtual void Remove(int key) - { - throw new InvalidOperationException(); - } - } - - private class SortedMapProvider : MapProvider - { - internal Entry[] m_entries; // Array of entries. - - internal int m_lastKey; // Bigest key number. - - internal SortedMapProvider(int capacity) - { - m_entries = new Entry[capacity]; - } - - internal override object this[int key] - { - get - { - int minIndex = 0; - int maxIndex = m_count - 1; - if (maxIndex >= 0 && key <= m_lastKey) - { - do - { - int midIndex = (maxIndex + minIndex) / 2; - if (key <= m_entries[midIndex].Key) - { - maxIndex = midIndex; - } - else - { - minIndex = midIndex + 1; - } - } while (minIndex < maxIndex); - if (key == m_entries[minIndex].Key) - { - return m_entries[minIndex].Value; - } - } - return null; - } - } - - internal override Entry GetEntry(int index) - { - return m_entries[index]; - } - - internal override void Add(int key, object value) - { - bool found; - int index = FindInsertIndex(key, out found); - if (found) - { - m_entries[index].Value = value; - return; - } - if (m_count >= m_entries.Length) - { - Entry[] entries = new Entry[m_entries.Length + GROWTH]; - Array.Copy(m_entries, 0, entries, 0, m_entries.Length); - m_entries = entries; - } - if (index < m_count) - { - Array.Copy(m_entries, index, m_entries, index + 1, m_count - index); - } - else - { - m_lastKey = key; - } - m_entries[index].Key = key; - m_entries[index].Value = value; - m_count++; - } - - internal override void Remove(int key) - { - int index = FindIndex(key); - if (index >= 0) - { - int tailSize = (m_count - 1) - index; - if (tailSize > 0) - { - Array.Copy(m_entries, index + 1, m_entries, index, tailSize); - } - else if (m_count > 1) - { - m_lastKey = m_entries[m_count - 2].Key; - } - else - { - m_lastKey = INVALIDKEY; - } - m_count--; - m_entries[m_count].Key = INVALIDKEY; - m_entries[m_count].Value = null; - } - } - - private int FindIndex(int key) - { - int minIndex = 0; - if (m_count > 0 && key <= m_lastKey) - { - int maxIndex = m_count - 1; - do - { - int midIndex = (maxIndex + minIndex) / 2; - if (key <= m_entries[midIndex].Key) - { - maxIndex = midIndex; - } - else - { - minIndex = midIndex + 1; - } - } while (minIndex < maxIndex); - if (key == m_entries[minIndex].Key) - { - return minIndex; - } - } - return -1; - } - - private int FindInsertIndex(int key, out bool found) - { - int minIndex = 0; - if (m_count > 0 && key <= m_lastKey) - { - int maxIndex = m_count - 1; - do - { - int midIndex = (maxIndex + minIndex) / 2; - if (key <= m_entries[midIndex].Key) - { - maxIndex = midIndex; - } - else - { - minIndex = midIndex + 1; - } - } while (minIndex < maxIndex); - found = (key == m_entries[minIndex].Key); - return minIndex; - } - found = false; - return m_count; - } - } - - private class IndexMapProvider : MapProvider - { - private object[] m_array; // Array of entries. - - internal IndexMapProvider() - { - m_array = new object[MAXINDEX + 1]; - for (int i = m_array.Length; --i >= 0; ) - { - m_array[i] = Unassigned.Value; - } - } - - internal override object this[int key] - { - get - { - if (key >= m_array.Length || key < 0) - { - return null; - } - return m_array[key]; - } - } - - internal override Entry GetEntry(int index) - { - int idx = -1; - for (int i = 0; i < m_array.Length; i++) - { - object value = m_array[i]; - if (value != Unassigned.Value) - { - idx++; - } - if (idx == index) - { - return new Entry(i, value); - } - } - return new Entry(); - } - - internal override void Add(int key, object value) - { - m_array[key] = value; - m_count++; - } - } - - private class ArrayMapProvider : MapProvider - { - private Entry[] m_entries; // Array of entries. - - internal ArrayMapProvider(int capacity) - { - m_entries = new Entry[capacity]; - } - - internal override object this[int key] - { - get - { - for (int i = m_count; --i >= 0;) - { - Entry entry = m_entries[i]; - int entryKey = entry.Key; - if (entryKey < key) - { - continue; - } - else if (entryKey == key) - { - return entry.Value; - } - else if (entryKey > key) - { - return null; - } - } - return null; - } - } - - internal override Entry GetEntry(int index) - { - return m_entries[index]; - } - - internal override void Add(int key, object value) - { - m_entries[m_count].Key = key; - m_entries[m_count].Value = value; - m_count++; - } - } - - private class Unassigned - { - internal static Unassigned Value = new Unassigned(); - } - } -} diff --git a/ParserTools/ParserTools/GoldParser/ParseMessage.cs b/ParserTools/ParserTools/GoldParser/ParseMessage.cs deleted file mode 100644 index db4ec33e8..000000000 --- a/ParserTools/ParserTools/GoldParser/ParseMessage.cs +++ /dev/null @@ -1,108 +0,0 @@ -#region Copyright - -//---------------------------------------------------------------------- -// Gold Parser engine. -// See more details on http://www.devincook.com/goldparser/ -// -// Original code is written in VB by Devin Cook (GOLDParser@DevinCook.com) -// -// This translation is done by Vladimir Morozov (vmoroz@hotmail.com) -// -// The translation is based on the other engine translations: -// Delphi engine by Alexandre Rai (riccio@gmx.at) -// C# engine by Marcus Klimstra (klimstra@home.nl) -//---------------------------------------------------------------------- - -#endregion - -#region Using directives - -using System; - -#endregion - -namespace GoldParser -{ - /// - /// Available parse messages. - /// - public enum ParseMessage - { - /// - /// Nothing - /// - Empty = 0, - - /// - /// Each time a token is read, this message is generated. - /// - TokenRead = 1, - - /// - /// When the engine is able to reduce a rule, - /// this message is returned. The rule that was - /// reduced is set in the GOLDParser's ReduceRule property. - /// The tokens that are reduced and correspond the - /// rule's definition are stored in the Tokens() property. - /// - Reduction = 2, - - /// - /// The engine will returns this message when the source - /// text has been accepted as both complete and correct. - /// In other words, the source text was successfully analyzed. - /// - Accept = 3, - - /// - /// Before any parsing can take place, - /// a Compiled Grammar Table file must be loaded. - /// - NotLoadedError = 4, - - /// - /// The tokenizer will generate this message when - /// it is unable to recognize a series of characters - /// as a valid token. To recover, pop the invalid - /// token from the input queue. - /// - LexicalError = 5, - - /// - /// Often the parser will read a token that is not expected - /// in the grammar. When this happens, the Tokens() property - /// is filled with tokens the parsing engine expected to read. - /// To recover: push one of the expected tokens on the input queue. - /// - SyntaxError = 6, - - /// - /// The parser reached the end of the file while reading a comment. - /// This is caused when the source text contains a "run-away" - /// comment, or in other words, a block comment that lacks the - /// delimiter. - /// - CommentError = 7, - - /// - /// Something is wrong, very wrong. - /// - InternalError = 8, - - /// - /// A block comment is complete. - /// When this message is returned, the content of the CurrentComment - /// property is set to the comment text. The text includes starting and ending - /// block comment characters. - /// - CommentBlockRead = 9, - - /// - /// Line comment is read. - /// When this message is returned, the content of the CurrentComment - /// property is set to the comment text. The text includes starting - /// line comment characters. - /// - CommentLineRead = 10, - } -} diff --git a/ParserTools/ParserTools/GoldParser/Parser.cs b/ParserTools/ParserTools/GoldParser/Parser.cs deleted file mode 100644 index 61e9006ba..000000000 --- a/ParserTools/ParserTools/GoldParser/Parser.cs +++ /dev/null @@ -1,1074 +0,0 @@ -#region Copyright - -//---------------------------------------------------------------------- -// Gold Parser engine. -// See more details on http://www.devincook.com/goldparser/ -// -// Original code is written in VB by Devin Cook (GOLDParser@DevinCook.com) -// -// This translation is done by Vladimir Morozov (vmoroz@hotmail.com) -// -// The translation is based on the other engine translations: -// Delphi engine by Alexandre Rai (riccio@gmx.at) -// C# engine by Marcus Klimstra (klimstra@home.nl) -//---------------------------------------------------------------------- - -#endregion - -#region Using directives - -using System; -using System.IO; -using System.Text; -using System.Collections; -using System.Collections.Generic; - -#endregion - - -namespace GoldParser -{ - public class UnexpectedEOFinParseCommentBlock : Exception - { - } - /// - /// Pull parser which uses Grammar table to parser input stream. - /// - public sealed class Parser - { - #region Fields - - public Dictionary SepecialSymbolPrefixDirection = new Dictionary(); - //public char InsertSepecialSymbol = '\0'; - - private Grammar m_grammar; // Grammar of parsed language. - private bool m_trimReductions = true; // Allowes to minimize reduction tree. - - private TextReader m_textReader; // Data to parse. - private char[] m_buffer; // Buffer to keep current characters. - private int m_bufferSize; // Size of the buffer. - private int m_bufferStartIndex; // Absolute position of buffered first character. - private int m_charIndex; // Index of character in the buffer. - private int m_preserveChars; // Number of characters to preserve when buffer is refilled. - private int m_lineStart; // Relative position of line start to the buffer beginning. - private int m_lineLength; // Length of current source line. - private int m_lineNumber = 1; // Current line number. - private int m_commentLevel; // Keeps stack level for embedded comments - private StringBuilder m_commentText; // Current comment text. - - private SourceLineReadCallback m_sourceLineReadCallback; // Called when line reading finished. - - private Token m_token; // Current token - private Token[] m_inputTokens; // Stack of input tokens. - private int m_inputTokenCount; // How many tokens in the input. - - private LRStackItem[] m_lrStack; // Stack of LR states used for LR parsing. - private int m_lrStackIndex; // Index of current LR state in the LR parsing stack. - private LRState m_lrState; // Current LR state. - private int m_reductionCount; // Number of items in reduction. It is Undefined if no reducton available. - private Symbol[] m_expectedTokens; // What tokens are expected in case of error? - private Symbol[] m_expectedNonTerminalTokens; // What tokens are expected in case of error? - - private const int MinimumBufferSize = 4096; // Minimum size of char buffer. - private const char EndOfString = (char) 0; // Designates last string terminator. - private const int MinimumInputTokenCount = 2; // Minimum input token stack size. - private const int MinimumLRStackSize = 256; // Minimum size of reduction stack. - private const int Undefined = -1; // Used for undefined int values. - - #endregion - - #region Constructors - - /// - /// Initializes new instance of Parser class. - /// - /// TextReader instance to read data from. - /// Grammar with parsing tables to parser input stream. - public Parser(TextReader textReader, Grammar grammar) - { - if (textReader == null) - { - throw new ArgumentNullException("textReader"); - } - if (grammar == null) - { - throw new ArgumentNullException("grammar"); - } - - m_textReader = textReader; - m_bufferSize = MinimumBufferSize; - m_buffer = new char[m_bufferSize + 1]; - m_lineLength = Undefined; - ReadBuffer(); - - m_inputTokens = new Token[MinimumInputTokenCount]; - m_lrStack = new LRStackItem[MinimumLRStackSize]; - - m_grammar = grammar; - - // Put grammar start symbol into LR parsing stack. - m_lrState = m_grammar.InitialLRState; - LRStackItem start = new LRStackItem(); - start.m_token.m_symbol = m_grammar.StartSymbol; - start.m_state = m_lrState; - m_lrStack[m_lrStackIndex] = start; - - m_reductionCount = Undefined; // there are no reductions yet. - } - - #endregion - - #region Parser general properties - - /// - /// Gets the parser's grammar. - /// - public Grammar Grammar - { - get { return m_grammar; } - } - - /// - /// Gets or sets flag to trim reductions. - /// - public bool TrimReductions - { - get { return m_trimReductions; } - set { m_trimReductions = value; } - } - - #endregion - - #region Data Source properties and methods - - /// - /// Gets source of parsed data. - /// - public TextReader TextReader - { - get { return m_textReader; } - } - - /// - /// Gets current char position. - /// - public int CharPosition - { - get { return m_charIndex + m_bufferStartIndex; } - } - - /// - /// Gets current line number. It is 1-based. - /// - public int LineNumber - { - get { return m_lineNumber; } - } - - /// - /// Gets current char position in the current source line. It is 1-based. - /// - public int LinePosition - { - get { return CharPosition - m_lineStart + 1; } - } - - /// - /// Gets current source line text. It can be truncated if line is longer than 2048 characters. - /// - public string LineText - { - get - { - int lineStart = Math.Max(m_lineStart, 0); - int lineLength; - if (m_lineLength == Undefined) - { - // Line was requested outside of SourceLineReadCallback call - lineLength = m_charIndex - lineStart; - } - else - { - lineLength = m_lineLength - (lineStart - m_lineStart); - } - if (lineLength > 0) - { - return new String(m_buffer, lineStart, lineLength); - } - return string.Empty; - } - } - - /// - /// Gets or sets callback function to track source line text. - /// - public SourceLineReadCallback SourceLineReadCallback - { - get { return m_sourceLineReadCallback; } - set { m_sourceLineReadCallback = value; } - } - - /// - /// Reads next characters to the buffer. - /// - /// Number of characters read. - private int ReadBuffer() - { - // Find out how many bytes to preserve. - // We truncate long lines. - int lineStart = (m_lineStart < 0) ? 0 : m_lineStart; - int lineCharCount = m_charIndex - lineStart; - if (lineCharCount > m_bufferSize / 2) - { - lineCharCount = m_bufferSize / 2; - } - int moveIndex = m_charIndex - lineCharCount; - int moveCount = lineCharCount + m_preserveChars; - if (moveCount > 0) - { - // We need to keep current token characters. - if (m_bufferSize - moveCount < 20) - { - // Grow the buffer - m_bufferSize = m_bufferSize * 2; - char[] newBuffer = new char[m_bufferSize + 1]; - Array.Copy(m_buffer, moveIndex, newBuffer, 0, moveCount); - m_buffer = newBuffer; - } - else - { - Array.Copy(m_buffer, moveIndex, m_buffer, 0, moveCount); - } - } - - // Read as many characters as possible. - int count = m_bufferSize - moveCount; - int result = m_textReader.Read(m_buffer, moveCount, count); - // Mark character after last read one as End-Of-String - m_buffer[moveCount + result] = EndOfString; - // Adjust buffer variables. - m_bufferStartIndex += moveIndex; - m_charIndex -= moveIndex; - m_lineStart -= moveIndex; - return result; - } - - /// - /// Increments current char index by delta character positions. - /// - /// Number to increment char index. - private void MoveBy(int delta) - { - for (int i = delta; --i >= 0;) - { - if (m_buffer[m_charIndex++] == '\n') - { - if (m_sourceLineReadCallback != null) - { - m_lineLength = m_charIndex - m_lineStart - 1; // Exclude '\n' - int lastIndex = m_lineStart + m_lineLength - 1; - if (lastIndex >= 0 && m_buffer[lastIndex] == '\r') - { - m_lineLength--; - } - if (m_lineLength < 0) - { - m_lineLength = 0; - } - m_sourceLineReadCallback(this, m_lineStart + m_bufferStartIndex, m_lineLength); - } - m_lineNumber++; - m_lineStart = m_charIndex; - m_lineLength = Undefined; - } - if (m_buffer[m_charIndex] == '\0') - { - if (m_sourceLineReadCallback != null) - { - m_lineLength = m_charIndex - m_lineStart; - if (m_lineLength > 0) - { - m_sourceLineReadCallback(this, m_lineStart + m_bufferStartIndex, m_lineLength); - } - m_lineLength = Undefined; - } - } - } - } - - /// - /// Moves current char pointer to the end of source line. - /// - private void MoveToLineEnd() - { - while (true) - { - char ch = m_buffer[m_charIndex]; - switch (ch) - { - case '\r': - case '\n': - return; - - case EndOfString: - if (ReadBuffer() == 0) - { - return; - } - break; - - default: - if (m_commentText != null) - { - m_commentText.Append(ch); - } - break; - } - m_charIndex++; - } - } - - #endregion - - #region Tokenizer properties and methods - - /// - /// Gets or sets current token symbol. - /// - public Symbol TokenSymbol - { - get { return m_token.m_symbol; } - set { m_token.m_symbol = value; } - } - - /// - /// Gets or sets current token text. - /// - public string TokenText - { - get - { - if (m_token.m_text == null) - { - if (m_token.m_length > 0) - { - m_token.m_text = new String(m_buffer, m_token.m_start - m_bufferStartIndex, m_token.m_length); - } - else - { - m_token.m_text = string.Empty; - } - } - return m_token.m_text; - } - set { m_token.m_text = value; } - } - - /// - /// Gets or sets current token position relative to input stream beginning. - /// - public int TokenCharPosition - { - get { return m_token.m_start; } - set { m_token.m_start = value; } - } - - /// - /// Gets or sets current token text length. - /// - public int TokenLength - { - get { return m_token.m_length; } - set { m_token.m_length = value; } - } - - /// - /// Gets or sets current token line number. It is 1-based. - /// - public int TokenLineNumber - { - get { return m_token.m_lineNumber; } - set { m_token.m_lineNumber = value; } - } - - /// - /// Gets or sets current token position in current source line. It is 1-based. - /// - public int TokenLinePosition - { - get { return m_token.m_linePosition; } - set { m_token.m_linePosition = value; } - } - - /// - /// Gets or sets token syntax object associated with the current token or reduction. - /// - public object TokenSyntaxNode - { - get - { - if (m_reductionCount == Undefined) - { - return m_token.m_syntaxNode; - } - else - { - return m_lrStack[m_lrStackIndex].m_token.m_syntaxNode; - } - } - set - { - if (m_reductionCount == Undefined) - { - m_token.m_syntaxNode = value; - } - else - { - m_lrStack[m_lrStackIndex].m_token.m_syntaxNode = value; - } - } - } - - /// - /// Returns string representation of the token. - /// - /// String representation of the token. - public string TokenString - { - get - { - if (m_token.m_symbol.m_symbolType != SymbolType.Terminal) - { - return m_token.m_symbol.ToString(); - } - StringBuilder sb = new StringBuilder(m_token.m_length); - for (int i = 0; i < m_token.m_length; i++) - { - char ch = m_buffer[m_token.m_start - m_bufferStartIndex + i]; - if (ch < ' ') - { - switch (ch) - { - case '\n': - sb.Append("{LF}"); - break; - case '\r': - sb.Append("{CR}"); - break; - case '\t': - sb.Append("{HT}"); - break; - } - } - else - { - sb.Append(ch); - } - } - return sb.ToString(); - } - } - - /// - /// Pushes a token to the input token stack. - /// - /// Token symbol. - /// Token text. - /// Syntax node associated with the token. - public void PushInputToken(Symbol symbol, string text, object syntaxNode) - { - if (m_token.m_symbol != null) - { - if (m_inputTokenCount == m_inputTokens.Length) - { - Token[] newTokenArray = new Token[m_inputTokenCount * 2]; - Array.Copy(m_inputTokens, newTokenArray, m_inputTokenCount); - m_inputTokens = newTokenArray; - } - m_inputTokens[m_inputTokenCount++] = m_token; - } - m_token = new Token(); - m_token.m_symbol = symbol; - m_token.m_text = text; - m_token.m_length = (text != null) ? text.Length : 0; - m_token.m_syntaxNode = syntaxNode; - } - - /// - /// Pops token from the input token stack. - /// - /// Token symbol from the top of input token stack. - public Symbol PopInputToken() - { - Symbol result = m_token.m_symbol; - if (m_inputTokenCount > 0) - { - m_token = m_inputTokens[--m_inputTokenCount]; - } - else - { - m_token.m_symbol = null; - m_token.m_text = null; - } - return result; - } - - char SpecialSymbol = '\0'; - bool NotExecuteSpecialSymbol = false; - - /// - /// Reads next token from the input stream. - /// - /// Token symbol which was read. - public Symbol ReadToken() - { - m_token.m_text = null; - m_token.m_start = m_charIndex + m_bufferStartIndex; - m_token.m_lineNumber = m_lineNumber; - m_token.m_linePosition = m_charIndex /*+ m_bufferStartIndex*/ - m_lineStart + 1; - int lookahead = m_charIndex; // Next look ahead char in the input - int tokenLength = 0; - Symbol tokenSymbol = null; - DfaState[] dfaStateTable = m_grammar.m_dfaStateTable; - - char ch = m_buffer[lookahead]; - if (ch == EndOfString) - { - if (ReadBuffer() == 0) - { - m_token.m_symbol = m_grammar.m_endSymbol; - m_token.m_length = 0; - return m_token.m_symbol; - } - lookahead = m_charIndex; - ch = m_buffer[lookahead]; - } - if (SpecialSymbol != '\0') - { - ch = SpecialSymbol; - SpecialSymbol = '\0'; - lookahead--; - NotExecuteSpecialSymbol = true; - } - DfaState dfaState = m_grammar.m_dfaInitialState; - while (true) - { - dfaState = dfaState.m_transitionVector[ch] as DfaState; - - // This block-if statement checks whether an edge was found from the current state. - // If so, the state and current position advance. Otherwise it is time to exit the main loop - // and report the token found (if there was it fact one). If the LastAcceptState is -1, - // then we never found a match and the Error Token is created. Otherwise, a new token - // is created using the Symbol in the Accept State and all the characters that - // comprise it. - if (dfaState != null) - { - // This code checks whether the target state accepts a token. If so, it sets the - // appropiate variables so when the algorithm in done, it can return the proper - // token and number of characters. - lookahead++; - if (dfaState.m_acceptSymbol != null) - { - tokenSymbol = dfaState.m_acceptSymbol; - tokenLength = lookahead - m_charIndex; - } - ch = m_buffer[lookahead]; - if (ch == EndOfString) - { - m_preserveChars = lookahead - m_charIndex; - if (ReadBuffer() == 0) - { - // Found end of of stream - lookahead = m_charIndex + m_preserveChars; - } - else - { - lookahead = m_charIndex + m_preserveChars; - ch = m_buffer[lookahead]; - } - m_preserveChars = 0; - } - } - else - { - if (tokenSymbol != null) - { - m_token.m_symbol = tokenSymbol; - m_token.m_length = tokenLength; - if ((SepecialSymbolPrefixDirection.Count > 0 && SepecialSymbolPrefixDirection.ContainsKey(TokenText)) /*|| InsertSepecialSymbol!='\0'*/) - { - if (!NotExecuteSpecialSymbol) - { - NotExecuteSpecialSymbol = false; - /*if (InsertSepecialSymbol != '\0') - SpecialSymbol = InsertSepecialSymbol; - else*/ - SpecialSymbol = SepecialSymbolPrefixDirection[TokenText]; - return ReadToken(); - } - NotExecuteSpecialSymbol = false; - } - MoveBy(tokenLength); - } - else - { - //Tokenizer cannot recognize symbol - m_token.m_symbol = m_grammar.m_errorSymbol; - m_token.m_length = 1; - MoveBy(1); - } - break; - } - } - return m_token.m_symbol; - } - - /// - /// Removes current token and pops next token from the input stack. - /// - private void DiscardInputToken() - { - if (m_inputTokenCount > 0) - { - m_token = m_inputTokens[--m_inputTokenCount]; - } - else - { - m_token.m_symbol = null; - m_token.m_text = null; - } - } - - #endregion - - #region LR parser properties and methods - - /// - /// Gets current LR state. - /// - public LRState CurrentLRState - { - get { return m_lrState; } - } - - /// - /// Gets current reduction syntax rule. - /// - public Rule ReductionRule - { - get { return m_lrStack[m_lrStackIndex].m_rule; } - } - - /// - /// Gets number of items in the current reduction - /// - public int ReductionCount - { - get { return m_reductionCount; } - } - - /// - /// Gets reduction item syntax object by its index. - /// - /// Index of reduction item. - /// Syntax object attached to reduction item. - public object GetReductionSyntaxNode(int index) - { - //DarkStar Changed for Speed! - /*if (index < 0 || index >= m_reductionCount) - { - throw new IndexOutOfRangeException(); - }*/ - return m_lrStack[m_lrStackIndex - m_reductionCount + index].m_token.m_syntaxNode; - } - - /// - /// Gets array of expected token symbols. - /// - public Symbol[] GetExpectedTokens() - { - return m_expectedTokens; - } - - public Symbol[] GetExpectedNonTerminalTokens() - { - return m_expectedNonTerminalTokens; - } - - /// - /// Executes next step of parser and returns parser state. - /// - /// Parser current state. - public ParseMessage Parse() - { - if (m_token.m_symbol != null) - { - switch (m_token.m_symbol.m_symbolType) - { - case SymbolType.CommentLine: - DiscardInputToken(); //Remove it - MoveToLineEnd(); - break; - - case SymbolType.CommentStart: - ProcessBlockComment(); - break; - } - } - while (true) - { - if (m_token.m_symbol == null) - { - //We must read a token - Symbol readTokenSymbol = ReadToken(); - SymbolType symbolType = readTokenSymbol.m_symbolType; - if (m_commentLevel == 0 - && symbolType != SymbolType.CommentLine - && symbolType != SymbolType.CommentStart - && symbolType != SymbolType.WhiteSpace) - { - return ParseMessage.TokenRead; - } - } - else - { - //==== Normal parse mode - we have a token and we are not in comment mode - switch (m_token.m_symbol.m_symbolType) - { - case SymbolType.WhiteSpace: - DiscardInputToken(); // Discard Whitespace - break; - - case SymbolType.CommentStart: - m_commentLevel = 1; // Switch to block comment mode. - return ParseMessage.CommentBlockRead; - - case SymbolType.CommentLine: - return ParseMessage.CommentLineRead; - - case SymbolType.Error: - return ParseMessage.LexicalError; - - default: - //Finally, we can parse the token - TokenParseResult parseResult = ParseToken(); - switch (parseResult) - { - case TokenParseResult.Accept: - return ParseMessage.Accept; - - case TokenParseResult.InternalError: - return ParseMessage.InternalError; - - case TokenParseResult.ReduceNormal: - if (!m_lrStack[m_lrStackIndex].m_rule.m_hasEmpty) - return ParseMessage.Reduction; - break; - - case TokenParseResult.Shift: - //A simple shift, we must continue - DiscardInputToken(); // Okay, remove the top token, it is on the stack - break; - - case TokenParseResult.SyntaxError: - return ParseMessage.SyntaxError; - - default: - //Do nothing - break; - } - break; - } - } - } - } - - private void ProcessBlockComment() - { - if (m_commentLevel > 0) - { - if (m_commentText != null) - { - m_commentText.Append(TokenText); - } - DiscardInputToken(); - while (true) - { - SymbolType symbolType = ReadToken().SymbolType; - if (m_commentText != null) - { - m_commentText.Append(TokenText); - } - DiscardInputToken(); - switch (symbolType) - { - case SymbolType.CommentStart: - //Commented by MZ for using simple comment blocks - //m_commentLevel++; - break; - - case SymbolType.CommentEnd: - m_commentLevel--; - if (m_commentLevel == 0) - { - // Done with comment. - return; - } - break; - - case SymbolType.End: - //TODO: replace with special exception. - throw new UnexpectedEOFinParseCommentBlock(); - - default: - //Do nothing, ignore - //The 'comment line' symbol is ignored as well - break; - } - } - } - } - - /// - /// Gets current comment text. - /// - public string CommentText - { - get - { - if (m_token.m_symbol != null) - { - switch (m_token.m_symbol.m_symbolType) - { - case SymbolType.CommentLine: - m_commentText = new StringBuilder(); - m_commentText.Append(TokenText); - DiscardInputToken(); //Remove token - MoveToLineEnd(); - string lineComment = m_commentText.ToString(); - m_commentText = null; - return lineComment; - - case SymbolType.CommentStart: - m_commentText = new StringBuilder(); - ProcessBlockComment(); - string blockComment = m_commentText.ToString(); - m_commentText = null; - return blockComment; - } - } - return String.Empty; - } - } - - private void RsesizeLRStackIfNeed(int index) - { - if (index > m_lrStack.Length - 1) - { - LRStackItem[] tmp = new LRStackItem[m_lrStack.Length * 2]; - m_lrStack.CopyTo(tmp, 0); - m_lrStack = tmp; - } - } - - private TokenParseResult ParseToken() - { - LRStateAction stateAction = m_lrState.m_transitionVector[m_token.m_symbol.m_index]; - if (stateAction != null) - { - //Work - shift or reduce - if (m_reductionCount > 0) - { - int newIndex = m_lrStackIndex - m_reductionCount; - m_lrStack[newIndex] = m_lrStack[m_lrStackIndex]; - m_lrStackIndex = newIndex; - } - m_reductionCount = Undefined; - switch (stateAction.Action) - { - case LRAction.Accept: - m_reductionCount = 0; - return TokenParseResult.Accept; - - case LRAction.Shift: - m_lrState = m_grammar.m_lrStateTable[stateAction.m_value]; - LRStackItem nextToken = new LRStackItem(); - nextToken.m_token = m_token; - nextToken.m_state = m_lrState; - RsesizeLRStackIfNeed(++m_lrStackIndex); - m_lrStack[m_lrStackIndex] = nextToken; - return TokenParseResult.Shift; - - case LRAction.Reduce: - //Produce a reduction - remove as many tokens as members in the rule & push a nonterminal token - Rule currentRule = m_grammar.m_ruleTable[stateAction.m_value]; - LRStackItem head; - LRState nextState; - if (m_trimReductions && currentRule.m_hasOneNonTerminal) - { - head = m_lrStack[m_lrStackIndex]; - head.m_token.m_symbol = currentRule.m_nonTerminal; - head.m_token.m_text = null; - nextState = m_lrStack[m_lrStackIndex - 1].m_state; - head.m_state = m_lrState = m_grammar.m_lrStateTable[nextState.m_transitionVector[currentRule.m_nonTerminal.m_index].m_value]; - m_lrStack[m_lrStackIndex] = head; - return TokenParseResult.ReduceEliminated; - } - else - { - head = new LRStackItem(); - head.m_rule = currentRule; - head.m_token.m_symbol = currentRule.m_nonTerminal; - head.m_token.m_text = null; - m_reductionCount = currentRule.m_symbols.Length; - nextState = m_lrStack[m_lrStackIndex - m_reductionCount].m_state; - m_lrState = m_grammar.m_lrStateTable[nextState.m_transitionVector[currentRule.m_nonTerminal.m_index].m_value]; - head.m_state = m_lrState; - RsesizeLRStackIfNeed(++m_lrStackIndex); - m_lrStack[m_lrStackIndex] = head; - return TokenParseResult.ReduceNormal; - } - - /* - //======== Create Reduction - LRStackItem head; - TokenParseResult parseResult; - LRState nextState; - if (m_trimReductions && currentRule.m_hasOneNonTerminal) - { - //The current rule only consists of a single nonterminal and can be trimmed from the - //parse tree. Usually we create a new Reduction, assign it to the Data property - //of Head and push it on the stack. However, in this case, the Data property of the - //Head will be assigned the Data property of the reduced token (i.e. the only one - //on the stack). - //In this case, to save code, the value popped of the stack is changed into the head. - head = m_lrStack[m_lrStackIndex]; - head.m_token.m_symbol = currentRule.m_nonTerminal; - head.m_token.m_text = null; - parseResult = TokenParseResult.ReduceEliminated; - //========== Goto - nextState = m_lrStack[m_lrStackIndex - 1].m_state; - } - else - { - //Build a Reduction - head = new LRStackItem(); - head.m_rule = currentRule; - head.m_token.m_symbol = currentRule.m_nonTerminal; - head.m_token.m_text = null; - m_reductionCount = currentRule.m_symbols.Length; - parseResult = TokenParseResult.ReduceNormal; - //========== Goto - nextState = m_lrStack[m_lrStackIndex - m_reductionCount].m_state; - } - - //========= If nextAction is null here, then we have an Internal Table Error!!!! - LRStateAction nextAction = nextState.m_transitionVector[currentRule.m_nonTerminal.m_index]; - if (nextAction != null) - { - m_lrState = m_grammar.m_lrStateTable[nextAction.m_value]; - head.m_state = m_lrState; - if (parseResult == TokenParseResult.ReduceNormal) - { - m_lrStack[++m_lrStackIndex] = head; - } - else - { - m_lrStack[m_lrStackIndex] = head; - } - return parseResult; - } - else - { - return TokenParseResult.InternalError; - } - */ - } - } - - //=== Syntax Error! Fill Expected Tokens - m_expectedTokens = new Symbol[m_lrState.ActionCount]; - m_expectedNonTerminalTokens = new Symbol[m_lrState.ActionCount]; - int lengtht = 0,lengthnt=0; - for (int i = 0; i < m_lrState.ActionCount; i++) - { - switch (m_lrState.GetAction(i).Symbol.SymbolType) - { - case SymbolType.NonTerminal: - m_expectedNonTerminalTokens[lengthnt++] = m_lrState.GetAction(i).Symbol; - m_expectedTokens[lengtht++] = m_lrState.GetAction(i).Symbol; - break; - case SymbolType.Terminal: - case SymbolType.End: - m_expectedTokens[lengtht++] = m_lrState.GetAction(i).Symbol; - break; - } - } - if (lengtht < m_expectedTokens.Length) - { - Symbol[] newArray = new Symbol[lengtht]; - Array.Copy(m_expectedTokens, newArray, lengtht); - m_expectedTokens = newArray; - } - if (lengthnt < m_expectedNonTerminalTokens.Length) - { - Symbol[] newArray = new Symbol[lengthnt]; - Array.Copy(m_expectedNonTerminalTokens, newArray, lengthnt); - m_expectedNonTerminalTokens = newArray; - } - return TokenParseResult.SyntaxError; - } - - #endregion - - #region TokenParseResult enumeration - - /// - /// Result of parsing token. - /// - private enum TokenParseResult - { - Empty = 0, - Accept = 1, - Shift = 2, - ReduceNormal = 3, - ReduceEliminated = 4, - SyntaxError = 5, - InternalError = 6 - } - - #endregion - - #region Token struct - - /// - /// Represents data about current token. - /// - private struct Token - { - internal Symbol m_symbol; // Token symbol. - internal string m_text; // Token text. - internal int m_start; // Token start stream start. - internal int m_length; // Token length. - internal int m_lineNumber; // Token source line number. (1-based). - internal int m_linePosition; // Token position in source line (1-based). - internal object m_syntaxNode; // Syntax node which can be attached to the token. - } - - #endregion - - #region LRStackItem struct - - /// - /// Represents item in the LR parsing stack. - /// - private struct LRStackItem - { - internal Token m_token; // Token in the LR stack item. - internal LRState m_state; // LR state associated with the item. - internal Rule m_rule; // Reference to a grammar rule if the item contains non-terminal. - } - - #endregion - } -} diff --git a/ParserTools/ParserTools/GoldParser/Rule.cs b/ParserTools/ParserTools/GoldParser/Rule.cs deleted file mode 100644 index c69fa5db4..000000000 --- a/ParserTools/ParserTools/GoldParser/Rule.cs +++ /dev/null @@ -1,135 +0,0 @@ -#region Copyright - -//---------------------------------------------------------------------- -// Gold Parser engine. -// See more details on http://www.devincook.com/goldparser/ -// -// Original code is written in VB by Devin Cook (GOLDParser@DevinCook.com) -// -// This translation is done by Vladimir Morozov (vmoroz@hotmail.com) -// -// The translation is based on the other engine translations: -// Delphi engine by Alexandre Rai (riccio@gmx.at) -// C# engine by Marcus Klimstra (klimstra@home.nl) -//---------------------------------------------------------------------- - -#endregion - -#region Using directives - -using System; -using System.Text; - -#endregion - -namespace GoldParser -{ - /// - /// Rule is the logical structures of the grammar. - /// - /// - /// Rules consist of a head containing a nonterminal - /// followed by a series of both nonterminals and terminals. - /// - public class Rule - { - private int m_index; - internal Symbol m_nonTerminal; - internal Symbol[] m_symbols; - internal bool m_hasOneNonTerminal; - internal bool m_hasEmpty; - - /// - /// Creates a new instance of Rule class. - /// - /// Index of the rule in the grammar rule table. - /// Nonterminal of the rule. - /// Terminal and nonterminal symbols of the rule. - public Rule(int index, Symbol nonTerminal, Symbol[] symbols) - { - m_index = index; - m_nonTerminal = nonTerminal; - m_symbols = symbols; - m_hasOneNonTerminal = (symbols.Length == 1) - && (symbols[0].SymbolType == SymbolType.NonTerminal); - m_hasEmpty=symbols.Length == 0;// && m_nonTerminal.Name == "empty"; - - } - - /// - /// Gets index of the rule in the rule table. - /// - public int Index - { - get { return m_index; } - } - - /// - /// Gets the head symbol of the rule. - /// - public Symbol NonTerminal - { - get { return m_nonTerminal; } - } - - /// - /// Gets name of the rule. - /// - public string Name - { - get { return '<' + m_nonTerminal.Name + '>'; } - } - - /// - /// Gets number of symbols. - /// - public int Count - { - get { return m_symbols.Length; } - } - - /// - /// Gets symbol by its index. - /// - public Symbol this[int index] - { - get { return m_symbols[index]; } - } - - /// - /// Gets true if the rule contains exactly one symbol. - /// - /// Used by the Parser object to TrimReductions - public bool ContainsOneNonTerminal - { - get { return m_hasOneNonTerminal; } - } - - /// - /// Gets the rule definition. - /// - public string Definition - { - get - { - StringBuilder result = new StringBuilder(); - for (int i = 0; i < m_symbols.Length; i++) - { - result.Append(m_symbols[i].ToString()); - if (i < m_symbols.Length - 1) - result.Append(' '); - } - return result.ToString(); - } - } - - /// - /// Returns the Backus-Noir representation of the rule. - /// - /// - public override string ToString() - { - return Name + " ::= " + Definition; - } - } -} diff --git a/ParserTools/ParserTools/GoldParser/SR.cs b/ParserTools/ParserTools/GoldParser/SR.cs deleted file mode 100644 index 8b81cc65a..000000000 --- a/ParserTools/ParserTools/GoldParser/SR.cs +++ /dev/null @@ -1,100 +0,0 @@ -#region Copyright - -//---------------------------------------------------------------------- -// Gold Parser engine. -// See more details on http://www.devincook.com/goldparser/ -// -// Original code is written in VB by Devin Cook (GOLDParser@DevinCook.com) -// -// This translation is done by Vladimir Morozov (vmoroz@hotmail.com) -// -// The translation is based on the other engine translations: -// Delphi engine by Alexandre Rai (riccio@gmx.at) -// C# engine by Marcus Klimstra (klimstra@home.nl) -//---------------------------------------------------------------------- - -#endregion - -#region Using directives - -using System; -using System.IO; -using System.Resources; -using System.Globalization; - -#endregion - -namespace GoldParser -{ - /// - /// Custom resource class. Usage: - /// string s = Res.GetString(Res.MyIdenfitier); - /// - internal sealed class SR - { - static SR ms_loader = new SR(); - - private ResourceManager m_resources; - - private SR() - { - m_resources = new ResourceManager("GoldParser", this.GetType().Module.Assembly); - } - - /* These function can be useful in other applications. - - public static string GetString(string name, params object[] args) - { - // null CultureInfo: let ResouceManager determine the culture - return GetString(null, name, args); - } - - public static string GetString(CultureInfo culture, string name, params object[] args) - { - string res = ms_loader.m_resources.GetString(name, culture); - - if (args != null && args.Length > 0) - { - return String.Format(culture, res, args); - } - else - { - return res; - } - } -*/ - public static string GetString(string name) - { - return GetString(null, name); - } - - public static string GetString(CultureInfo culture, string name) - { - return ms_loader.m_resources.GetString(name, culture); - } - - // Code below is automatically generated by GenResNm.exe. - // Do not modify it manually. - #region Resource String Names - - internal const string Grammar_WrongFileHeader = "Grammar_WrongFileHeader"; - - internal const string Grammar_InvalidRecordType = "Grammar_InvalidRecordType"; - - internal const string Grammar_NoEntry = "Grammar_NoEntry"; - - internal const string Grammar_EmptyEntryExpected = "Grammar_EmptyEntryExpected"; - - internal const string Grammar_StringEntryExpected = "Grammar_StringEntryExpected"; - - internal const string Grammar_IntegerEntryExpected = "Grammar_IntegerEntryExpected"; - - internal const string Grammar_ByteEntryExpected = "Grammar_ByteEntryExpected"; - - internal const string Grammar_BooleanEntryExpected = "Grammar_BooleanEntryExpected"; - - internal const string Grammar_InvalidRecordHeader = "Grammar_InvalidRecordHeader"; - - #endregion - } -} diff --git a/ParserTools/ParserTools/GoldParser/SourceLineReadCallback.cs b/ParserTools/ParserTools/GoldParser/SourceLineReadCallback.cs deleted file mode 100644 index efd75abe8..000000000 --- a/ParserTools/ParserTools/GoldParser/SourceLineReadCallback.cs +++ /dev/null @@ -1,31 +0,0 @@ -#region Copyright - -//---------------------------------------------------------------------- -// Gold Parser engine. -// See more details on http://www.devincook.com/goldparser/ -// -// Original code is written in VB by Devin Cook (GOLDParser@DevinCook.com) -// -// This translation is done by Vladimir Morozov (vmoroz@hotmail.com) -// -// The translation is based on the other engine translations: -// Delphi engine by Alexandre Rai (riccio@gmx.at) -// C# engine by Marcus Klimstra (klimstra@home.nl) -//---------------------------------------------------------------------- - -#endregion - -#region Using directives - -using System; - -#endregion - -namespace GoldParser -{ - /// - /// This callback is used by parser to notify read source line. - /// Use parser.LineText to get line source. - /// - public delegate void SourceLineReadCallback(Parser parser, int lineStart, int lineLength); -} diff --git a/ParserTools/ParserTools/GoldParser/Symbol.cs b/ParserTools/ParserTools/GoldParser/Symbol.cs deleted file mode 100644 index 5e737456c..000000000 --- a/ParserTools/ParserTools/GoldParser/Symbol.cs +++ /dev/null @@ -1,142 +0,0 @@ -#region Copyright - -//---------------------------------------------------------------------- -// Gold Parser engine. -// See more details on http://www.devincook.com/goldparser/ -// -// Original code is written in VB by Devin Cook (GOLDParser@DevinCook.com) -// -// This translation is done by Vladimir Morozov (vmoroz@hotmail.com) -// -// The translation is based on the other engine translations: -// Delphi engine by Alexandre Rai (riccio@gmx.at) -// C# engine by Marcus Klimstra (klimstra@home.nl) -//---------------------------------------------------------------------- - -#endregion - -#region Using directives - -using System; -using System.Text; - -#endregion - -namespace GoldParser -{ - /// - /// Represents a terminal or nonterminal symbol used by the Deterministic - /// Finite Automata (DFA) and LR Parser. - /// - /// - /// Symbols can be either terminals (which represent a class of - /// tokens - such as identifiers) or nonterminals (which represent - /// the rules and structures of the grammar). Terminal symbols fall - /// into several categories for use by the GOLD Parser Engine - /// which are enumerated in SymbolType enumeration. - /// - public class Symbol - { - internal int m_index; // symbol index in symbol table - private string m_name; // name of the symbol - internal SymbolType m_symbolType; // type of the symbol - private string m_text; // printable representation of symbol - - private const string m_quotedChars = "|-+*?()[]{}<>!"; - - /// - /// Creates a new instance of Symbol class. - /// - /// Symbol index in symbol table. - /// Name of the symbol. - /// Type of the symbol. - public Symbol(int index, string name, SymbolType symbolType) - { - m_index = index; - m_name = name; - m_symbolType = symbolType; - } - - /// - /// Returns the index of the symbol in the GOLDParser object's Symbol Table. - /// - public int Index - { - get { return m_index; } - } - - /// - /// Returns the name of the symbol. - /// - public string Name - { - get { return m_name; } - } - - /// - /// Returns an enumerated data type that denotes - /// the class of symbols that the object belongs to. - /// - public SymbolType SymbolType - { - get { return m_symbolType; } - } - - /// - /// Returns the text representation of the symbol. - /// In the case of nonterminals, the name is delimited by angle brackets, - /// special terminals are delimited by parenthesis - /// and terminals are delimited by single quotes - /// (if special characters are present). - /// - /// String representation of symbol. - public override string ToString() - { - if (m_text == null) - { - switch (SymbolType) - { - case SymbolType.NonTerminal: - m_text = '<' + Name + '>'; - break; - - case SymbolType.Terminal: - m_text = FormatTerminalSymbol(Name); - break; - - default: - m_text = '(' + Name + ')'; - break; - } - } - return m_text; - } - - private static string FormatTerminalSymbol(string source) - { - StringBuilder result = new StringBuilder(); - for (int i = 0; i < source.Length; i++) - { - char ch = source[i]; - if (ch == '\'') - { - result.Append("''"); - } - else if (IsQuotedChar(ch) || (ch == '"')) - { - result.Append(new Char[] {'\'', ch, '\''}); - } - else - { - result.Append(ch); - } - } - return result.ToString(); - } - - private static bool IsQuotedChar(char value) - { - return (m_quotedChars.IndexOf(value) >= 0); - } - } -} diff --git a/ParserTools/ParserTools/GoldParser/SymbolType.cs b/ParserTools/ParserTools/GoldParser/SymbolType.cs deleted file mode 100644 index 2b67069e0..000000000 --- a/ParserTools/ParserTools/GoldParser/SymbolType.cs +++ /dev/null @@ -1,81 +0,0 @@ -#region Copyright - -//---------------------------------------------------------------------- -// Gold Parser engine. -// See more details on http://www.devincook.com/goldparser/ -// -// Original code is written in VB by Devin Cook (GOLDParser@DevinCook.com) -// -// This translation is done by Vladimir Morozov (vmoroz@hotmail.com) -// -// The translation is based on the other engine translations: -// Delphi engine by Alexandre Rai (riccio@gmx.at) -// C# engine by Marcus Klimstra (klimstra@home.nl) -//---------------------------------------------------------------------- - -#endregion - -#region Using directives - -using System; - -#endregion - -namespace GoldParser -{ - /// - /// Type of symbol. - /// - public enum SymbolType - { - /// - /// Normal nonterminal - /// - NonTerminal = 0, - - /// - /// Normal terminal - /// - Terminal = 1, - - /// - /// This Whitespace symbols is a special terminal - /// that is automatically ignored the the parsing engine. - /// Any text accepted as whitespace is considered - /// to be inconsequential and "meaningless". - /// - WhiteSpace = 2, - - /// - /// The End symbol is generated when the tokenizer - /// reaches the end of the source text. - /// - End = 3, - - /// - /// This type of symbol designates the start of a block quote. - /// - CommentStart = 4, - - /// - /// This type of symbol designates the end of a block quote. - /// - CommentEnd = 5, - - /// - /// When the engine reads a token that is recognized as - /// a line comment, the remaining characters on the line - /// are automatically ignored by the parser. - /// - CommentLine = 6, - - /// - /// The Error symbol is a general-purpose means - /// of representing characters that were not recognized - /// by the tokenizer. In other words, when the tokenizer - /// reads a series of characters that is not accepted - /// by the DFA engine, a token of this type is created. - /// - Error = 7 - } -} diff --git a/Parsers/PascalABCParserNewSaushkin/Errors1.cs b/Parsers/PascalABCParserNewSaushkin/Errors1.cs index 0954e4c11..61a399774 100644 --- a/Parsers/PascalABCParserNewSaushkin/Errors1.cs +++ b/Parsers/PascalABCParserNewSaushkin/Errors1.cs @@ -67,22 +67,6 @@ namespace PascalABCCompiler.Errors public class PABCNETUnexpectedToken : SyntaxError { private string _message; - public PABCNETUnexpectedToken(PascalABCCompiler.ParserTools.GPBParser parser) - : base("", parser.current_file_name, parser.parsertools.GetTokenSourceContext(parser.LRParser), (syntax_tree_node)parser.prev_node) - { - List Symbols = parser.parsertools.GetPrioritySymbols(parser.LRParser.GetExpectedTokens()); - if (Symbols.Count == 1) - { - string OneSybmolText = "ONE_" + Symbols[0].Name.ToUpper(); - string LocOneSybmolText = PascalABCSavParser.StringResources.Get(OneSybmolText); - if (LocOneSybmolText != OneSybmolText) - { - _message = string.Format(LocOneSybmolText); - return; - } - } - _message = string.Format(PascalABCSavParser.StringResources.Get("EXPECTED{0}"), PascalABCCompiler.FormatTools.ObjectsToString(parser.parsertools.SymbolsToStrings(Symbols.ToArray()), ",")); - } public PABCNETUnexpectedToken(string _file_name, string expected, SourceContext _source_context, syntax_tree_node _node) : base("", _file_name, _source_context, _node) { From c284bd34c6688c327f40beef9e69a90b9f91b1ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Sun, 3 Apr 2016 20:03:12 +0200 Subject: [PATCH 12/12] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20Go?= =?UTF-8?q?ldParserEngine.pas=20=D0=B8=20BFSystem.pas=20=D0=B8=D0=B7=20?= =?UTF-8?q?=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D0=BD=D1=8B=D1=85=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D1=83=D0=BB=D0=B5=D0=B9=20(=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B2=20TestSuite)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReleaseGenerators/PABCRtl/PABCRtl.pas | 4 +- ReleaseGenerators/PABCRtl/PABCRtl32.pas | 4 +- ReleaseGenerators/PascalABCNET_version.nsh | 2 +- ReleaseGenerators/RebuildStandartModules.pas | 4 +- ReleaseGenerators/sect_Core.nsh | 2 - bin/Lib/BFSystem.pas | 79 - bin/Lib/GOLDParserEngine.pas | 1717 ------------------ bin/Lib/MathForKumir.pas | 32 - 8 files changed, 7 insertions(+), 1837 deletions(-) delete mode 100644 bin/Lib/BFSystem.pas delete mode 100644 bin/Lib/GOLDParserEngine.pas delete mode 100644 bin/Lib/MathForKumir.pas diff --git a/ReleaseGenerators/PABCRtl/PABCRtl.pas b/ReleaseGenerators/PABCRtl/PABCRtl.pas index 3419d55c1..0cff9fb12 100644 --- a/ReleaseGenerators/PABCRtl/PABCRtl.pas +++ b/ReleaseGenerators/PABCRtl/PABCRtl.pas @@ -2,8 +2,8 @@ library PABCRtl; uses PABCSystem, ABCButtons, ABCHouse, ABCObjects, - ABCSprites, BFSystem, Colors, CRT, DMCollect, DMTaskMaker, DMZadan, Drawman, - DrawManField, Events, FilesOperations, GOLDParserEngine, GraphABC, + ABCSprites, Colors, CRT, DMCollect, DMTaskMaker, DMZadan, Drawman, + DrawManField, Events, FilesOperations, GraphABC, GraphABCHelper, IniFile, PointerTools, PointRect, Robot, RobotField, RobotTaskMaker, RobotZadan, Sockets, Utils, VCL, Timers, PT4TaskMakerNET, RBDMUtils, FormsABC, Collections, Arrays, ClientServer, __RedirectIOMode, __RunMode, __RtlUtils; diff --git a/ReleaseGenerators/PABCRtl/PABCRtl32.pas b/ReleaseGenerators/PABCRtl/PABCRtl32.pas index e35d819fd..40c798690 100644 --- a/ReleaseGenerators/PABCRtl/PABCRtl32.pas +++ b/ReleaseGenerators/PABCRtl/PABCRtl32.pas @@ -2,8 +2,8 @@ library PABCRtl32; uses PABCSystem, ABCButtons, ABCHouse, ABCObjects, - ABCSprites, BFSystem, Colors, CRT, DMCollect, DMTaskMaker, DMZadan, Drawman, - DrawManField, Events, FilesOperations, GOLDParserEngine, GraphABC, + ABCSprites, Colors, CRT, DMCollect, DMTaskMaker, DMZadan, Drawman, + DrawManField, Events, FilesOperations, GraphABC, GraphABCHelper, IniFile, PointerTools, PointRect, Robot, RobotField, RobotTaskMaker, RobotZadan, Sockets, Utils, VCL, Timers, PT4, PT4TaskMakerNET, RBDMUtils, FormsABC, Collections, Arrays, ClientServer, __RedirectIOMode, __RunMode, __RtlUtils; diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index 80e56caef..aa8adb6c8 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.1.0.1207' +!define VERSION '3.1.0.1209' diff --git a/ReleaseGenerators/RebuildStandartModules.pas b/ReleaseGenerators/RebuildStandartModules.pas index 646c1b426..ecd9811a1 100644 --- a/ReleaseGenerators/RebuildStandartModules.pas +++ b/ReleaseGenerators/RebuildStandartModules.pas @@ -1,7 +1,7 @@ uses PABCSystem, __RedirectIOMode, __RunMode, ABCButtons, ABCHouse, ABCObjects, - ABCSprites, BFSystem, Colors, CRT, DMCollect, DMTaskMaker, DMZadan, Drawman, - DrawManField, Events, FilesOperations, GOLDParserEngine, GraphABC, + ABCSprites, Colors, CRT, DMCollect, DMTaskMaker, DMZadan, Drawman, + DrawManField, Events, FilesOperations, GraphABC, GraphABCHelper, IniFile, PointerTools, PointRect, PT4, Robot, RobotField, RobotTaskMaker, RobotZadan, Sockets, Utils, VCL, Timers, PT4Exam, PT4TaskMakerNET, RBDMUtils, Collections, Arrays, Core, FormsABC, MPI, ClientServer; diff --git a/ReleaseGenerators/sect_Core.nsh b/ReleaseGenerators/sect_Core.nsh index 2a21e6137..681ae13f0 100644 --- a/ReleaseGenerators/sect_Core.nsh +++ b/ReleaseGenerators/sect_Core.nsh @@ -63,7 +63,6 @@ File ..\bin\Lib\ABCObjects.pcu File ..\bin\Lib\ABCSprites.pcu File ..\bin\Lib\Arrays.pcu - File ..\bin\Lib\BFSystem.pcu File ..\bin\Lib\Colors.pcu File ..\bin\Lib\CRT.pcu File ..\bin\Lib\DMCollect.pcu @@ -74,7 +73,6 @@ File ..\bin\Lib\Events.pcu File ..\bin\Lib\FilesOperations.pcu File ..\bin\Lib\FormsABC.pcu - File ..\bin\Lib\GOLDParserEngine.pcu File ..\bin\Lib\GraphABC.pcu File ..\bin\Lib\GraphABCHelper.pcu File ..\bin\Lib\IniFile.pcu diff --git a/bin/Lib/BFSystem.pas b/bin/Lib/BFSystem.pas deleted file mode 100644 index 14bb54da8..000000000 --- a/bin/Lib/BFSystem.pas +++ /dev/null @@ -1,79 +0,0 @@ -unit BFSystem; - -//BF language support -//Version 2.1 -//Copyright (c) 2006-2007 DarkStar - -{$apptype console} - -interface - -uses System, PABCSystem, CRT; - -const - BufferSize = 30000; - ConsoleTextColor = Green; - InFileExt = '.in'; - OutFileExt = '.out'; - -var - BFField := new byte[BufferSize]; - BFCaretPos:integer; - BFOutFile:Text; - BFInFile:Text; - -procedure WriteCaretValue; //. -procedure ReadCaretValue; //, - -implementation - -var ReadFromInFile:boolean; - -procedure BFInit; -var fin_name: string; -begin - BFCaretPos := 0; - fin_name := ChangeFileNameExtension(GetEXEFileName, InFileExt); - ReadFromInFile := FileExists(fin_name); - if ReadFromInFile then begin - AssignFile(BFInFile, fin_name); - Reset(BFInFile); - end; - AssignFile(BFOutFile,ChangeFileNameExtension(GetEXEFileName, OutFileExt)); - Rewrite(BFOutFile); - TextColor(ConsoleTextColor); -end; - -procedure BFClose; -begin - CloseFile(BFInFile); - CloseFile(BFOutFile); -end; - -procedure WriteCaretValue; -var c: char; -begin - c := char(BFField[BFCaretPos]); - Write(c); - Write(BFOutFile, c); -end; - -procedure ReadCaretValue; -var c: char; -begin - if ReadFromInFile then begin - if EOF(BFInFile) then - BFField[BFCaretPos] := 0 - else begin - Read(BFInFile, c); - BFField[BFCaretPos] := byte(c); - end; - end else - BFField[BFCaretPos] := byte(CurrentIOSystem.read_symbol); -end; - -initialization - BFInit; -finalization - BFClose; -end. diff --git a/bin/Lib/GOLDParserEngine.pas b/bin/Lib/GOLDParserEngine.pas deleted file mode 100644 index 809ae518b..000000000 --- a/bin/Lib/GOLDParserEngine.pas +++ /dev/null @@ -1,1717 +0,0 @@ -unit GOLDParserEngine; - -{$NullBasedStrings true} - -//---------------------------------------------------------------------- -// Gold Parser engine for PascalABC.NET, v0.1 -// Project site http://pascalabc.net/ -// See more details on http://www.devincook.com/goldparser/ -// -// Original code is written in VB by Devin Cook (GOLDParser@DevinCook.com) -// -// This translation is done by Tkachuk Aleksander (darkstarta@mail.ru) -// -// The translation is based on the other engine translations: -// C# engine by Vladimir Morozov (vmoroz@hotmail.com) -// Delphi engine by Alexandre Rai (riccio@gmx.at) -// C# engine by Marcus Klimstra (klimstra@home.nl) -//---------------------------------------------------------------------- - -interface - -uses System, - System.Text, - System.IO; - -const - //SymbolType enum - SymbolTypeNonTerminal = 0; - SymbolTypeTerminal = 1; - SymbolTypeWhiteSpace = 2; - SymbolTypeEnd = 3; - SymbolTypeCommentStart= 4; - SymbolTypeCommentEnd = 5; - SymbolTypeCommentLine = 6; - SymbolTypeError = 7; - //LRAction enum - LRActionNone = 0; - LRActionShift = 1; - LRActionReduce = 2; - LRActionGoto = 3; - LRActionAccept = 4; - LRActionError = 5; - //const in ObjectMap - MAXINDEX = 255; - GROWTH = 32; - MINSIZE = 32; - MAXARRAYCOUNT = 12; - INVALIDKEY = MaxInt; - //ParseMessage enum - ParseMessageEmpty = 0; - ParseMessageTokenRead = 1; - ParseMessageReduction = 2; - ParseMessageAccept = 3; - ParseMessageNotLoadedError = 4; - ParseMessageLexicalError = 5; - ParseMessageSyntaxError = 6; - ParseMessageCommentError = 7; - ParseMessageInternalError = 8; - ParseMessageCommentBlockRead = 9; - ParseMessageCommentLineRead = 10; - //enum RecordType - RecordTypeParameters = 80; //'P' - RecordTypeTableCounts = 84; //'T' - RecordTypeInitial = 73; //'I' - RecordTypeSymbols = 83; //'S' - RecordTypeCharSets = 67; //'C' - RecordTypeRules = 82; //'R' - RecordTypeDfaStates = 68; //'D' - RecordTypeLRStates = 76; //'L' - RecordTypeComment = 33; //'!' - //enum EntryType - EntryTypeEmpty = 69; //'E' - EntryTypeInteger = 73; //'I' - EntryTypeString = 83; //'S' - EntryTypeBoolean = 66; //'B' - EntryTypeByte = 98; //'b' - //enum TokenParseResult - TokenParseResultEmpty = 0; - TokenParseResultAccept = 1; - TokenParseResultShift = 2; - TokenParseResultReduceNormal = 3; - TokenParseResultReduceEliminated = 4; - TokenParseResultSyntaxError = 5; - TokenParseResultInternalError = 6; - - charEnter = #13; - charReset = #10; - charTab = #9; - charEndOfFile = #0; - - - -type - ParseMessage = integer; - TokenParseResult = integer; - - Symbol = class - Index: integer; // symbol index in symbol table - Name: string; // name of the symbol - SymbolType: integer; // type of the symbol - m_text: string; // printable representation of symbol - m_quotedChars: string; - public - constructor(index:integer; name:string; symType:integer); - function IsQuotedChar(value:char): boolean; - function FormatTerminalSymbol(source:string):string; - function ToString:string; override; - end; - - Entry = record //internal in ObjectMap - Key: integer; - Value: object; - end; - - MapProvider = class - m_count:integer; - constructor;begin end; - function GetIndex(key:integer):object;virtual; - property Index[i:integer]:object read GetIndex; default; - function GetEntry(key:integer):Entry;virtual; - procedure Add(key:integer;value:object);virtual; - procedure Remove(key:integer);virtual; - end; - - SortedMapProvider = class(MapProvider) - m_entries: array of Entry; - m_lastKey:integer; - constructor(capacity:integer); - function GetIndex(key:integer):object; override;//possible error! - function GetEntry(key:integer):Entry;override; - procedure Add(key:integer;value:object);override; - procedure Remove(key:integer);virtual; - function FindIndex(key:integer):integer; //possible error! - function FindInsertIndex(key:integer;var found:boolean):integer;//possible error! - end; - - IndexMapProvider = class(MapProvider) - m_array: array of object; - constructor; - function GetIndex(key:integer):object; override; - function GetEntry(key:integer):Entry;override; - procedure Add(key:integer;value:object);override; - end; - - ArrayMapProvider = class(MapProvider) - m_entries: array of Entry; - constructor(capacity:integer); - function GetIndex(key:integer):object; override; - function GetEntry(key:integer):Entry;override; - procedure Add(key:integer;value:object);override; - end; - - Unassigned = class - constructor;begin end; - end; - - ObjectMap = class - m_readonly: boolean; - m_mapProvider: MapProvider; - constructor; - function getCount:integer; - property Count:integer read GetCount; - procedure SetReadOnly(value: boolean); - function GetIndex(key:integer):object; - procedure SetIndex(key:integer; value:object); - property ReadOnly:boolean read m_readonly write SetReadOnly; - public - property Index[i:integer]:object read GetIndex write SetIndex; default; - function GetKey(index:integer):integer; - procedure Remove(key:integer); - procedure Add(key:integer;value:object); - procedure SetMapProvider(readOnly:boolean); - end; - - DfaState = class - Index: integer; - AcceptSymbol: Symbol; - m_transitionVector: ObjectMap; - constructor(Index:integer;acceptSymbol:Symbol;transitionVector:ObjectMap); - end; - - LRStateAction = class - Index: integer; - StateSymbol: Symbol; - Action: integer; - Value: integer; - constructor(Index:integer;StateSymbol:Symbol;Action:integer;Value:integer); - end; - - LRState = class - Index: integer; - m_actions: array of LRStateAction; - m_transitionVector: array of LRStateAction; - constructor(Index:integer; actions: array of LRStateAction; transitionVector: array of LRStateAction); - function ActionCount: integer; - function GetAction(index:integer): LRStateAction; - function GetActionBySymbolIndex(symbolIndex:integer): LRStateAction; - end; - - Rule = class - Index: integer; - NonTerminal: Symbol; - m_symbols: array of Symbol; - ContainsOneNonTerminal: boolean; - m_hasEmpty: boolean; - public - constructor(index:integer; nonTerminal:Symbol; symbols: array of Symbol); - function GetIndex(key:integer):Symbol; - property this[i:integer]:Symbol read GetIndex; default; - function Name:string; - function Count:integer; - function Definition:string; - function ToString:string;override; - end; - - DfaEdge = record - CharSetIndex: integer; - TargetIndex: integer; - end; - - Grammar = class - Name: string; // Name of the grammar - Version: string; // Version of the grammar - Author: string; // Author of the grammar - About: string; // Grammar description - m_startSymbolIndex: integer; // Start symbol index - CaseSensitive: boolean; // Grammar is case sensitive or not - // Tables read from the binary grammar file - m_symbolTable: array of Symbol; // Symbol table - m_charSetTable: array of string; // Charset table - m_ruleTable: array of Rule; // Rule table - m_dfaStateTable: array of DfaState; // DFA state table - m_lrStateTable: array of LRState; // LR state table - // Initial states - m_dfaInitialStateIndex: integer; // DFA initial state index - DfaInitialState: DfaState; // DFA initial state - m_lrInitialState: integer; // LR initial state - // Internal state of grammar parser - m_reader: BinaryReader; // Source of the grammar - m_entryCount: integer; // Number of entries left - m_errorSymbol: Symbol; - EndSymbol: Symbol; - constructor(reader:BinaryReader); - function FileHeader:string; - function StartSymbol:Symbol; - function InitialLRState:LRState; - private - procedure Load; - function ReadNextRecord:integer; - procedure ReadHeader; - procedure ReadTableCounts; - procedure ReadInitialStates; - procedure ReadSymbols; - procedure ReadCharSets; - procedure ReadRules; - procedure ReadDfaStates; - procedure ReadLRStates; - function CreateDfaTransitionVector(edges: array of DfaEdge):ObjectMap; - procedure ReadEmptyEntry; - function ReadStringEntry:string; - function ReadInt16Entry:integer; - function ReadByteEntry:byte; - function ReadBoolEntry:boolean; - function ReadEntryType:integer; - function ReadString:string; - function ReadInt16:integer; - function ReadByte:byte; - function ReadBool:boolean; - procedure OptimizeDfaTransitionVectors; - end; - - xParser = object;//class! - SourceLineReadCallback = procedure(pars: xParser; lineStart,lineLength:integer); - - //internal in Parser - Token = record - m_symbol: Symbol; // Token symbol. - m_text: string; // Token text. - m_start: integer; // Token start stream start. - m_length: integer; // Token length. - m_lineNumber: integer; // Token source line number. (1-based). - m_linePosition: integer;// Token position in source line (1-based). - m_syntaxNode: object; // Syntax node which can be attached to the token. - end; - //internal in Parser - LRStackItem = record - m_token: Token; // Token in the LR stack item. - m_state: LRState; // LR state associated with the item. - m_rule: Rule; // Reference to a grammar rule if the item contains non-terminal. - end; - - LALRParser = class - m_grammar: Grammar; // Grammar of parsed language. - TrimReductions: boolean; // Allowes to minimize reduction tree. - m_textReader: System.IO.TextReader;// Data to parse. - m_buffer: array of char; // Buffer to keep current characters. - m_bufferSize, // Size of the buffer. - m_bufferStartIndex, // Absolute position of buffered first character. - m_charIndex, // Index of character in the buffer. - m_preserveChars, // Number of characters to preserve when buffer is refilled. - m_lineStart, // Relative position of line start to the buffer beginning. - m_lineLength, // Length of current source line. - m_lineNumber, // Current line number. - m_commentLevel: integer; // Keeps stack level for embedded comments - m_commentText: StringBuilder; // Current comment text. - SourceLineReadWenLineRead: SourceLineReadCallback;// Called when line reading finished. - m_token: Token; // Current token - m_inputTokens: array of Token; // Stack of input tokens. - m_inputTokenCount: integer; // How many tokens in the input. - m_lrStack: array of LRStackItem;// Stack of LR states used for LR parsing. - m_lrStackIndex: integer; // Index of current LR state in the LR parsing stack. - m_lrState: LRState; // Current LR state. - m_reductionCount: integer; // Number of items in reduction. It is Undefined if no reducton available. - m_expectedTokens: array of Symbol;// What tokens are expected in case of error? - const MinimumBufferSize = 4096; // Minimum size of char buffer. - const EndOfString:char = char(0);// Designates last string terminator. - const MinimumInputTokenCount = 2;// Minimum input token stack size. - const MinimumLRStackSize = 256; // Minimum size of reduction stack. - const Undefined = -1; // Used for undefined int values. - - - constructor(tr:TextReader;grm:Grammar); - function LanguageGrammar: Grammar; - function TextReader: System.IO.TextReader; - function CharPosition: integer; - function LineNumber: integer; // Gets current line number. It is 1-based. - function LinePosition: integer; // Gets current char position in the current source line. It is 1-based. - function LineText: string; // Gets current source line text. It can be truncated if line is longer than 2048 characters. - function ReadBuffer: integer; // Reads next characters to the buffer. - procedure MoveBy(delta:integer);// Increments current char index by delta character positions. - procedure MoveToLineEnd; // Moves current char pointer to the end of source line. - procedure SetTokenSymbol(value:Symbol); - function GetTokenSymbol: Symbol; - property TokenSymbol:Symbol read GetTokenSymbol write SetTokenSymbol; - function GetTokenText: string; - procedure SetTokenText(text:string); - property TokenText:string read GetTokenText write SetTokenText;// Gets or sets current token text. - function GetTokenSyntaxNode: object; - procedure SetTokenSyntaxNode(text:object); - property TokenSyntaxNode:object read GetTokenSyntaxNode write SetTokenSyntaxNode;// Gets or sets token syntax object associated with the current token or reduction. - function TokenString: string;// Returns string representation of the token. - procedure PushInputToken(sym:Symbol; text:string; syntaxNode:object);// Pushes a token to the input token stack. - function PopInputToken: Symbol; // Pops token from the input token stack. - function ReadToken: Symbol; // Reads next token from the input stream. - procedure DiscardInputToken; // Removes current token and pops next token from the input stack. - function CurrentLRState: LRState; - function ReductionRule: Rule; - function ReductionCount: integer; - function GetReductionSyntaxNode(index:integer):object; - function GetExpectedTokens:array of Symbol; - function Parse: ParseMessage;// Executes next step of parser and returns parser state. - procedure ProcessBlockComment; - function CommentText: string;// Gets current comment text. - function ParseToken: TokenParseResult; - - /// - /// Gets or sets current token position relative to input stream beginning. - /// -// public int TokenCharPosition -// { -// get { return m_token.m_start; } -// set { m_token.m_start = value; } -// } - - /// - /// Gets or sets current token text length. - /// -// public int TokenLength -// { -// get { return m_token.m_length; } -// set { m_token.m_length = value; } -// } - - /// - /// Gets or sets current token line number. It is 1-based. - /// -// public int TokenLineNumber -// { -// get { return m_token.m_lineNumber; } -// set { m_token.m_lineNumber = value; } -// } - - /// - /// Gets or sets current token position in current source line. It is 1-based. - /// -// public int TokenLinePosition -// { -// get { return m_token.m_linePosition; } -// set { m_token.m_linePosition = value; } -// } - - end; - - -var UnassignedValue: Unassigned; - - -implementation - - - -//------------------------------------------------------------------------------ -//Symbol members -//------------------------------------------------------------------------------ -constructor Symbol.Create(index:integer; name:string; symType:integer); -begin - m_quotedChars := '|-+*?()[]{}<>!'; - self.Index := index; - self.Name := name; - self.SymbolType := symType; -end; - -function Symbol.IsQuotedChar(value:char): boolean; -begin - result := m_quotedChars.IndexOf(value) >= 0; -end; - -function Symbol.FormatTerminalSymbol(source:string):string; -var res: StringBuilder; - i: integer; - ch: char; -begin - res := new StringBuilder; - for i:=0 to source.Length-1 do begin//string[0] - ch := source[i]; - if ch = '''' then - res.Append('''') - else - if IsQuotedChar(ch) or (ch = '"') then - res.Append('''' + ch + '''') - else - res.Append(ch); - end; - result := res.ToString; -end; - -function Symbol.ToString:string; -begin - if m_text=nil then - case SymbolType of - SymbolTypeNonTerminal: - m_text := '<' + Name + '>'; - SymbolTypeTerminal: - m_text := FormatTerminalSymbol(Name); - else - m_text := '(' + Name + ')'; - end; - result := m_text; -end; - - -//------------------------------------------------------------------------------ -//MapProvider members -//------------------------------------------------------------------------------ -function MapProvider.GetIndex(key:integer):object; -begin - result := -1; -end; - -function MapProvider.GetEntry(key:integer):Entry; -begin -end; - -procedure MapProvider.Add(key:integer;value:object); -begin -end; - -procedure MapProvider.Remove(key:integer); -begin - raise new System.InvalidOperationException(); -end; - -//------------------------------------------------------------------------------ -//SortedMapProvider members -//------------------------------------------------------------------------------ - -constructor SortedMapProvider.Create(capacity:integer); -begin - SetLength(m_entries, capacity); -end; - -function SortedMapProvider.GetIndex(key:integer):object; //override;//possible error! -var minIndex,maxIndex,midIndex:integer; -begin - minIndex := 0; - maxIndex := m_count - 1; - result := nil; - if (maxIndex >= 0) and (key <= m_lastKey) then begin - while minIndex < maxIndex do begin - midIndex := (maxIndex + minIndex) div 2; - if key <= m_entries[midIndex].Key then - maxIndex := midIndex - else - minIndex := midIndex + 1; - end; - if key = m_entries[minIndex].Key then - result := m_entries[minIndex].Value; - end; -end; - -function SortedMapProvider.GetEntry(key:integer):Entry;//override; -begin - result := m_entries[key]; -end; - -procedure SortedMapProvider.Add(key:integer;value:object);//override; -var found: boolean; - index: integer; - entries: array of Entry; -begin - index := FindInsertIndex(key, found); - if found then begin - m_entries[index].Value := value; - exit; - end; - if m_count >= m_entries.Length then begin - SetLength(entries,m_entries.Length + GROWTH); - System.Array.Copy(m_entries, 0, entries, 0, m_entries.Length); - m_entries := entries; - end; - if index < m_count then - System.Array.Copy(m_entries, index, m_entries, index + 1, m_count - index) - else - m_lastKey := key; - m_entries[index].Key := key; - m_entries[index].Value := value; - m_count := m_count + 1; -end; - -procedure SortedMapProvider.Remove(key:integer);//virtual; -var index,tailSize: integer; -begin - index := FindIndex(key); - if index >= 0 then begin - tailSize := (m_count - 1) - index; - if tailSize > 0 then begin - System.Array.Copy(m_entries, index + 1, m_entries, index, tailSize); - end else - if m_count > 1 then begin - m_lastKey := m_entries[m_count - 2].Key; - end else begin - m_lastKey := INVALIDKEY; - end; - m_count := m_count - 1; - m_entries[m_count].Key := INVALIDKEY; - m_entries[m_count].Value := nil; - end; -end; - -function SortedMapProvider.FindIndex(key:integer):integer; //possible error! -var minIndex,maxIndex,midIndex: integer; -begin - minIndex := 0; - result := -1; - if (m_count > 0) and (key <= m_lastKey) then begin - maxIndex := m_count - 1; - while minIndex < maxIndex do begin - midIndex := (maxIndex + minIndex) div 2; - if key <= m_entries[midIndex].Key then - maxIndex := midIndex - else - minIndex := midIndex + 1; - end; - if key = m_entries[minIndex].Key then - result := minIndex; - end; -end; - -function SortedMapProvider.FindInsertIndex(key:integer;var found:boolean):integer;//possible error! -var minIndex,maxIndex,midIndex: integer; -begin - minIndex := 0; - found := false; - result := m_count; - if (m_count > 0) and (key <= m_lastKey) then begin - maxIndex := m_count - 1; - while minIndex < maxIndex do begin - midIndex := (maxIndex + minIndex) div 2; - if key <= m_entries[midIndex].Key then - maxIndex := midIndex - else - minIndex := midIndex + 1; - end; - found := key = m_entries[minIndex].Key; - result := minIndex; - end; -end; - -//------------------------------------------------------------------------------ -//IndexMapProvider members -//------------------------------------------------------------------------------ -constructor IndexMapProvider.Create; -var i: integer; -begin - SetLength(m_array,MAXINDEX + 1); - for i:=0 to m_array.Length-1 do - m_array[i] := UnassignedValue; -end; - -function IndexMapProvider.GetIndex(key:integer):object; //override; -begin - if (key >= m_array.Length) or (key < 0) then - result := nil - else - result := m_array[key]; -end; - -function IndexMapProvider.GetEntry(key:integer):Entry;//override; -var idx,i: integer; - value: object; - entr: Entry; -begin - idx := -1; - result := entr; - for i := 0 to m_array.Length-1 do begin - value := m_array[i]; - if value <> UnassignedValue then - idx := idx +1; - if idx = key then begin - entr.key := i; - entr.value := value; - exit; - end; - end; -end; - -procedure IndexMapProvider.Add(key:integer;value:object);//override; -begin - m_array[key] := value; - m_count := m_count + 1; -end; - - -//------------------------------------------------------------------------------ -//ArrayMapProvider members -//------------------------------------------------------------------------------ -constructor ArrayMapProvider.Create(capacity:integer); -begin - SetLength(m_entries,capacity); -end; - -function ArrayMapProvider.GetIndex(key:integer):object; //override; -var i,entryKey:integer; - entr: Entry; -begin - i := m_count; - result := nil; - while i>0 do begin - i := i - 1; - entr := m_entries[i]; - entryKey := entr.Key; - if entryKey < key then begin - continue; - end else - if entryKey = key then begin - result := entr.Value; - break; - end else - if entryKey > key then begin - result := nil; - break; - end; - end; -end; - -function ArrayMapProvider.GetEntry(key:integer):Entry;//override; -begin - result := m_entries[key]; -end; - -procedure ArrayMapProvider.Add(key:integer;value:object);//override; -begin - m_entries[m_count].Key := key; - m_entries[m_count].Value := value; - m_count := m_count +1; -end; - - -//------------------------------------------------------------------------------ -//ObjectMap members -//------------------------------------------------------------------------------ -constructor ObjectMap.Create; -begin - m_mapProvider := new SortedMapProvider(MINSIZE); -end; - -function ObjectMap.getCount:integer; -begin - result := m_mapProvider.m_count; -end; - -procedure ObjectMap.SetReadOnly(value: boolean); -begin - if m_readonly<>value then - SetMapProvider(value); - m_readonly := value; -end; - -function ObjectMap.GetIndex(key:integer):object; -begin - result := m_mapProvider[key]; -end; - -procedure ObjectMap.SetIndex(key:integer; value:object); -begin - m_mapProvider.Add(key, value); -end; - -function ObjectMap.GetKey(index:integer):integer; -begin - result := m_mapProvider.GetEntry(index).Key; -end; - -procedure ObjectMap.Remove(key:integer); -begin - m_mapProvider.Remove(key); -end; - -procedure ObjectMap.Add(key:integer;value:object); -begin - m_mapProvider.Add(key, Entry(value)); -end; - -procedure ObjectMap.SetMapProvider(readOnly:boolean); -var i,count: integer; - provider: MapProvider; - pr: SortedMapProvider; - entr:Entry; -begin - count := m_mapProvider.m_count; - provider := m_mapProvider; - if readOnly then begin - pr := m_mapProvider as SortedMapProvider; - if pr.m_lastKey <= MAXINDEX then begin - provider := new IndexMapProvider; - end else - if (count <= MAXARRAYCOUNT) then begin - provider := new ArrayMapProvider(m_mapProvider.m_count); - end; - end else begin - if not (provider is SortedMapProvider) then - provider := new SortedMapProvider(m_mapProvider.m_count); - end; - if provider <> m_mapProvider then begin - for i:=0 to count-1 do begin - entr := m_mapProvider.GetEntry(i); - provider.Add(entr.Key, entr.Value); - end; - m_mapProvider := provider; - end; -end; - - -//------------------------------------------------------------------------------ -//DFAState members -//------------------------------------------------------------------------------ -constructor DFAState.Create(Index:integer;acceptSymbol:Symbol;transitionVector:ObjectMap); -begin - self.Index := Index; - self.AcceptSymbol := AcceptSymbol; - m_transitionVector := transitionVector; -end; - - -//------------------------------------------------------------------------------ -//LRStateAction members -//------------------------------------------------------------------------------ -constructor LRStateAction.Create(Index:integer;StateSymbol:Symbol;Action:integer;Value:integer); -begin - self.Index := Index; - self.StateSymbol := StateSymbol; - self.Action := Action; - self.Value := Value; -end; - - -//------------------------------------------------------------------------------ -//LRState members -//------------------------------------------------------------------------------ -constructor LRState.Create(Index:integer; actions: array of LRStateAction; transitionVector: array of LRStateAction); -begin - self.Index := index; - m_actions := actions; - m_transitionVector := transitionVector; -end; - -function LRState.ActionCount: integer; -begin - result := m_actions.Length; -end; - -function LRState.GetAction(index:integer): LRStateAction; -begin - result := m_actions[index]; -end; - -function LRState.GetActionBySymbolIndex(symbolIndex:integer): LRStateAction; -begin - result := m_transitionVector[symbolIndex]; -end; - - -//------------------------------------------------------------------------------ -//Rule members -//------------------------------------------------------------------------------ -constructor Rule.Create(index:integer; nonTerminal:Symbol; symbols: array of Symbol); -begin - self.Index := Index; - self.NonTerminal := nonTerminal; - m_symbols := symbols; - ContainsOneNonTerminal := (symbols.Length = 1) and (symbols[0].SymbolType = SymbolTypeNonTerminal); - m_hasEmpty := symbols.Length = 0;// && m_nonTerminal.Name == "empty"; -end; - -function Rule.Name:string; -begin - result := '<' + NonTerminal.Name + '>'; -end; - -function Rule.Count:integer; -begin - result := m_symbols.Length; -end; - -function Rule.GetIndex(key:integer):Symbol; -begin - result := m_symbols[index]; -end; - -function Rule.Definition:string; -var res:StringBuilder; - i:integer; -begin - res := new StringBuilder; - for i:=0 to m_symbols.Length-1 do begin - res.Append(m_symbols[i].ToString); - if i < m_symbols.Length - 1 then - res.Append(' '); - end; - result := res.ToString; -end; - -function Rule.ToString:string; -begin - result := Name + ' ::= ' + Definition; -end; - - -//------------------------------------------------------------------------------ -//Grammar members -//------------------------------------------------------------------------------ -constructor Grammar.Create(reader:BinaryReader); -begin - if reader = nil then - raise new System.ArgumentNullException('reader'); - m_reader := reader; - Load; -end; - -function Grammar.FileHeader:string; -begin - result := 'GOLD Parser Tables/v1.0'; -end; -function Grammar.StartSymbol:Symbol; -begin - result := m_symbolTable[m_startSymbolIndex]; -end; -function Grammar.InitialLRState:LRState; -begin - result := m_lrStateTable[m_lrInitialState]; -end; - - -procedure Grammar.Load; -var recordType: integer; -begin - if FileHeader<>ReadString then - raise new FileLoadException('GPBLALRParser.GrammarWrongFileHeader'); - while m_reader.PeekChar <> -1 do begin - recordType := ReadNextRecord; - case recordType of - RecordTypeParameters: ReadHeader; - RecordTypeTableCounts: ReadTableCounts; - RecordTypeInitial: ReadInitialStates; - RecordTypeSymbols: ReadSymbols; - RecordTypeCharSets: ReadCharSets; - RecordTypeRules: ReadRules; - RecordTypeDfaStates: ReadDfaStates; - RecordTypeLRStates: ReadLRStates; - else - raise new FileLoadException('GPBLALRParser.GrammarInvalidRecordType'); - end; - end; - DfaInitialState := m_dfaStateTable[m_dfaInitialStateIndex]; - OptimizeDfaTransitionVectors; -end; - -function Grammar.ReadNextRecord:integer; -var recordType:char; -begin - recordType := char(m_reader.ReadByte); - case recordType of - 'M': begin - m_entryCount := ReadInt16; - result := ReadByteEntry; - end; - else - raise new FileLoadException('GPBLALRParser.Grammar_InvalidRecordHeader'); - end; -end; - -procedure Grammar.ReadHeader; -begin - Name := ReadStringEntry; - Version := ReadStringEntry; - Author := ReadStringEntry; - About := ReadStringEntry; - CaseSensitive := ReadBoolEntry; - m_startSymbolIndex := ReadInt16Entry; -end; - -procedure Grammar.ReadTableCounts; -begin - SetLength(m_symbolTable ,ReadInt16Entry); - SetLength(m_charSetTable ,ReadInt16Entry); - SetLength(m_ruleTable ,ReadInt16Entry); - SetLength(m_dfaStateTable ,ReadInt16Entry); - SetLength(m_lrStateTable ,ReadInt16Entry); -end; - -procedure Grammar.ReadInitialStates; -begin - m_dfaInitialStateIndex := ReadInt16Entry; - m_lrInitialState := ReadInt16Entry; -end; - -procedure Grammar.ReadSymbols; -var index: integer; - name: string; - symbolType: integer; - sym: Symbol; -begin - index := ReadInt16Entry; - name := ReadStringEntry; - symbolType := ReadInt16Entry; - sym := new Symbol(index, name, symbolType); - case symbolType of - SymbolTypeError: m_errorSymbol := sym; - SymbolTypeEnd: EndSymbol := sym; - end; - m_symbolTable[index] := sym; -end; - -procedure Grammar.ReadCharSets; -begin - m_charSetTable[ReadInt16Entry] := ReadStringEntry; -end; - -procedure Grammar.ReadRules; -var i,index: integer; - nonTerminal: Symbol; - symbols: array of Symbol; -begin - index := ReadInt16Entry; - nonTerminal := m_symbolTable[ReadInt16Entry]; - ReadEmptyEntry; - SetLength(symbols,m_entryCount); - for i:=0 to symbols.Length-1 do - symbols[i] := m_symbolTable[ReadInt16Entry]; - m_ruleTable[index] := new Rule(index, nonTerminal, symbols); -end; - -procedure Grammar.ReadDfaStates; -var i,index: integer; - acceptSymbol: Symbol; - acceptState: boolean; - edges: array of DfaEdge; - transitionVector: ObjectMap; -begin - index := ReadInt16Entry; - acceptSymbol := nil; - acceptState := ReadBoolEntry; - if acceptState then - acceptSymbol := m_symbolTable[ReadInt16Entry] - else - ReadInt16Entry; - ReadEmptyEntry; - // Read DFA edges - SetLength(edges,m_entryCount div 3); - for i:=0 to edges.Length-1 do begin - edges[i].CharSetIndex := ReadInt16Entry; - edges[i].TargetIndex := ReadInt16Entry; - ReadEmptyEntry; - end; - // Create DFA state and store it in DFA state table - transitionVector := CreateDfaTransitionVector(edges); - m_dfaStateTable[index] := new DfaState(index, acceptSymbol, transitionVector); -end; - -procedure Grammar.ReadLRStates; -var targetIndex,i,index: integer; - stateTable: array of LRStateAction; - transitionVector: array of LRStateAction; - sym: Symbol; - action: integer; -begin - index := ReadInt16Entry; - ReadEmptyEntry; - SetLength(stateTable, m_entryCount div 4); - for i:=0 to stateTable.Length-1 do begin - sym := m_symbolTable[ReadInt16Entry]; - action := ReadInt16Entry; - targetIndex := ReadInt16Entry; - ReadEmptyEntry(); - stateTable[i] := new LRStateAction(i, sym, action, targetIndex); - end; - // Create the transition vector - SetLength(transitionVector,m_symbolTable.Length); - for i:=0 to transitionVector.Length-1 do - transitionVector[i] := nil; - for i:=0 to stateTable.Length-1 do - transitionVector[stateTable[i].StateSymbol.Index] := stateTable[i]; - m_lrStateTable[index] := new LRState(index, stateTable, transitionVector); -end; - -function Grammar.CreateDfaTransitionVector(edges: array of DfaEdge):ObjectMap; -var i,j: integer; - charSet: string; -begin - result := new ObjectMap; - i := edges.Length; - while i > 0 do begin - i := i - 1; - charSet := m_charSetTable[edges[i].CharSetIndex]; - for j:=0 to charSet.Length-1 do - result[integer(charSet[j])] := edges[i].TargetIndex; - end; -end; - -procedure Grammar.ReadEmptyEntry; -begin - if ReadEntryType<>EntryTypeEmpty then - raise new FileLoadException('GPBLALRParser.GrammarEmptyEntryExpected'); - m_entryCount := m_entryCount - 1; -end; - -function Grammar.ReadStringEntry:string; -begin - if ReadEntryType<>EntryTypeString then - raise new FileLoadException('GPBLALRParser.GrammarStringEntryExpected'); - m_entryCount := m_entryCount - 1; - result := ReadString; -end; - -function Grammar.ReadInt16Entry:integer; -begin - if ReadEntryType<>EntryTypeInteger then - raise new FileLoadException('GPBLALRParser.GrammarIntegerEntryExpected'); - m_entryCount := m_entryCount - 1; - result := ReadInt16; -end; - -function Grammar.ReadByteEntry:byte; -begin - if ReadEntryType<>EntryTypeByte then - raise new FileLoadException('GPBLALRParser.GrammarByteEntryExpected'); - m_entryCount := m_entryCount - 1; - result := ReadByte; -end; - -function Grammar.ReadBoolEntry:boolean; -begin - if ReadEntryType<>EntryTypeBoolean then - raise new FileLoadException('GPBParser.GrammarBooleanEntryExpected'); - m_entryCount := m_entryCount - 1; - result := ReadBool; -end; - -function Grammar.ReadEntryType:integer; -begin - if m_entryCount = 0 then - raise new FileLoadException('GPBLALRParser.GrammarNoEntry'); - result := ReadByte; -end; - -function Grammar.ReadString:string; -var res: StringBuilder; - unicodeChar: char; -begin - res := new StringBuilder; - unicodeChar := char(integer(ReadInt16)); - while unicodeChar <> char(0) do begin - res.Append(unicodeChar); - unicodeChar := char(integer(ReadInt16)); - end; - result := res.ToString; -end; - -function Grammar.ReadInt16:integer; -begin - result := m_reader.ReadUInt16; -end; - -function Grammar.ReadByte:byte; -begin - result := m_reader.ReadByte; -end; - -function Grammar.ReadBool:boolean; -begin - result := ReadByte = 1; -end; - -procedure Grammar.OptimizeDfaTransitionVectors; -var dfaStates: array of DfaState; - state: DfaState; - transitions: ObjectMap; - transition: object; - key,i,j,transitionIndex: integer; -begin - dfaStates := m_dfaStateTable; - for j:=0 to dfaStates.Length-1 do begin - state := dfaStates[j]; - transitions := state.m_transitionVector; - for i:=transitions.Count-1 downto 0 do begin - key := transitions.GetKey(i); - transition := transitions[key]; - if transition <> nil then begin - transitionIndex := integer(transition); - if transitionIndex >= 0 then - transitions[key] := dfaStates[transitionIndex] - else - transitions[key] := nil; - end; - end; - transitions.ReadOnly := true; - end; -end; - - - -//------------------------------------------------------------------------------ -//Parser members -//------------------------------------------------------------------------------ -constructor LALRParser.Create(tr:System.IO.TextReader; grm:Grammar); -var start: LRStackItem; -begin - m_lineNumber := 1; - TrimReductions := true; - if tr = nil then - raise new ArgumentNullException('textReader'); - if grm = nil then - raise new ArgumentNullException('grammar'); - m_textReader := tr; - m_bufferSize := MinimumBufferSize; - SetLength(m_buffer,m_bufferSize + 1); - m_lineLength := Undefined; - ReadBuffer; - SetLength(m_inputTokens,MinimumInputTokenCount); - SetLength(m_lrStack,MinimumLRStackSize); - m_grammar := grm; - // Put grammar start symbol into LR parsing stack. - m_lrState := m_grammar.InitialLRState; - start.m_token.m_symbol := m_grammar.StartSymbol; - start.m_state := m_lrState; - m_lrStack[m_lrStackIndex] := start; - m_reductionCount := Undefined; // there are no reductions yet. -end; - -function LALRParser.LanguageGrammar: Grammar; -begin - result := m_grammar; -end; - -function LALRParser.TextReader: System.IO.TextReader; -begin - result := m_textReader; -end; - -function LALRParser.CharPosition: integer; -begin - result := m_charIndex + m_bufferStartIndex; -end; - -function LALRParser.LineNumber: integer;// Gets current line number. It is 1-based. -begin - result := m_lineNumber; -end; - -function LALRParser.LinePosition:integer;// Gets current char position in the current source line. It is 1-based. -begin - result := CharPosition - m_lineStart + 1; -end; - -function LALRParser.LineText: string; // Gets current source line text. It can be truncated if line is longer than 2048 characters. -var lineStart,lineLength: integer; -begin - lineStart := Math.Max(m_lineStart, 0); - if m_lineLength = Undefined then - // Line was requested outside of SourceLineReadCallback call - lineLength := m_charIndex - lineStart - else - lineLength := m_lineLength - (lineStart - m_lineStart); - if lineLength > 0 then - result := new String(m_buffer, lineStart, lineLength) - else - result := string.Empty; -end; - -function LALRParser.ReadBuffer: integer; // Reads next characters to the buffer. -var lineStart,lineCharCount,moveIndex,moveCount,count:integer; - newBuffer:array of char; -begin - // Find out how many bytes to preserve. - // We truncate long lines. - lineStart := m_lineStart; - if m_lineStart < 0 then - lineStart := 0; - lineCharCount := m_charIndex - lineStart; - if lineCharCount > m_bufferSize div 2 then - lineCharCount := m_bufferSize div 2; - moveIndex := m_charIndex - lineCharCount; - moveCount := lineCharCount + m_preserveChars; - if moveCount > 0 then - // We need to keep current token characters. - if m_bufferSize - moveCount < 20 then begin - // Grow the buffer - m_bufferSize := m_bufferSize * 2; - SetLength(newBuffer,m_bufferSize + 1); - System.Array.Copy(m_buffer, moveIndex, newBuffer, 0, moveCount); - m_buffer := newBuffer; - end else begin - System.Array.Copy(m_buffer, moveIndex, m_buffer, 0, moveCount); - end; - // Read as many characters as possible. - count := m_bufferSize - moveCount; - result := m_textReader.Read(m_buffer, moveCount, count); - // Mark character after last read one as End-Of-String - m_buffer[moveCount + result] := EndOfString; - // Adjust buffer variables. - m_bufferStartIndex := m_bufferStartIndex + moveIndex; - m_charIndex := m_charIndex - moveIndex; - m_lineStart := m_lineStart - moveIndex; -end; - -procedure LALRParser.MoveBy(delta:integer);// Increments current char index by delta character positions. -var i,lastIndex:integer; -begin - for i:=delta-1 downto 0 do begin - m_charIndex := m_charIndex + 1; - if m_buffer[m_charIndex-1] = charEnter then begin// '\n' - if SourceLineReadWenLineRead <> nil then begin - m_lineLength := m_charIndex - m_lineStart - 1; // Exclude '\n' - lastIndex := m_lineStart + m_lineLength - 1; - if (lastIndex >= 0) and (m_buffer[lastIndex] = charReset) then //'\r' - m_lineLength := m_lineLength - 1; - if m_lineLength < 0 then - m_lineLength := 0; - SourceLineReadWenLineRead(self, m_lineStart + m_bufferStartIndex, m_lineLength); - end; - m_lineNumber := m_lineNumber + 1; - m_lineStart := m_charIndex; - m_lineLength := Undefined; - end; - if m_buffer[m_charIndex] = charEndOfFile then - if SourceLineReadWenLineRead <> nil then begin - m_lineLength := m_charIndex - m_lineStart; - if m_lineLength > 0 then - SourceLineReadWenLineRead(self, m_lineStart + m_bufferStartIndex, m_lineLength); - m_lineLength := Undefined; - end; - end; -end; - -procedure LALRParser.MoveToLineEnd; // Moves current char pointer to the end of source line. -var ch: char; -begin - while true do begin - ch := m_buffer[m_charIndex]; - case ch of - charEnter,charReset: - break; - charEndOfFile: - if ReadBuffer = 0 then - break; - else - if m_commentText <> nil then - m_commentText.Append(ch); - end; - m_charIndex := m_charIndex + 1; - end; -end; - -procedure LALRParser.SetTokenSymbol(value:Symbol); -begin - m_token.m_symbol := value; -end; -function LALRParser.GetTokenSymbol: Symbol; -begin - result := m_token.m_symbol; -end; - -function LALRParser.GetTokenText: string; -begin - if m_token.m_text = nil then begin - if m_token.m_length > 0 then - m_token.m_text := new string(m_buffer, m_token.m_start - m_bufferStartIndex, m_token.m_length) - else - m_token.m_text := string.Empty; - end; - result := m_token.m_text; -end; - -procedure LALRParser.SetTokenText(text:string); -begin - m_token.m_text := text; -end; - -function LALRParser.GetTokenSyntaxNode: object; -begin - if m_reductionCount = Undefined then - result := m_token.m_syntaxNode - else - result := m_lrStack[m_lrStackIndex].m_token.m_syntaxNode; -end; - -procedure LALRParser.SetTokenSyntaxNode(text:object); -begin - if m_reductionCount = Undefined then - m_token.m_syntaxNode := text - else - m_lrStack[m_lrStackIndex].m_token.m_syntaxNode := text; -end; - -function LALRParser.TokenString: string;// Returns string representation of the token. -var sb: StringBuilder; - i: integer; - ch: char; -begin - if m_token.m_symbol.SymbolType <> SymbolTypeTerminal then begin - result := m_token.m_symbol.ToString; - exit; - end; - sb := new StringBuilder(m_token.m_length); - for i := 0 to m_token.m_length-1 do begin - ch := m_buffer[m_token.m_start - m_bufferStartIndex + i]; - if ch < ' ' then - case ch of - charEnter: sb.Append('{LF}'); - charReset: sb.Append('{CR}'); - charTab: sb.Append('{HT}'); - end - else - sb.Append(ch); - end; - result := sb.ToString;{} -end; - -procedure LALRParser.PushInputToken(sym:Symbol; text:string; syntaxNode:object);// Pushes a token to the input token stack. -var newTokenArray: array of Token; -begin - if m_token.m_symbol <> nil then begin - if m_inputTokenCount = m_inputTokens.Length then begin - SetLength(newTokenArray, m_inputTokenCount*2); - System.Array.Copy(m_inputTokens, newTokenArray, m_inputTokenCount); - m_inputTokens := newTokenArray; - end; - m_inputTokens[m_inputTokenCount] := m_token; - m_inputTokenCount := m_inputTokenCount + 1; - end; -// m_token := new Token; - m_token.m_symbol := sym; - m_token.m_text := text; - m_token.m_length := 0; - if text <> nil then - m_token.m_length := text.Length; - m_token.m_syntaxNode := syntaxNode;{} -end; - -function LALRParser.PopInputToken: Symbol; // Pops token from the input token stack. -begin - result := m_token.m_symbol; - if m_inputTokenCount > 0 then begin - m_inputTokenCount := m_inputTokenCount - 1; - m_token := m_inputTokens[m_inputTokenCount]; - end else begin - m_token.m_symbol := nil; - m_token.m_text := nil; - end;{} -end; - - - -function LALRParser.ReadToken: Symbol; // Reads next token from the input stream. -var tokenSymbol: Symbol; - dfaStateTable: array of DfaState; - ch: char; - curDFAState: DfaState; - lookahead,tokenLength: integer; -begin - m_token.m_text := nil; - m_token.m_start := m_charIndex + m_bufferStartIndex; - m_token.m_lineNumber := m_lineNumber; - m_token.m_linePosition := m_charIndex - m_lineStart + 1; - lookahead := m_charIndex; // Next look ahead char in the input - tokenLength := 0; - tokenSymbol := nil; - dfaStateTable := m_grammar.m_dfaStateTable; - ch := m_buffer[lookahead]; - if ch = EndOfString then begin - if ReadBuffer = 0 then begin - m_token.m_symbol := m_grammar.EndSymbol; - m_token.m_length := 0; - result := m_token.m_symbol; - exit; - end; - lookahead := m_charIndex; - ch := m_buffer[lookahead]; - end; - curDFAState := m_grammar.DfaInitialState; - while true do begin - curDFAState := curDFAState.m_transitionVector[integer(ch)] as DfaState; - // This block-if statement checks whether an edge was found from the current state. - // If so, the state and current position advance. Otherwise it is time to exit the main loop - // and report the token found (if there was it fact one). If the LastAcceptState is -1, - // then we never found a match and the Error Token is created. Otherwise, a new token - // is created using the Symbol in the Accept State and all the characters that - // comprise it. - if curDFAState <> nil then begin - // This code checks whether the target state accepts a token. If so, it sets the - // appropiate variables so when the algorithm in done, it can return the proper - // token and number of characters. - lookahead := lookahead + 1; - if curDFAState.AcceptSymbol <> nil then begin - tokenSymbol := curDFAState.AcceptSymbol; - tokenLength := lookahead - m_charIndex; - end; - ch := m_buffer[lookahead]; - if ch = EndOfString then begin - m_preserveChars := lookahead - m_charIndex; - if ReadBuffer = 0 then - lookahead := m_charIndex + m_preserveChars - else begin - lookahead := m_charIndex + m_preserveChars; - ch := m_buffer[lookahead]; - end; - m_preserveChars := 0; - end; - end else begin - if tokenSymbol <> nil then begin - m_token.m_symbol := tokenSymbol; - m_token.m_length := tokenLength; - MoveBy(tokenLength); - end else begin - //Tokenizer cannot recognize symbol - m_token.m_symbol := m_grammar.m_errorSymbol; - m_token.m_length := 1; - MoveBy(1); - end; - break; - end; - end; - result := m_token.m_symbol;{} -end; - -procedure LALRParser.DiscardInputToken; // Removes current token and pops next token from the input stack. -begin - if m_inputTokenCount > 0 then begin - m_inputTokenCount := m_inputTokenCount - 1; - m_token := m_inputTokens[m_inputTokenCount]; - end else begin - m_token.m_symbol := nil; - m_token.m_text := nil; - end;{} -end; - -function LALRParser.CurrentLRState: LRState; -begin - result := m_lrState; -end; - -function LALRParser.ReductionRule: Rule; -begin - result := m_lrStack[m_lrStackIndex].m_rule; -end; - -function LALRParser.ReductionCount: integer; -begin - result := m_reductionCount; -end; - -function LALRParser.GetReductionSyntaxNode(index:integer):object; -begin - //DarkStar Changed for Speed! - //if (index < 0 || index >= m_reductionCount) - // throw new IndexOutOfRangeException(); - result := m_lrStack[m_lrStackIndex - m_reductionCount + index].m_token.m_syntaxNode;{} -end; - -function LALRParser.GetExpectedTokens:array of Symbol; -begin - result := m_expectedTokens; {} -end; - -function LALRParser.Parse: ParseMessage;// Executes next step of parser and returns parser state. -var parseResult: TokenParseResult; - readTokenSymbol: Symbol; - symType: integer; -begin - if m_token.m_symbol <> nil then - case m_token.m_symbol.SymbolType of - SymbolTypeCommentLine:begin - DiscardInputToken; //Remove it - MoveToLineEnd; - end; - SymbolTypeCommentStart: - ProcessBlockComment; - end; - while true do begin - if m_token.m_symbol = nil then begin - //We must read a token - readTokenSymbol := ReadToken; - symType := readTokenSymbol.SymbolType; - if (m_commentLevel = 0) and (symType <> SymbolTypeCommentLine) and (symType <> SymbolTypeCommentStart) and (symType <> SymbolTypeWhiteSpace) then begin - result := ParseMessageTokenRead; - exit; - end; - end else begin - //==== Normal parse mode - we have a token and we are not in comment mode - case m_token.m_symbol.SymbolType of - SymbolTypeWhiteSpace: - DiscardInputToken; // Discard Whitespace - SymbolTypeCommentStart:begin - m_commentLevel := 1; // Switch to block comment mode. - result := ParseMessageCommentBlockRead; - exit; - end; - SymbolTypeCommentLine:begin - result := ParseMessageCommentLineRead; - exit; - end; - SymbolTypeError:begin - result := ParseMessageLexicalError; - exit; - end; - else begin - //Finally, we can parse the token - parseResult := ParseToken; - case parseResult of - TokenParseResultAccept:begin - result := ParseMessageAccept; - exit; - end; - TokenParseResultInternalError:begin - result := ParseMessageInternalError; - exit; - end; - TokenParseResultReduceNormal:begin - if not m_lrStack[m_lrStackIndex].m_rule.m_hasEmpty then begin - result := ParseMessageReduction; - exit; - end; - end; - TokenParseResultShift: - //A simple shift, we must continue - DiscardInputToken; // Okay, remove the top token, it is on the stack - TokenParseResultSyntaxError:begin - result := ParseMessageSyntaxError; - exit; - end; - end; - end; - end; - end; - end; -end; - -procedure LALRParser.ProcessBlockComment; -var symType: integer; -begin - if m_commentLevel > 0 then begin - if m_commentText <> nil then - m_commentText.Append(TokenText); - DiscardInputToken(); - while true do begin - symType := ReadToken.SymbolType; - if m_commentText <> nil then - m_commentText.Append(TokenText); - DiscardInputToken(); - case symType of - SymbolTypeCommentStart: - m_commentLevel := m_commentLevel + 1; - SymbolTypeCommentEnd:begin - m_commentLevel := m_commentLevel - 1; - if m_commentLevel = 0 then - exit; - end; - SymbolTypeEnd: - raise new Exception('CommentError'); - end; - end; - end;{} -end; - -function LALRParser.CommentText: string;// Gets current comment text. -var lineComment,blockComment:string; -begin - result := string.Empty; - if m_token.m_symbol <> nil then - case m_token.m_symbol.SymbolType of - SymbolTypeCommentLine:begin - m_commentText := new StringBuilder; - m_commentText.Append(TokenText); - DiscardInputToken; //Remove token - MoveToLineEnd; - lineComment := m_commentText.ToString; - m_commentText := nil; - result := lineComment; - end; - SymbolTypeCommentStart:begin - m_commentText := new StringBuilder; - ProcessBlockComment; - blockComment := m_commentText.ToString; - m_commentText := nil; - result := blockComment; - end; - end;{} -end; - - -function LALRParser.ParseToken: TokenParseResult; -var stateAction: LRStateAction; - length,i,newIndex: integer; - newArray: array of Symbol; - nextToken:LRStackItem; - currentRule: Rule; - head: LRStackItem; - nextState: LRState; -begin - stateAction := m_lrState.m_transitionVector[m_token.m_symbol.Index]; - if stateAction <> nil then begin - //Work - shift or reduce - if m_reductionCount > 0 then begin - newIndex := m_lrStackIndex - m_reductionCount; - m_lrStack[newIndex] := m_lrStack[m_lrStackIndex]; - m_lrStackIndex := newIndex; - end; - m_reductionCount := Undefined; - case stateAction.Action of - LRActionAccept:begin - m_reductionCount := 0; - result := TokenParseResultAccept; - exit; - end; - LRActionShift:begin - m_lrState := m_grammar.m_lrStateTable[stateAction.Value]; - //nextToken := new LRStackItem; - nextToken.m_token := m_token; - nextToken.m_state := m_lrState; - m_lrStackIndex := m_lrStackIndex + 1; - m_lrStack[m_lrStackIndex] := nextToken; - result := TokenParseResultShift; - exit; - end; - LRActionReduce:begin - //Produce a reduction - remove as many tokens as members in the rule & push a nonterminal token - currentRule := m_grammar.m_ruleTable[stateAction.Value]; - if TrimReductions and currentRule.ContainsOneNonTerminal then begin - head := m_lrStack[m_lrStackIndex]; - head.m_token.m_symbol := currentRule.NonTerminal; - head.m_token.m_text := nil; - nextState := m_lrStack[m_lrStackIndex - 1].m_state; - m_lrState := m_grammar.m_lrStateTable[nextState.m_transitionVector[currentRule.NonTerminal.Index].Value]; - head.m_state := m_lrState; - m_lrStack[m_lrStackIndex] := head; - result := TokenParseResultReduceEliminated; - exit; - end else begin - //head := new LRStackItem; - head.m_rule := currentRule; - head.m_token.m_symbol := currentRule.NonTerminal; - head.m_token.m_text := nil; - m_reductionCount := currentRule.m_symbols.Length; - nextState := m_lrStack[m_lrStackIndex - m_reductionCount].m_state; - m_lrState := m_grammar.m_lrStateTable[nextState.m_transitionVector[currentRule.NonTerminal.Index].Value]; - head.m_state := m_lrState; - m_lrStackIndex := m_lrStackIndex + 1; - m_lrStack[m_lrStackIndex] := head; - result := TokenParseResultReduceNormal; - exit; - end; - end; - end; - end; - //=== Syntax Error! Fill Expected Tokens - SetLength(m_expectedTokens, m_lrState.ActionCount); - length := 0; - for i := 0 to m_lrState.ActionCount-1 do - case m_lrState.GetAction(i).StateSymbol.SymbolType of - SymbolTypeTerminal,SymbolTypeEnd:begin - m_expectedTokens[length] := m_lrState.GetAction(i).StateSymbol; - length := length + 1; - end; - end; - if length < m_expectedTokens.Length then begin - SetLength(newArray, length); - System.Array.Copy(m_expectedTokens, newArray, length); - m_expectedTokens := newArray; - end; - result := TokenParseResultSyntaxError;{} -end; -{} -initialization - UnassignedValue := new Unassigned; -finalization - -end. \ No newline at end of file diff --git a/bin/Lib/MathForKumir.pas b/bin/Lib/MathForKumir.pas deleted file mode 100644 index 867c67ec9..000000000 --- a/bin/Lib/MathForKumir.pas +++ /dev/null @@ -1,32 +0,0 @@ -unit MathForKumir; -interface - function ctg(x:real):real; - function arcctg(x:real):real; - function md (x,y:integer):integer; - function dv(x,y:integer):integer; - function Power(x,y:real):real; - -implementation - function ctg(x:real):real; - begin - result:=1/tan(x); - end; - function arcctg(x:real):real; - begin - result:=Pi/2-arctan(x);; - end; - function md (x,y:integer):integer; - begin - result:=x mod y; - - end; - function dv(x,y:integer):integer; - begin - result:=x div y; - end; - function Power(x,y:real):real; - begin - result:=Exp(y*Ln(x)); - end; - -end. \ No newline at end of file