From ccec3384a126a5bc3089babb1730b35125bbc4c0 Mon Sep 17 00:00:00 2001 From: pedrommaiaa Date: Fri, 18 Jun 2021 14:54:11 -0400 Subject: [PATCH] Hello World! --- Makefile | 4 +- flow | Bin 75208 -> 84416 bytes lib/printint.c | 11 ++++- out | Bin 16848 -> 0 bytes out.s | 59 --------------------------- src/cg.c | 23 +++++++++++ src/expr.c | 9 ++++- src/gen.c | 8 ++++ src/include/decl.h | 34 ++++++++-------- src/include/defs.h | 7 ++-- src/main.c | 1 + src/misc.c | 1 + src/scan.c | 72 +++++++++++++++++++++++++++++++++ src/types.c | 4 +- tests/input21.flow | 11 +++++ tests/results/out.input21.flow | 2 + 16 files changed, 161 insertions(+), 85 deletions(-) delete mode 100755 out delete mode 100644 out.s create mode 100644 tests/input21.flow create mode 100644 tests/results/out.input21.flow diff --git a/Makefile b/Makefile index 9769f7e..3cb09cd 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ clean: test: flow tests/bash/runtests.sh (cd tests/bash; chmod +x runtests.sh; ./runtests.sh) -test2: flow tests/input20.flow lib/printint.c - ./flow tests/input20.flow +test2: flow tests/input21.flow lib/printint.c + ./flow tests/input21.flow gcc -o out out.s lib/printint.c ./out diff --git a/flow b/flow index b500307c4d071c90856b78a4a7055c1237ad5ba7..478227466b2e021eff7f99a7522824336ff2eb2f 100755 GIT binary patch literal 84416 zcmeFa31C#!^*{dJOl~rhWhOJ(HyCzQ2w{~ikRZVX5Lhbi!`>*}w!MwYi z<(_-)x#uqLzL#}*g|kems%V#4nWj+cs6*uBNWk8l08WlFQHfDZD{4~7K z@Q4XOTv})mNyUti=#nYYLzphI6)n_Cr;zA+yS79Lh!!fbB29FRqB0#CzBEJNX`u$! z%UdqsN=UdPL*#3rk&bk;s9nGp{UkU{mz6kJDe^TsQWw!xOS)=Fr-dh_BD7G`C$Xd7 zM5)iv&;=M>E`C>(P`X8uE;O7e@wJf3pljiAPsRVHy!n#u^*X^PG#nx2&_b=eOF&0@ z`KFiF%nM|By|u%G(mu6Ns#h6RTeD)qxKXtgBWr8wy{ks9nmA$PgmIb84Vh!O2qYJk zK{j>q+!6(B_EMe{pSMN4OcQ+a?2A(VXY5yVD;o0;{%LB)YwztlaDm2y$|M}Rh+c}M zr=5rq4zIs@Jrc1d$|L@C4bQkG{gC_3x=E+nwC*ARhWjAIi6-=V1{toj|IC zy{G&sz2yI(m;4RAiorLxNHDOXBM-AzsP4W+dWJc!ApJ1+=ofwxQXr)Rol&4%~9j>PC0z z3c@BtkSdicn`%66;5XIOdnyTMRat3eO?_Ey&9!bStGup}0^l|@0Zby5HhapNJf(GI zHTBBHg#|M%DjkzKR*#Lz9IuoX6c?3(zq_iY+2d|1F1o0;q266wwxZSz9#wS>^^!-a zK6uX(#u2gk1iK@)gk%EWPW2vzE9?_3d#Re=C2RQKPB^T3d#Sg%-<4{ ze@5nS3&}T?Dg4?Il5dgu4~FE&$o$7b@|`k&S4e)c%-p)2U7MXuAB>zV; z|42ywoihJuNd69)?+eMlU*;=26@F>$7(tE#mn9@WO6JFghXKTyMw^Gvwc7$fq*2Yl|VD%FwQDhJ3Bf2)4tJAE_ZDe9(|D zr;Z%@m?1yffWOO-A7jYhYsj}7@(&pDHD5#EgNA%L)izM|Mf)_+r-42V{PQ*N7kj@i z^IJ|>^4r+^n-wL0(_W9se=xu0Maw>3xPSa)WS{a6nS#LHUm^Tzf}HC7t>5q8!qep7 zPjw#B(=;%h>U=>@lcPV?`M91Y2Y;$_r=BLqeyVe;o~8lpROj`2njHM8&a3q_IrdYX zWqO(hwo{##=xK8Br#f@>G&%NDoul&IULF=I_@>_qG-*W8a{NloP_GAv4 zx;Nd;j&&p0ZDdz#q-= z$DdEZd0*$Zp3HyYkJIyC=r-r8FXtcn+7k~3nwe!4!KpRxOxFinkbY&K zCe=cSHN17rhi&Xuj-TwU2b&v-&H0?obv!%PJFzXpi)dTkhhUZuX1T3Lo`xvOGbADx zq=u+e^qJPY6K#1XfOl&Kmueybel?Kd<8vVGo)nPy=1oOKGQlu+7gbjZv zS)JJ|F!L=1(H3}t;Y*h3bwCxePz7IE5@Gw=N_?CtXLaZq;?2c-^;6KV2ykRSp^Q>6 z^j$-@moA|8%{$q$=0nvpH@{`gNyQrtW&B_cfVTi6zb)@%8?~M{lA`%-Ij*iS9&63( z27b5Vi9)iQaN=Pm&?Avv0@Ajk6Zvf=CrNuR@1bd`uM7+9Kr@hW_}>1T-`|>d+80Iy z%na#Tx)Z&XZF#4mN;^ym(sj47-6{|tDXMfC{O))gsAISvup*iE7Y)>%WIXiGrM)-`8Z)|@eUqH#BS!f_AtM)20_ zV!KF+K%)p$=5YckoD)QF0!wcMP=Tv;&54#ZC&D~a=)P_m?q<(Wy0069yXvvvZjxPu zd~??bbO>_FU4sxIZ`_rN2)W@d2bm!Ck1?}R^%Cp@1sQ&zI14Y%!i$UG#YOPq7%wi| z*dwVpGIw4a?~zm-?~!_OT?HuaI@4+dGRf4jw)W8EH#`;?Q$c}MD2Fe>@60>pM;4()>)$b z7(qKxr0zlr75Eta8@>iDudYpQD>@@(K=H{`d?kwSqMqWDRueEVY86rwvA)`Q-=mTMy=|d-K(U`7azb=ePa>gTcG4Wb$Dq`;*GV7rc{t#e0O~#hZvSas=_LEM{Py@wWEE)k?-N~^33liT1vLY-Ka6@Q z>V2jwjaru6)!Jv#OfSxYiuX=XlpY!w9xIgBFufSk9``1<5{HNjIrAWqzPf>zOEook zOy6mA3Ham;a3Y@^0kGziD~Z(;pTorlYHf&04+S^Yv*~|;0?G7gR6q&O@}w8hBK%6a z3ozelA0LAv4_$*XbplL|MveG^FtyXXZe{_|5FmXi@i>L@xg7yovN_6L;5`X$E zlrg#TR$xod-!vOno2nQ4$<` zQOj$v5lG$AZLx12gVt#24!5`e62)RNWZ(FzjBHNgAd@GurQ7VeqSJz;*7}-|@3#mc zdo5}aipp;zr^2!++CDxq&rpTiPy79yzea(fjMx7?#(u6I&iEKb+s7Z6X<(c~jFEp9 z<6(b~@%;hDZG!O)M#i7~#qXynSud(>1PK`gjjH9K^ZCbe8P0B`3o+B^q1kWTfLe%V zk0xHc*+&~Ca6^L7W+x+U^`OttM-3I zWpxKhua_nKjaJs1*9*ZzWq6Y3^RlLhvTih%_2W~#1eA3vFDuxb^|FHNwL&i|Scchw zvfiR9wvRv0Sk?u+ESl;M`{wofd_C2R%l|#W^Vkf7uHO4IcV5d0gnrLpa$3KC9eBRK z0v@W8djc$n3ziQUS#IPc!8L0PkbFj!Y#+bQNOFlN1vM-B@@(tSJk5(=NRvAeWF_$d z-nR?hV~xB&J4qaUJ$u+y0gW#cv=$@n)0{TAD)+6^6?(oP`6$<*&>J`jEsZun++Gbm znCB&&CwG>IQ5*PnXy|q$+fhQ2o-Mh%=gLt#{crtbFD&!9uEk`8Mr*D2JhoO>N&=y@ zkN-oCK`B@NN%xbzF#eO&KxkKA8DRVzp|p>`-^e(b7{kxNPxiw2N4+rq%^F?ea>00o zk@22C3P0Hk*L;v@esaom^pp28Nrtm~KjtOMDq2Qa_#`q8W%vdP+@QII9pZptQ2UbI z_v)!%hGIy9{l1&Ue6m-}+X5CVW-RIMR&ePm0mcVCV5AYo)r2t? z7`uAFFcZc+!qBI1DrLwLtzu^_SUJ_w-(kx=d9AD(8=>beu~t5mwg+_=~K8c@5hJ6i{%KG{Ie%+ z7!zAdPD7JyE!j{Mw;>PV{{~wbp?*2)dn6)t&eK5-@-Np?J|6;BQTgrT7Z^o-r;7|A znB*uY;r+bD7aqio@lrUq^947jk=qSDaBI@J1($MdK(LR9Yy0@OvJq&L*(sb=H;FSf`UL(pI{s=S{#!lb3;nkiVaF(_3I044O|azr zvzy?i)uigPo1l^BbESPol}1g$La*s1C>`D-RMj5@sP=%Wt%&CPzcmsjgV5KEc|pi( zN6e>SJK!2vddTH~oN4vAB50s;Xl@;5-?)i-G$NZH=Mg!R&hES$$xuK2vsF}aUcq=# z!5Kz58$02rxAj2x;{e@rZ%l*4%SEpKES_5bm#&44PZ> zv97sbeigm&D-7^EMD=bT|CEv6Nbn=g1v5+Pg_++&LUZ9Z3T9UtnH@bYGY>ziC##L zRA+f8jQ4iX{tUDsev^iMUbVmSU5#$vpS0Z#Dt4_btcQBd*7;uz{=En>L`N#rg}7X- z62RTnyEukDWq4$#edC?rM3K#6+r!}*-qP)`Z+?kq+dUVwbjR8^J%tq44VdSk9-Tim z2QnhjOr5vOj6j8Sg{=l$w84&0q<~h7b)@eBiR-d6Peaccj&dECmj!7fRxcq5#2myC z3xFsXgh>WuH`M0+dZB+$G!d_%G>>4^fSeDDR^*JJw`BW`H<++dx!17Y_|pk63v9Jv zRg#j$yB?vr9}teQopUnG_x`4CjJXW9r!XmImX> zoQKs*=W}|N1)Jcs!=LDl(+KzbZXmL4)E&_d{?6}9Z0c$Bc*{l)D-%8ax~32b&z(P9 z)5S`Rd7Vp*6!XK-#R*K(u1ELm%+`t*&*l=xqt8D+K-NvvfLgdMKTIQ=PSphkFTa8_Sky0R&62{=gpM3|y60o z)=soq$OMM_x+pXkBoohY&fwVza8HZ9rhp7VoRYvP7}UmM8u>%ZWbF4M27de5=MB&Y zE)4gyWMZiY(SBe)<|AGpCe@L6c+GwVw3fYUD|;Ie;08F0z3W!?H~=BF@~wr{qLeO+ z&m&@B=klDw-Ri+J#xs$gk8zLj9K}7_^Fa__s*EpNCtGUYbT7p8U7+V&W8Zu|azI+P z#)kVqPZjRNJk?!wVASF(Yw1o{xgyAc93KPWr2}~%ap6FA(c^%w!d(^$@^(d2Fl|>P z1sCp$p&)A)Er`3$+Z9E@z+D3=NZW;Z3>^ZH&m@0V#g_$@ zKvHGZ_^x5tMru9y!cmiYP~F@53$RiTV)5$B>cN*u$nLJJpiEf(O|i5bzJ5*j*XZGEcVmM&iYk?m zA;|3eTz@U!#l4H#2=3a@sV^WX^;+BlZ;BzgazwCF3(ZOgDvQr zVtw=ZGldhr%YIFR4tzLf{bfTCK>EWh*lM~e3k~#+=CXs%dC6Ii-5=bXuO}n6JrSogtB+?5KX`e)TlaTro z()$6V9TI6fNAgDQg36Unaz2vF28pmna%lr-myM8a4Iq_Cq(y>D-7Y&|U0%r|UqUAf z=z?7?f?g(}qa`$5Krh^dZlH8clF$?h{rUs`tT$bBv9v8+aa+1#w{*p9>5AOa6|to& zY)hBAh5O7PLz7LyMqPypVWglZz5T(`w{ffL5J>h_-Yw2EVzwtt32eo<_iq%@ZdlZ=Q83?NB+b_7$z4H-} zi9AG<&fE1QjXj+=>q%I%()m3-iFvfrS*s_Vlw77K<0&~;PbN@ux}Hp=WR{*xqT~QQ znM_Hio=l;n8A;!-F`q@1u_n#-+J(sB1pF9g3O&Gt6EN@y0J4sQ#Y z^fBnO^A{rH%LB+*r7OvS+|CDagGxuO9fbR&bs0jFf9R=zu64fZBhuZ$LHFqH;P<;r zy)(e&89LMt|FQ{%qHP+e*!Jv|B*G+aynI~Y=bwCV=dH0_uzIr1I7mbzl~{#;H39?< zRD!x2lwvpnwV!=jB@PPgXTL&>8fia!7csi_vrqPmSjb2(oF=OS9zFGjh=2s-YWL2 zaoXpE{gz8X2}Obs$?J?fKM-SdPj!HXUV|x7$;pS&imhxX1|ztrJ1D>ySLECBE=DVA z<_kFjPM`Fo4J_Z;=WfunkH1bZ6uP_{)I#M45Chap(Dv*`GT{3ttCiU*d65wmpvVcn z46Vo)Il?bU9>IIMk@qY>1@BtKa(RJIqZt%_%#TmGQPOZKX%$Amvk*x6K!_!T%YcCR zomdw8rooqeUq$%A^1&>Z>!P6bKz{2XoR8W~1@GbBBop2%Nak3`I+kRm@zS>s zF5g#-Vuh@qSpJTzzr6tXt4Pc#bmIdHWDS+$AeTp%gj|&GUUcjrNwOfx&%kdFO)h+s zNRn6S_TOkMDBy^%8Yv;yJRui)PTo;kh6)|>sL){n$#s;d$I`7qu<-eQNU38Yg%&7* z#sb<3k&-4KzOO}VX*D{kX*L9x*XZqF+#|imbFSC+637431q-M@kl`Yqim zKZ&~Kd`L!b*g|9XBfiH)qDDXn-!|NYjxLDcYJ=T8kAb3Rz7G&zdY~*%kc!>6`S6fr zar`JNFEF19+zQr&8QhjMDe!g3n)}8}oY1OGg9t6Yn3nFimCJ&rGcn+-O=ncZ#dOB^ z7B&sBM)9fO2M>xKxA2#;$8`<$wc=DsSAX9GOs2b%eNR*1@I3}s*A*%1J}Nv^yXcuG zA*tezEOecT4!Qy1sh`(d( zyt$tejd8M#jeCJQae{pl4K=c@grThVE%6wYbV9M88~T9WTFA#LcA z592?|^yP4A>EJGxwwDJQ6GaiUYeLdygA&qSIUEccz#hw_o@;rgl-CkVGKfW!OW&tx zWNHDBe}ww^Ho!%TdS+o-%bT}-{6H`k$IN{($fSnGd0T8Qz??AP&_v!uWj}$n2sH#Y zng~f8X6Jj+GvMll(t43>g^*01w+r}Q-cKN`iG+Pps9tz|F2VO80ru5Vrq-eM&=lG? zU#r$xX3@s}3QvyxHv7h_;le1gxt&Mi>>E2ki|%FL{5_r%O9$El(z;5zJu7J zl4qEIu^Zwmd!TE@SE%8hK?=B&2=_zUGGdvC(xLW9Ul@9CXBQCKSPIWfM&?f_^RS>Y z6ICOqz`;)OBcwRlD+c#!$_JNmd%*Y~4iJl-V8Lf00XjjW{{1ubQETz!OPqiI0r4sUFY04- zEN2s{2ie&BOSr1!o{(23m_r1EIYGz{MH{Pojv6q`b7@O=s(sUAqNx@k)Atp&HGOYs z4wgC`5N&+PoI?y}M+sH!SEv`0Iz*2=0~+piW`yCmH}-vq*`vg4!&%IdI2lYrrrxxq7`gURz;a(!BMd(EstR z>50WX34LqLffW0uA5-(Un&?uSG|kD^oW6}a7ss>K^ck|q8}k;(HZiVH3!ApDTRYk;2&umhCl!v zB_0S5B0Nf{oi|7k1B?x29HAZdlGlk?lrTq>Kx_``upa00a>u-G5lHjNb{2yGU z))LXYC9pC*km7X^X`o&QyDk#EPk{HNyyxtD`AACV0Cj zKltsU9PBsZFmpb=xzSp5q!2RAY%O|yPZk99?K>dN32SAc4J&D52~AbW$T4umiioe3 zKiHr-CHTzexxD_Z^OFe!akSukm%x6#b^dUQ1v)?N5eANK;PeKai9M6sddRrUfk?D+ zn+7WmqQq7(9il}YPPP`E(B4Oq99}VS0I?cG+{TVxCZF`ahe*(q-Yj&PBdy+dS|K^? zj=FrT$3{;ZH-@1@bZ*7X_dj3l_g#1_EAK*e%REa9A-gk2zuguB22 zsh6pT9&Ddab6{c?cm~}M{DMG%C(mYp429b_wlean1~!3*iuC-kvj%YA6Nq8l+Mjm< zB`du8cU@|z{sPF-l6L~tKcQ8B9pD&>Fo2zK8ETRbOrM*xL(3bAh4gr~h8p{p0~!Ph zNJKmPokwU?lPzWUM(oc!h+M5w{DEp(5P9H%Y&Z}NmG=bW1&a9%9GaYT^Sb^|iJ`8Q zFHv1jqOK=pU4_x$nd>k}7PLh88dcYp2&YI5a>tXEagM?7w;kyZO;>|^=jWKT@EYa} z?|DXfH<63O4@nelAHN;My1D%RMKF1sGhu%%Ccq2N(A-8ll(?Qs`kIh#5lC-KB#du5 z(h5R)pOC5q(jz?}6%f)Bgfv4S-6WCVNOewGgtVEEG6Yh&M1pDQNC|{=B_VawIM>Fe z^?>wwKOp51(k}&4N)Jfy5t56L9u-KZ7YY>^i=#bu-&gy9)GCnP>H(>pkPZ`4g+Tgg z4@e$DdYq8thVqd%@_KA7;kJ)o08iU z0KWrpQ0HXg2{7qgz=b-NVG!!)#H58YVXqK80Bd^|AUr5picvR8tBtNp9cCg(5Hbu4fJWCPXm1# z=+i(i8ldkW(^XJg>#i!RbfrruTQtuLpq zN4r+mc&c6X4fP|hX{f2-bi@bvO>U3335X3%=R}UA9b%=VzR6wQP*q>k?5-g8jScv= zw7aR)(=b`**%RJ1Wwl;+X_-f26*n}v>dNX@yQ*p%R-hWqtLs)Y)HW;1kfw?FO~MZ+ zSaBOoIV&iOZlkmKeKg%CR!}b8MrZN+=n7??*W+raM2*C^shgEN`n0vn)3my#z6x4$ zRW`ZZI#{u0dfcl#yk0VD%_M*^d;h?B#JkOX-WuKLO7VeBP z(S+0lb$iEpr}vt2uN183bK}8 z-GF;dMGaL`3Xd2;M;Ow?dq`774N>5e`s31M8kYY)Bg>s0TqzlT_WYjZ* zb%2kY*EQq2=EKiJvsRRO%Fuv%TPkQbWUpB5aa*%cMkYR4UL|5zd&?>)Ca;qEtLht8 z)^l4Xc0$3#2qrq&r7;;&5ver0@o{zB>iNBvqE&RmchD*7<{U}L+=ayrje=2mLtSH8 z6FNeDMJbR-SbT(Cs~RL5(yXgan22a4wCH3&udHjN#*I|2M4?yWKT5e0~l z+1s_;im6rHyd9Ax)f&i<<%*UT3LtqkYv)Q3atj}!*_YljLO4;})z;xdnhmCGOkY%1 zKgdE&0V;#;NrO?WR<%fiXILL z8XDoIL^C1>Nq1A32Vb~R0^!>+sux-@W+l>gD$Z@)LkR96zEp{+>nN zZ}9sPzafA*@hiqpE7;v!Ue@S#HM_6&y6el`%E&kT{&D!#8h%p@abvy~pAiBtkm>m{ zybR$&4?gZ+<*LPp{+nnxfL|rsRthRG0Mu00xZ(Y@yz=U@CdFNgzZw8vuhdj3aNP>W z7R{@ytgeAE(fFVoc+>BX!l8jr5jydFo8t7l&=6l^h-+{P?+nR*59z1z6K&SyzS3Rp z5kr>Cv$6)t2^v&L%Cd4)hZ|(xszzXAtQod+*f3X_$K|fCAQw+qTCEAuhH?kul-&Q{ zzrR6_h!8nC4*C6WrkXc^9v;Ww543gBmf=YE8h2)`-aw}tm#Qr=zv zpxob9`E|0~>kyVSmsPnZW4v%J8CkpxzMv9j9H}(HuIR5)(6~>3T>}V&6sfFK@MknK zn+@RdCO76xE}kuL_}|Q+{=p->=Wu&OuOSyH{CG_>T$%1(MDL-lg-f$_F|}%HsB@LM z_{2+du8Qn)1@)Ylr-n-kw@Bhj82B)pBGi7<5&uVigCzd>2uI^L5xiT!pd7C}16>dyq@h4GMqJk?{yUOZaHM%Dx{PX_-d>5vU=MxdG zpk@kGhz6cARIRF>CfuQTq$WNIUx7cm5~K)&?TNqOLX7IJDr@%CW2nQlAh)z&mNJ5S zI}GVaUY1`_m^XqZ_e~xbALTJ2&n=x*GWVk5f_ZbfVPiO)Ig@f1mdq$#kb6-v#fwS` ziwou#E~fa*f=df#=20x~61vaj@j`yTm}6he;{|hz3k!-}G}C|}GxO#ayP7bAmxYK7 z>Pg!8OR>u+n<5MHic1#o7zuY#Zed|SxCJsgGjBoOEY6cCc#0wmft|;T)r_mcTh|yg zh(pK8zxVqe{;l7?_9MUl9{djA_bGnPqZps?TZ-TH_}!1+YxteSk7$xW6AwI!({B>u zhmiLY{ygnveujzbKm9|AqX zkq?6&;T;ICL--ej9S8?K0(yj*2tP!)8Q~d(K7{Ew2a^3L=n?+zXP`$o?lI6K+<~wI zVf5pmN4N^%hX@z^H|P;&;1pCk4pd)>a4N#cpMxIZY=qY#eC0{dBg}sa^a!hWfga&D zgl7;QK$wna<~KbJdW72%E=Ab&4CoOqc^32tfAAdW5x$N`nja!Oj_?e^y}Ln=gC+C! zfF9wc`#_KIDumY|T#v8=;TD9?A$%C&hX_AFcn0BT2-C58n1{0=QxR4oT#E1kgx4Xg z$Jv_>gzq7I4q+b7Dt(AB4X3ZpAbb?ZJ;M12uS3|1a2vvRF%Nr= z(wIkmh%gT0-Wh}rjQ#02lX?Q-RD=zfQ!GW8j#I(cA$%2K2g0%Mf*xTcUS{|Z;S7Xl z5SAfK$Ek$p5l%(eaRl@TfBpgN5aIM+VUCP&HNqDWK8f%c!nY8H;XrT=`pRI040o?_Y$_gV2NU7{cce z(xC#n)N2Z({ZEjq%o1?L+mA5YIHw+JIj_l z+a9&jvR;{lF8 zZ!ldH6K-mUM2g}<*2DNc1^9~yb$DKj+4Lkw;qnsC%kK93_Ze|a&*(f(BL7Rk9|(eP z7YvX`a?pX7HTU@a7Z`C?1j-l(_)UP1Ho~g|@M6Gk2fV=uH&t>3;_m_6cMkY%fM0m8 z-#-kYUQcsBl^78H6Ud(ifA!-a{@>U6zXSNs0iS4uHw5H64fq>?n~nTUU+VPn*a~|L zesGeJzA->Q4)9k1uQS3;6*@hAgCr6Da&ZuRz7F>QJ`eCLBfKiW|2Du&0Y^6s)PF_* z{siE&0WUMcO^bB??*QI*j`B|f{vzNwjThi=D%9!Y;s3t?{63?8%pJP^#{s_fzx;lj zSTfKT==8;aKL&Vh5WHN6djLOk4)|?==VScnjs6M1Zv*^;ApVDR{_g-j7vs)rLGWMb z@Y8^Q0eDdme5MYM$M`iA^O$U&+b2eHH`$GT`fi=&#Y~J%A6v zc(%?+Z@NY=|2Duk0`3Z;Ptxh1AUMXq-t6Zcz;8PT{50VA0=_q>{HOHt<1zlu#CS>v zr}X|;6sX@gz$XJ<6eQnFUA|(#t1u2X8tF~Kz2Cx4O^n-bSg9zwJufO?g zGa-=t;{ZQ}`2Za{)8V4~i1r8klXJj5fPV;htdaiWfPQZS{B^*oES>+t0Q?ES4*;HN zgu4UqcK|;OI8JQ^=obXwrvX0%_~k~p=@O1WWyWLv6NPyW9gfq>pBtbb2e=9FTqAr{ z0A39EAi(z<;ila>e-GfV0$vjYU#`P%13d0ozrQ{RE-Fa!Jpp(b;D>|YZ|L;z0G@<- z*{wnLbF*$grvbki^Rx*@`nrJp@fdG+06qzRLa)C$E71OcKfTvaU*itIuN3sj$SMZ> zb-;th59GV>YXqzlutNCY0Pl-Tf?ABfw*kko5A$-M=s2c_^!hyk_mc}NI{Y-?p90=n|A@!@^FhojTY~7X)#=9p9)zw2!5Xq z_W(Y0KiWU2eU|I(a~t3dn76(c1bwerPJ-OU?mb3ixH`fL{mr!gIho0H1db_;Y~I=><;x@I$~a27J0v ze#8mZ4cL`{&F%pf9}W8jEWZa>7GN*-0GkQiLcqEKa}(VxTkK|2fi3y_<~*CLJuJ^Q z{1!ITmUTmTzHMSl#KpFpdfUWYTUM@Z_zatChAnx9Ep~>@!oNjw8~C`euEH?YclBwY zPXm1#=+i)-2KqG6r-42V^l6|^1AQ9k(?FjF`ZVwz(7;}&5OTc?X-kVPEyPk^TzoTF zQSbfC9=}p$xLm^dUJddz_-9{>$8hv_1L)HB6b{G; zZ4J?NP{Oe##4o=Lu}#7++B2bx?|F+Tze_S@(On{ww#4X~C@V!Of9%*TE9MWtIo(N_J|N*=$h4+c z$^Kgls%5)`GR%_gog>5fGF&dhMj5V`;T9S0kl|x8+$+O_GCV57lQIk~_wS`GJI;+k z%}S3&NZFykb5R~$E}+L`=#$~6GCU>2zsm583{7PUzbrD0k)czD$uev!7kFD__#+wK zDZ?EyykCX_J8+Mv5b-D(+GOaIVWJFEWT*y6^%$8n**pEnPU$yX{>C6Q{)qnKi!Pe% z8eX!(Tkr9@CS{Jz%o;iRLN8B_UOOf$Gi%&=B3l^&Y|*p0kt?rAZ}Otn-2gXU0-v6f z2>f>0ZOhJy|Ex{J|D)`tZ}(J96eRdRjV~k!{(GgHI^r-&5r_-?AGkF9Z5IgGd7AqP zpz@f&FNg93{}=dC187quL$Eb@Tv-}^Cx7&U&$*qmzI(=N_&cWxmKTSe#o8dxudxv? z1n}huyxTSR6+$NDKQv3jzdm0eP>b|*3H+^0n9ifDZ7C2`F>Rsv?P(NemT=29;-rTE6xb0wZi)B|Sr#`kj)aZ2i~(;e-o#PD z#zy2IP^>28giWyi0C9_T3D}2S$P=;FTOe`RM4m{t(x=eFCh>&JO3${#CiBE_>jF@Q zP2q_w>pc)BY${Jov}O_{n$X%VrJqTU@y0p z6SrCMmmpDXT}CwdT{l^36FIFi8Gu2wwAKWx{)A7PVzA8tzS@~bM03mvB4Tm ztmj!SLtcw@Ced7CCzao1y_6D*V>SX|i}g66ElFwuWSeypDP(EN8YFgD-2_?2#d*+r z09j#IShpbWG3)OrQ5rcCiCtFuqcma5xomr_caS(MEGD8k+DpwH{aI*P%;;V4Fq)A2Gm#5wLne!SyB z#1kCbke}$-0h}bq@4zA1aV_#w97|AQs)PRAPnzRh;HNw82WEz22B7^MHzB9L<4MF_ zisf@S6N{yP?59Am@`NiQ2O!0oj2z1Vo(NM+gC zbSkp~OOL!vMN*_VBEZ~V)E3f84o`_dW zZm_cyo2WF~Q;1t5GKhg~Hf~mnh<^%lt5w9CP@*+b#6hE2qxw?HLWov#p|%9K58Yv52czhkr~{ zAY2cKKv6s11!nS%kXvnvq_}BobuzV(+8mJsB-7RkDES%`lX94l3M_;)NV3_dvnfD3 zrgFN10fMejaGfo=E>CVGuCpClA+JFv>Ks|f(qz)GI>#Ys7b!{i684brQcPv&dQk)r zc#~ezkklOHnzk0E!Bo_t8Y?CJ38IZ+1l7jfA0bYc+97HeEwO81_Fx#MY^P=vWA>A% zEsfcsld}uJwr|Xa68gq$80&X-%+`lD^5WlMcsq#}*SzY`@O>cqHy++BXqo@Z@HQUw z|IqMuCkXzr;f*Nt;f)gd@J0zayiq-9cq4hV;f><@=tb{xe0!tUBjEOJk6vV6eDtb= zFAW{NmLe~j>Tt6LG>l#}R|*=v=mivYilrZhp8YgO#>LN|BUC#mSBy1N(kO1)x+qye zs7@J@0|e97;uK6j)G1jaH9z$vahn<;k`<|kDVZ&k)v1s1q)k9;(FC;UN_vBGhw~w2 zk(7XMXQ2SK!%Y(K!Ed-z&@D~vI@ulnkW*F4HZ!-;@-`d(?Fu48GyzenEj}2Kn{1SQ5R0kD(nF9^p z_asSUSUWgU;0V;g+>bn;%-sj}lSHU?(9+9EnotMF(S{McuampN!F=HX@9U(Mlsb4= z4u{Tn@|phNF(O&$q}7x4Y?4J!1RJ{4ju%mM96WoH zj-L=q_>o*x&290QkvM*0Ghp#j$haCT5p+W3UF-yfDI361dcPEiMcyxT2Q>jD^m)HN z@Avv@|F(l!WLR`c>5gad~>kaDAB?)n`(Q;FL} zjyYQ9?vS~{uY;VIYf<8+5Z1nEFS4v=mxe{UW$J#5g;(txKHdSUT zQs{(S66aEt<$%c*=i`QpzrTi1?KmGqiA|#kBOwPlrmeM!O=Bo2N3ZH6KA2sq4iVrA zC1EUaoGCaCI}b#-_#1Nw)s9-ukr1@0wcs#QP0j%Vw%3$|jU?(6!QrXl$i>wt0&sYQ zIM9yP6g4gfxu&g4lbf($Q6ogER!J!$5r(SaR}K?Y{DnV6)s7Rqcy|?nC3P)lHdIX) z1dAG8A-QLPjxM$1 zO_H~kfSSgYlw1-R552~ng-zcOAZ)WLmuj_2+GT|O8Os5?_#wm;%W!>yGaGWJbKyTr z%K-!?l0mY6HdLglGss{*%M_^!rC$R{dOZAxgMo}|od_W4ZQzuFqK|89ymSjk%@9+P z`Em5rQvH~3Mw6ZN+eUJ|6`nXqu;8z)BC2-$i8zsoyrr>IRGCXC~zoFm)bD^hda`_-S3zDp`;2b;2};iVSvEgp)08r6dACY zhctXH-9u7g)k+!}wR#_??sN(2A`zgx?UMRFof_XB0eXP^OCrC6llPP4uj%AnlKhU? z9OR+9@WSs%5~)RTmy+Zinrf7^DU{yKna%7kxO^Z2pq(E{H9`AswhMZ+HrjWy2vV-Wd`0rK~#D(g6T?OEgxYUJyJ$kzqP>B+phl9Tgu z3_+!TqLHr*B3~IGe}TyBIQgR)Lg)n|K;4H#Nwcbx1WR3L(}sZN)u6Jz;{g`sDx#%L?Kq zp7j#9ejegBEqsaOv{>i#8%>UB^7#Oew-e*B;a{c-tTG)r74v>>E@M-2kO||7TFs4#M0>WKK<>7OcfcDP;AF9gW zn@PF^-aEfY5!~xU0JZK0MSmt4&6U~IoyD?<7$`%0RGvLtTdYjdsg*atJ4~T3ugHbX zUS!b1CiJMs0N767!lrLw)3>l`LkIcye0bmYbR!3C^AA6p|2KcS@iw{t!;GqSzueN- zPQ9uf^vw+MY~irBLQ#@pF#l5za*9=wA`{efsU30f^~ro@c`#ATEElC0^n_i{TeaNJ0QoOpv|d1J8ma zsRX%{OP)4T5b&>gaLH+wmsSsW9L4B44qpabD#!8S$7Mu-wOivV?)3lb`Ea=I)r<4a;PMdxWD>M7c6O6fO}(y^S| z;}-}vztXvNNN%wy8n?d?H;1PA49?9Vxm7Fu2NO5(ghm^V<@gWTQfPu7Y0Ck7t2t|@ zEJb-5EW?zKKq&|Gm59=S9(oq@Q%oHC2K2rG{X0IOYrBr4)OmQy;24F)9=gE6&EfmB$-l4$d_?Utm2YvKUS?}xzOx5{wBuvg<;~wTrKn}j^AWkq^qr(Sd z%fYz`$cmGnV08WwQInIOV07{mjLyl(VNQO6(aBFRItkt4@pOc?pbUul=OP*k~_Kz(@o%j(CtBX4!ae~nrbb`@3&_q=i zJD=9Mu@4XpErP7Zb8%MVxj3uwT%6T-F3uWsF3wtPS_E!<=QGl9E-un=E-un=E-un= zE-un=E-un=E-o@AgKEW379_*%#qq_CJQo*f%ZNZ;G}U3e2Gn*wBkdW~Xnf~0Qk;v6 ze;B5q{=z}0imm3o(#eKfsDy<51bc(!K&6jOzzrAw@(@C`2+WE}Y6;$KWc zsCGCoGSY*r+f&8Z4tzJ^ujlvEP2)F zyuvW5B?5m=vcO-O#J7M7bzWB~YEeKg8};UqoLBQ0!DPSAYaDn{*`osZ8>nm-#~&l{ zb9H>$*&=+=D`-KTI*jrXnlXDycf1gG=8t%T8W8hSp({K#jYWB%N#W@@GkO#u8=A&A!;b^$k9A-j~ z$K^B}61SRKISq$ItY$?L$1fn?nZa^^Q9=_YT>PVY z2-S}Hs6)a<9D}cHu;H38jVDtHgjHQ4MxcHXIl#s^nzTc5ScNoQiC5yumZYpza5|5M zvE+%wAt5GRA_ulVH&Su=9GXIy^zb94h|)1Jn#+}A5rk7x;mWbL!WOS|&kq5W+;ixA zXp7>&tIs_{TYax@!9e<6-|BmPtMB!#Z{zhX{rt@#c-?PrSl$3`-}d>NPccaH0d)qg zgN&ZEZsHWs##KHB52rw#9ZZhdseK3;Z zrmf4xargg{$!hHlttW|1tDTT`O&9bnI-8TkhCkH5IU)zSw9ZNSfGFxX#jmFc)WCKo zo#YWE)$1jt{DmlHa*B`e+BIEYivXh1>L~e6!pM^p^ONu4$#_lj6_lJMq4~*I@nnL4 zE)u0(94M`gz$18RC9<@e_0kUMrHzyn%SCA;WobC-;w1()&OjT(pU@cyQSCZ09VAfg z8gcRlp6n-O!=D!5vxCJk`t0B`tm9~Q;L8y#>HG#=A7CrIZ+6hP^ZFmM^V;`vw|vXJ z@8#~km%B4^;NbtgUhd{wj}Kya=f`NHl%(kxm((56+mK~7=g1v_if%T@s&k9E~KHX=_dry@anGb%vQXp_=foJWqQ{-Ib}(nNK{X9p<44u6h-++1Q3c|^-kjN zravW%!HBLB#ZP&iM@ovNI>pPNNaIEQR2~~!nv_5U5Al*|&XYci(%U!#n`9tQ0iwum zox!%W9I)lP!Kp;CnNu8|Dax9t7kNHr1)|8!`krtq{e4-r$WF=-UvbADgc4gjD5Dw_ z8F=VCSF031fHqG`SfQj2BI+TW`bW89>N|MRIn&9Kr5U5rCc0Z&Z*d+RO13it+$z5T*>Y>vNtv!HniSp+62ncK-I({ng<1ZLj-jOP#O#hr&%oNl20EqOeAws`8lJp5h7We z$`3J(mFJ8qQu(o?vGPoJb=upqxbwh^E_$0I9lP$6VsntfLtrKC&};%I_#>F&qE|o( zB~PL(RWhERBS0DoflK%pi46+cnWy)}`{8efD(VG1dxI<%0|md-j+LA%PC1R>JNj00 zqnxWK{nr!SU<=hgPtwWtKeR)ikV&R@`UlH8)u!-`jluFrb#)4#xeOj5l(#&EnoJ!c zgWOd0J7W`d zN}NhkC(0N5mMd|e5$V|Q{*qK~&O_M!vdpng?eTO%4HkIn$Z)g7g|p_D+L3UGxC{^f zWWLBTKwc%tpzznuhU_Cqzwn=(4e2CEO8Bj3Lv|A+K78d_ki_2;Br04RQD*3}#p5Vk zl$;#YCY|JH@`?L$kT}#Kwzw#>EzRaooe{A(Pi0C}%(lr z$}$QyFgtQFm!N>KB8DmySmIQ(Eh0nav0$18}No%5#^rWL> z`N|pU8RUt`u=R|9C*ll){gB=y9HupxwDDegfHa2mP-DmlZNq*#cXZbfhuJ?0PRxmg zn=90W24pG$H!Gy&y=vgu`H%#kHZ_`DQ0)dAAzIy}^h1o?G}*qZz4u=}_Jt_(Z0{P{ zsHx{Lg|tw+NjJ8Q-lEuomwkmhf9fkRFs(P8)l>Qhm#9hnpVq{fmpHX~PMqdtG^e5~ zD&SOjPt=ql`-0|Fbo8Xq=1UG%rrstr^?`rswGq(l0hr#Gi3+|Y05Qn(og6*S)&Gn( zJ3WQ0HqcDLS~X~aG?WnPUlT)HB}wz4Xr6#FLmEdPZ*=wl$Eo0iA~+ z2bsMA)~9)GofSNFH}(gh%JG3BAM0127-KK=L%-Jh2;oqnk(?eS(L-Tz-Hj!-4UgiLD*mDI-Yp}BaxaQR+ z264ev4r-wI&<08{PQ$b*GM{oM_QD2xB%zI}48s`|vl5H56sr1_Ee3ZLafQ;&P36ic zZ*$YA+L{%ks>;hpt(rKYbi%liwKetLRU@nFy`v_Ls;Mup^;WnAo=lvLx1z?={0&e> zc~&>NgAo-7p%|h5a!={3g2FsxV23jh z14T^(GBG1-Ufo>kZfdHnY4!**uxdsO&wDD$JY^!Lutfaf9_`N^m?Kpd`y4Y@vLwrK z#yl)(ROme-i!sX#W_y-dDp~a9jJ?E=6*+{d*~~SDMgNtBS2DJQ*`DVJOId^|Gmf#l zpJkDjag3P;$1(FxrY>f~ZeX?(Ej)eeViviCh2P37H7vr*5_hw4m5M1$4PS)2X*;&_ zOkrW+vzdj$IcylgJS>fZN*1x0MeSy)WifM&WzpuyXBcZ?w#8JseJP86k406o6hfWN z#!+Bd#4MKMmQ~DlH{nE@8)vf!vttoc2b#<)V4{Z3COix$ub2nxheop9mC8YvsBYiScZqCawALOcM&Ixvc!`~ zC3DOSiJ8H1()nG)1DN9`FslXTwv&Z#*BYFQx1Cvvn5~7y-1-W$yhbt0PG)am5tio( z)l$eDq85OJ*RVK|z~6~Idm%4V@u_{%1dSE8c$i&v`pbC`-*v41xV zrg?SUzs|LgxoF>0Hd|E|`57~Nm~|9O@-VyQ6thfaV@R{J*#HWVlR@DzW}Cw`Z@N@8 z&1{C(1gWn_E+y-N^*Ekqk;hp0RK~Wl$Y;q=W=&wxmfbA;7+G1w4b0iXVvkw=!W^bS zaV(y0v2=^1o0`oV&H~SgzkT!FXt?sKe_gxvL%V6;gfrVzHok?8-p+tY3kMdP!(uIH1YpKZ zXXcj0h#qJ0)0x`BGNv=@ab`9R0o-(cGV2F~Wl@%a%)Ak;IDuM`yhGH- zEN&AsTaIC%85?gZj=vngWv1ddxDZn&_aSLx3CrA~lOe-w8DN?NbGVDxq`}F2gY?)q z%W>1#IQ$RL*+`%k%AINexJDC0W|d<0AI;*BJg1PU6Il4iEJ4^gt75URYD*PM9?fi@ zKq2QRpa2$anwmiRW{c5(w!(uQWA;(T01Yt&EKFaCo+LXC(9~^g*jz}E#iH+G<_&xd zHN%er8Tjl82+_>Xk?OK69!wNWS#be9CZO8K zLG=o?ri@Ly2-GWssM$Co0WB#Kt-qLMj@A4A-@|q=$MPy7|iG_%V<8DOtZ)|xQz%)BC})GM~pbl`IwlpJpkhF>$P)B^!fzI)0JnNDM{&g@H#_S$3dz{lM}l z${xcaJ)%?2W)5^pOV&=7w1GurvT@I{{u|gtP$zF-PV`he{<_=%jB9{eroj&mVD=rD zCrBQH<}e3j03_}P7U5yZmc^DhR3{15NxcX3<3mXB*`-;HstxxDP3V$9_SOxW#K$EWHqxL$mXje)8#ChwW} z!qGcXEVPm_j;t`+G$|f+$t0npclI8eLy8T-L*7b}*K;hwT<*!qnURBwMGmBD^dHA! z(VzJkh{=bFHAoJN{hV@8Bikb^`Vm?KB%3BDvEkcU@?DJKzWD!icWz)~p#U2FDA>+s zk~$W##T0DknFvrwZ-_)@vN+F$@{M`@eZ+hr-LfF*5|**JMPzkRXoN+~irK@nOK6r6 zf%GzMd`_%l@!Ofh%P=`}j$#fpJ)e?e?On}MEK69_F&2kTv6VSsMCd1@%@t_*NVCg@ z#^K(llP`z9BU>$XWi|g4@6)r(p`ld!e26((r2!PJVZDpRV6=l%$E4{mmiO4edof)Z z!>l`bS4WpcZ^ih8f{Jr-_`bkP<`+9znOB9tdDB2Nw)XD0IYwpuuu|HD(K==sv!NBRn4$(+ zB-#tjg}KtREM^IdzK!poEvCL1bt^4{;@A+(Z+CwKT8=+Fjtv6-Uf|o7F!NSo+Ixw1 z4JGnNrV$A&if*b2Jcf>8Nmx&t206KG&x2j$lJ}7@8Jjj3yq<@VzR&0HbJ)<)EcSV3 zGh0ogRThC29j0W-UY6#ikuKfK?5mi%lMTRZ3QD+vMK5KRTUkG!y3}VrjVP0|< zi(W=E*a(Yv8JQCBV;5sCK>-ct(a1Wk&CvNu6ry8E7X{I=?vKL?A0yd&WET-Ns1Rlg zm>bMtgU7P)%fpPkAQh&i!!Q;S^19Td1f2j-N&@NwE!U;t7}9#ZZ=C8 zBX`9kKA??n`>iAx=2EC&JjThxu+Om^a2o-JQbiYO!U7Fj;Sr=28y2KLAgNN&5x&HJ zBn#gvb{H%9)--03aTp68Va#mZ!eVxt1|~4et1P~T*?$I6ULjGV_pm5Tvszf(8!Y}2 zW`E4`2tabL6;n8<^;u@ay@lCaA%GD^;b)ZL7Yz`kM@ zb6|>$-U1KJw~oI-%&Ai(KyZ+>CPLZ!B$zRJaK-umX6s(N>YtES$A$H;Y_vK3H7 zuEyT*U|G~174$Zit|)7E3&qSYUcjF|*OPWU4OhAAOQ|{wix(6Y6r-k4Ykh;VaCKcV zF$PRjskmU?T%hG$qBPfB>xP!ekMk0m++`JlKRw^B2hxK1xeM~CND~8IZ$e& zrwJ@C&Z8R%Dw;L7bY|XyyjjSkG7!KVsBXE0*;G?iO(sHxQt_l~(e_+Lz$rE;n{-@R zQ(sm~%M*^v8;PS9m(H5EfS4AR&+8FZUD{YyF`h8FiJ)E-QA)4jZC%<>S=sFN5O|idklPz?9LS3AD|@M#dA%2w zUYfh0Aa@1~y{fihMOm#;A~I&`CDb6?8W-jj6$BJZy@huzZeyc03+fvh0LIf?t$|@f0F+l6(j;b{!d(S4xDY)RsfOB$fL38_ z!Yt_E2H}*@vRZCI%kQ;$X^=b~CvC-hX&kh)Z4)5V(O$|Xc}n1V}TVw7DpKM%Es zUyk-!lnQRbqLWay=TRAmiOS6e>P$^~$)=4YD!Y=CEu%S0CjF-bG6!vfF3 zxFoW&58rJx97S4jr`xI7;P1$&<3HcW?!( z2mp3vj05zN_#TvRF^Iw<`$vPg1lnUqgkoMk66LowC+8Zhk4rYs$ za;0PT#&i3TvF@pA3w3+E$39|3DXMo`RXK3V;>$*Zaul@P3?q4I$drh?~fy{$cl#T=q1zKQKb|h^E+`(vc#5#6v6%(ye%XyprRKAFEomCB5j_z zfxUJG1(nvVH5*-NYJI=1DkcC-rHjQ+snJTHjb?xpMlp&9Io3j=nz)%bG6g)TCBeAA zRyY@gQ6w!?s#e&V6O~eB)@*CuEV}kRAZ)iAk*Qh_l2#4@Nn5uq4Gsm8dLqw0SEXuu z5lOc$F72W1l&kSRJPX7Jf8W|m)i^96w>n|9=tSGJ<66bE3N0z@s;#o7<%Ag5+)I5e z?4V4mPHX=Rx<~88eMfH4Xv8;W$r)K1!w>l3X4YilV`eH7$DRh6_=%>MiJxSi%fwGM z&tk%(AI7jx%d?p6=!Y?Ls(CvTe~-BYe+Kizm^sZ%;jhVl7&8m-mtP;1;mFfXE)&P! zlow^`pNZ{fvhaoGSSG&6JhnYc|14vsv+%RcuWDKNV)J%03xBVf`c@Xc#7t-6=a`vH z{C#HX!7M-c!(1;5Ki3>Mn1#Q87z8qA^snsc%VXxeG{Cbl-TBnJI%aesxAcWElS>0Q z!_Rk2xP9xme*rZCwSS>mh$2V^l(@wwJp4l92R!_0;PcG6<`DBi;*+oupLu3D|D{+Z z-Xor$IjcWhj^6;Dm3}FvEc~Gn`1gTJyr0D%B_ynI!u$v_%g^J$<-QK{zO;EfW$~qE zx`zXVoc%WD=aBQvQgfi^fSeQND5T)Mo&$1DnCBrSJ^n_heU}z*}Wj^eop}|epXQ*Q!;E2s!Y=9?*g}kxWCuj1;DfXFQ>lF zV7Qh3FD348K{HO=-^OMQaeq6Uj}iB`+}T9j-_~avaepVFUBvwzi9+B~AC4S!3CF4p zHtYeOb-$lJ(dC=cr{mPWo&Nnj9QKd!b0_tcnbTFBzd+nyF8Z6q{Y9(4N8Dd9`*Gs_ zve-v~XWiFtsINTDBfPH{iTevVzDnF*9`a4%{z8-gB7VjO=U98X6F}Tb{nTYXwLYH) zTVJyqktIK~(x0Qgze<u#QIrm9=L-ENrja7V^{IHTx0bhqt>Mg1HSp zBku2xc@+2}w3lNCou20BZ>fLXgu|s@mhcL3e<%AlEberY-wW_wCF%6HtCsgXiB~t1 z(Rj}Xo=ZC5@wL=Hz;tT6{s9bgs1K%>HrmQ~{Tm z^PK!8@zoc)^B(c%i9f;T?-=oyh`*L|`dgeZk4d@DAAWEAEA*v&b#opw?F?S0pA}rE z?`r!0J8^$8p?8V5Z}4NDbmbbK>Yli!{t3d!gAup zy{8YVZKD%Uxe*m`qAy* z)Q_wkEB=*X*e>)rayIcFvb}$Tw&z)V*wN+G*9jYUQ{}o5`X8shzXabcz}e-c zBKZ^Bg}*j$dxZZl0+;;nF@LmNOw{UN2(VNF|1QJmjzI`IwIBjTi@y&CL9r3YxU`UN z7)WmiVRzQZNO(2w#KruYRjXHJD}jHlR{}SFiJ?}EF_u~&iG+Hq&A}vb7RcCbN|iK| z9mPk|96d5%LjWmN&}Rtxq=Yw?FN%YaeaD+5xCso1!ds=7A0NMFT!u&8AiEn(=P0=y zN7qqkJ7g{wFs>;=Mz%%D;I}=uW9>SC-XAvSfV3OB<`mJ?P_#b+ogOJ38gw2SVfIIS zGe?g52<0)5^xMG`98mZa%4F{tRJa@>j1X(^$B zcu?TV%a%Fjl~n3!3$g;zK-27?Kj&b;QKCBn2O$hf3uMoLzCi5&*_d`eVEM^Tl)#_V zJEgQ%f&@&Eok38pVFrgwxl}{pUlDn`5zK&8mH9d{%|&L31VR)m58|_{wk!t(YM-oR z&PYvmyj6lNuGtREPbJCCVQyDxWXHN9!anI}t5qAsm}8%{7az<@X)6r_DOYrx?Dhe;V$FZir2)_ z_itI)lAUgl&aWUqV`b08Mq;^1wCBv$oZ#_Yg|NMPr&a8Fm1@9~p~|5*X|&Q2J9aAw zqS;XTsIZC|18EIhlgC<6kZx#jX`Iu%28i@YCXYuSCX7I0wt$s0dW0m#t)|J>F@GeF z1w`_oLBWo8<`Ph$Td5XTV#->Nj z+6!MLLE4`LjaSR@VPK-7_BxMX>dT^S%poWG-)gV&Bp4^{O^>Qyak9hs)j>`VC>P+m z_|o{5&**&BDI6-K4RYyIW7m%Yw#viRUi&Y-tjSS%E)Miqbwqxf@h{Yh#f!e~2S?aH za<4NuM+Ztq*k3im{+U;u!HpP_O$I;y^&{-heAiiB#&It7;oA$JESR5vA6@D+=gY$> z5!5~@y)3fY6U&^&0gl681T?}&>y19YP6eiAZw>i%ghWVBD=u-3S9PVk%CespVjbaD J&%ir1{{`$`5Xb-k literal 75208 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 diff --git a/lib/printint.c b/lib/printint.c index 7a2a8b4..048b9ff 100644 --- a/lib/printint.c +++ b/lib/printint.c @@ -1,4 +1,11 @@ #include -void printint(long x) { + +void printint(long x) +{ printf("%ld\n", x); -} \ No newline at end of file +} + +void printchar(long x) +{ + putc((char)(x & 0x7f), stdout); +} diff --git a/out b/out deleted file mode 100755 index 3e14d33fecafc170afac891e7cbab5870054b4eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16848 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 Jvmv3~|DUCOR!0B; diff --git a/out.s b/out.s deleted file mode 100644 index e1d8803..0000000 --- a/out.s +++ /dev/null @@ -1,59 +0,0 @@ - .text - .data - .globl a -a: .long 0 - .data - .globl b -b: .quad 0 - .quad 0 - .quad 0 - .quad 0 - .quad 0 - .quad 0 - .quad 0 - .quad 0 - .quad 0 - .quad 0 - .quad 0 - .quad 0 - .quad 0 - .quad 0 - .quad 0 - .quad 0 - .quad 0 - .quad 0 - .quad 0 - .quad 0 - .quad 0 - .quad 0 - .quad 0 - .quad 0 - .quad 0 - .text - .globl main - .type main, @function -main: - pushq %rbp - movq %rsp, %rbp - movq $12, %r8 - leaq b(%rip), %r9 - movq $3, %r10 - salq $2, %r10 - addq %r9, %r10 - movq %r8, (%r10) - leaq b(%rip), %r8 - movq $3, %r9 - salq $2, %r9 - addq %r8, %r9 - movq (%r9), %r9 - movl %r9d, a(%rip) - movzbl a(%rip), %r8 - movq %r8, %rdi - call printint - movq %rax, %r9 - movq $0, %r8 - movl %r8d, %eax - jmp L1 -L1: - popq %rbp - ret diff --git a/src/cg.c b/src/cg.c index 4acfd90..ecef560 100644 --- a/src/cg.c +++ b/src/cg.c @@ -103,6 +103,17 @@ int cgloadglob(int id) { return (r); } + +// Given the label number of a global string, +// load its address into a new register +int cgloadglobstr(int id) { + // Get a new register + int r = alloc_register(); + fprintf(Outfile, "\tleaq\tL%d(\%%rip), %s\n", id, reglist[r]); + return (r); +} + + // Add two registers together and return // the number of the register with the result int cgadd(int r1, int r2) { @@ -213,6 +224,18 @@ void cgglobsym(int id) { } } + +// Generate a global string and its start label +void cgglobstr(int l, char *strvalue) { + char *cptr; + cglabel(l); + for (cptr= strvalue; *cptr; cptr++) { + fprintf(Outfile, "\t.byte\t%d\n", *cptr); + } + fprintf(Outfile, "\t.byte\t0\n"); +} + + // List of comparison instructions, // in AST order: A_EQ, A_NE, A_LT, A_GT, A_LE, A_GE static char *cmplist[] = diff --git a/src/expr.c b/src/expr.c index 6ae2d3e..aa15cdc 100644 --- a/src/expr.c +++ b/src/expr.c @@ -7,7 +7,7 @@ // Parse a function call with a single expression // argument and return its AST -AST_T *funccall(void) { +static AST_T *funccall(void) { AST_T *tree; int id; @@ -88,6 +88,13 @@ static AST_T *primary(void) { n = mkastleaf(A_INTLIT, P_INT, Token.intvalue); break; + case T_STRLIT: + // For a STRLIT token, generate the assembly for it. + // Then make a leaf AST node for it. id is the string's label. + id = genglobstr(Text); + n = mkastleaf(A_STRLIT, P_CHARPTR, id); + break; + case T_IDENT: // This could be a variable or a function call. // Scan in the next token to find out diff --git a/src/gen.c b/src/gen.c index 898fff0..45dcc2a 100644 --- a/src/gen.c +++ b/src/gen.c @@ -136,6 +136,8 @@ int genAST(AST_T *n, int label, int parentASTop) { return (cgcompare_and_set(n->op, leftreg, rightreg)); case A_INTLIT: return (cgloadint(n->v.intvalue, n->type)); + case A_STRLIT: + return (cgloadglobstr(n->v.id)); case A_IDENT: // Load our value if we are an rvalue // or we are being dereferenced @@ -203,6 +205,12 @@ void genglobsym(int id) { cgglobsym(id); } +int genglobstr(char *strvalue){ + int l = genlabel(); + cgglobstr(l, strvalue); + return(l); +} + int genprimsize(int type) { return (cgprimsize(type)); } diff --git a/src/include/decl.h b/src/include/decl.h index bf9fac6..0ed57cb 100644 --- a/src/include/decl.h +++ b/src/include/decl.h @@ -2,26 +2,27 @@ // scan.c -void reject_token(struct token *t); -int scan(struct token *t); +void reject_token(token_T *t); +int scan(token_T *t); // tree.c -struct ASTnode *mkastnode(int op, int type, - struct ASTnode *left, - struct ASTnode *mid, - struct ASTnode *right, int intvalue); -struct ASTnode *mkastleaf(int op, int type, int intvalue); -struct ASTnode *mkastunary(int op, int type, - struct ASTnode *left, int intvalue); -void dumpAST(struct ASTnode *n, int label, int parentASTop); +AST_T *mkastnode(int op, int type, + AST_T *left, + AST_T *mid, + AST_T *right, int intvalue); +AST_T *mkastleaf(int op, int type, int intvalue); +AST_T *mkastunary(int op, int type, + AST_T *left, int intvalue); +void dumpAST(AST_T *n, int label, int parentASTop); // gen.c int genlabel(void); -int genAST(struct ASTnode *n, int reg, int parentASTop); +int genAST(AST_T *n, int reg, int parentASTop); void genpreamble(); void genpostamble(); void genfreeregs(); void genglobsym(int id); +int genglobstr(char *strvalue); int genprimsize(int type); void genreturn(int reg, int id); @@ -33,6 +34,7 @@ void cgfuncpreamble(int id); void cgfuncpostamble(int id); int cgloadint(int value, int type); int cgloadglob(int id); +int cgloadglobstr(int id); int cgadd(int r1, int r2); int cgsub(int r1, int r2); int cgmul(int r1, int r2); @@ -41,6 +43,7 @@ int cgshlconst(int r, int val); int cgcall(int r, int id); int cgstorglob(int r, int id); void cgglobsym(int id); +void cgglobstr(int l, char *strvalue); int cgcompare_and_set(int ASTop, int r1, int r2); int cgcompare_and_jump(int ASTop, int r1, int r2, int label); void cglabel(int l); @@ -53,11 +56,10 @@ int cgderef(int r, int type); int cgstorderef(int r1, int r2, int type); // expr.c -struct ASTnode *funccall(void); -struct ASTnode *binexpr(int ptp); +AST_T *binexpr(int ptp); // stmt.c -struct ASTnode *compound_statement(void); +AST_T *compound_statement(void); // misc.c void match(int t, char *what); @@ -78,7 +80,7 @@ int addglob(char *name, int type, int stype, int endlabel, int size); // decl.c void var_declaration(int type); -struct ASTnode *function_declaration(int type); +AST_T *function_declaration(int type); void global_declarations(void); // types.c @@ -86,4 +88,4 @@ int inttype(int type); int parse_type(void); int pointer_to(int type); int value_at(int type); -struct ASTnode *modify_type(struct ASTnode *tree, int rtype, int op); +AST_T *modify_type(AST_T *tree, int rtype, int op); diff --git a/src/include/defs.h b/src/include/defs.h index d4207ae..1d6d26a 100644 --- a/src/include/defs.h +++ b/src/include/defs.h @@ -20,10 +20,9 @@ enum { // Type keywords T_VOID, T_CHAR, T_INT, T_LONG, // Structural tokens - T_INTLIT, T_SEMI, T_IDENT, + T_INTLIT, T_STRLIT, T_SEMI, T_IDENT, T_LBRACE, T_RBRACE, T_LPAREN, T_RPAREN, - T_LBRACKET, T_RBRACKET, - T_AMPER, T_LOGAND, + T_LBRACKET, T_RBRACKET, T_AMPER, T_LOGAND, // Other keywords T_IF, T_ELSE, T_WHILE, T_FOR, T_RETURN }; @@ -39,7 +38,7 @@ typedef struct token { enum { A_ASSIGN= 1, A_ADD, A_SUBTRACT, A_MULTIPLY, A_DIVIDE, A_EQ, A_NE, A_LT, A_GT, A_LE, A_GE, - A_INTLIT, A_IDENT, A_GLUE, + A_INTLIT, A_STRLIT, A_IDENT, A_GLUE, A_IF, A_WHILE, A_FUNCTION, A_WIDEN, A_RETURN, A_FUNCCALL, A_DEREF, A_ADDR, A_SCALE }; diff --git a/src/main.c b/src/main.c index f82a46c..16736a3 100644 --- a/src/main.c +++ b/src/main.c @@ -59,6 +59,7 @@ int main(int argc, char *argv[]) { } // For now, ensure that void printint() is defined addglob("printint", P_CHAR, S_FUNCTION, 0, 0); + addglob("printchar", P_VOID, S_FUNCTION, 0, 0); scan(&Token); // Get the first token from the input genpreamble(); // Output the preamble diff --git a/src/misc.c b/src/misc.c index 7892f3f..6a7ae7e 100644 --- a/src/misc.c +++ b/src/misc.c @@ -46,6 +46,7 @@ void ident(void) { match(T_IDENT, "identifier"); } + // Print out fatal messages void fatal(char *s) { fprintf(stderr, "%s on line %d\n", s, Line); diff --git a/src/scan.c b/src/scan.c index bcdb610..764339c 100644 --- a/src/scan.c +++ b/src/scan.c @@ -39,6 +39,37 @@ static int skip(void) { return (c); } + +// Return the next character froma character +// or string literal +static int scanch(void) +{ + int c; + + // Get the next input character and interpret + // metacharacters that start with a backslash + c = next(); + if (c == '\\') + { + switch (c = next()) + { + case 'a': return '\a'; + case 'b': return '\b'; + case 'f': return '\f'; + case 'n': return '\n'; + case 'r': return '\r'; + case 't': return '\t'; + case 'v': return '\v'; + case '"': return '"'; + case '\'': return '\''; + default: fatalc("Unknown escape sequence", c); + } + } + return (c); // Just an ordinary old character! + +} + + // Scan and return an integer literal // value from the input file. static int scanint(int c) { @@ -65,6 +96,33 @@ static int scanint(int c) { return (val); } + +// Scan in a string literal from the input file, +// and store it in buf[]. Return the length of +// the string. +static int scanstr(char *buf) +{ + int i, c; + + // Loop while we have enough buffer space + for (i=0; itoken = T_LE; } else { putback(c); t->token = T_LT; } break; case '>': if ((c = next()) == '=') { t->token = T_GE; } else { putback(c); t->token = T_GT; } break; case '&': if ((c = next()) == '&') { t->token = T_LOGAND; } else { putback(c); t->token = T_AMPER; } break; + case '\'': + // If it's a quote, scan in the + // literal character value and + // the trailing quote + t->intvalue = scanch(); + t->token = T_INTLIT; + if (next() != '\'') + fatal("Expected '\\'' at end of char literal"); + break; + case '"': + // Scan in a literal string + scanstr(Text); + t->token = T_STRLIT; + break; default: // If it's a digit, scan the diff --git a/src/types.c b/src/types.c index 03f14ed..eeed2e6 100644 --- a/src/types.c +++ b/src/types.c @@ -95,7 +95,9 @@ AST_T *modify_type(AST_T *tree, int rtype, int op) { if (inttype(ltype) && ptrtype(rtype)) { rsize = genprimsize(value_at(rtype)); if (rsize > 1) - return (mkastunary(A_SCALE, rtype, tree, rsize)); + return (mkastunary(A_SCALE, rtype, tree, rsize)); + else + return (tree); // Size 1, no need to scale } } // If we get here, the types are not compatible diff --git a/tests/input21.flow b/tests/input21.flow new file mode 100644 index 0000000..3887f69 --- /dev/null +++ b/tests/input21.flow @@ -0,0 +1,11 @@ +char c; +char *str; + +int main() { + c = '\n'; printint(c); + + for (str = "Hello world\n"; *str != 0; str = str + 1) { + printchar(*str); + } + return(0); +} diff --git a/tests/results/out.input21.flow b/tests/results/out.input21.flow new file mode 100644 index 0000000..7b83769 --- /dev/null +++ b/tests/results/out.input21.flow @@ -0,0 +1,2 @@ +10 +Hello world