From b6949f6a73d3f4202a4b5853a63a0bcd745c2da5 Mon Sep 17 00:00:00 2001 From: Nikolaj Gade Date: Wed, 21 Feb 2024 14:01:22 +0100 Subject: [PATCH] :sparkles: --- documentation/plthy.pdf | Bin 22438 -> 22305 bytes documentation/plthy.tex | 5 ++-- examples/guessing_game.plthy | 6 ++--- plthy_impl/ast_nodes.py | 43 ++++++++++++++++++++++++++-------- plthy_impl/lexer.py | 7 +++--- plthy_impl/parser.py | 16 ++++++++----- test.sh | 0 tests/02_variable.plthy | 2 +- tests/03_math.plthy | 14 +++++------ tests/04_scope.plthy | 2 +- tests/05_maybe.plthy | 4 ++-- tests/06_if.plthy | 2 +- tests/08_precedence.plthy | 6 ++--- tests/10_E001.plthy | 2 +- tests/11_E002.plthy | 2 +- tests/12_list.plthy | 4 ++-- tests/13_because.expected | 1 + tests/13_because.plthy | 5 ++++ tests/14_E005-random.expected | 1 + tests/14_E005-random.plthy | 3 +++ tests/15_C001.expected | 1 + tests/15_C001.plthy | 5 ++++ 22 files changed, 88 insertions(+), 43 deletions(-) mode change 100644 => 100755 test.sh create mode 100644 tests/13_because.expected create mode 100644 tests/13_because.plthy create mode 100644 tests/14_E005-random.expected create mode 100644 tests/14_E005-random.plthy create mode 100644 tests/15_C001.expected create mode 100644 tests/15_C001.plthy diff --git a/documentation/plthy.pdf b/documentation/plthy.pdf index 46b1109b8844f09aea2ba7e2854cd1fad406419f..e71e68befd97d8db081ee8b356e52c9783d52c60 100644 GIT binary patch delta 12309 zcmaL7Q*l2s727Meopfw;)Un;MjZV@r{{HqE=Zt@U7w4{O zjJm0JKK0I;v#RU|WMLg-B0rP>Z;~JbM$XC_&)Qzq+q-&kn;Ma~V}q+WBqSWT5mEq> z8GH^&590s+%9@wQS`!hvE|pwcE;lAGp;TtCR(=$~mL*;QyYGB+F9h`6E(8V5)QXN! zc?hSKnN@BYQWvB9LzTfbQY^sEw_Xv^Qo|NA+5%vEbaY{QuLDv*0XlZb`pD_Ndt<6(&C)Megq9TDyv#+Q%4?}S-nFPK6Yw83$nA_mM z4`lxqMmSR5zBGo$-`IJ!pRJE@9r?%Uh|0ETt>u2c?yPHm$r9i3UpQsv1(?5aba;)VxwCi!K0<2#U-@FQcH@x zplB%X1NkkX?$IT;9$=GOCA}i9g1psOyq8^GaqrC~bCjWOz;+(3vEnOZ_y*&Sc0yX7 z-3FVQtcstlYKw0rQ`2P?*s|C$kyV&z^ei*%w$1vpB}ybZoQcR5$+Lw%Dcr+d7o-`l zZ?GWDrF2KI!#17SeGAKbU(%%|L0AT-FDRii!DlWvrzbOa?MN3{REU&1Up56(Vt#y2 znAOu!i)ZNP+u#Z5sZxBBi=P& zs_~etH_^5#qt^S3JH|SSGWr)2&yO71a0a3)O?M`=^&xR0yE9Q3Gep(dVZeJ9_ zU+X*aMGZ*9pmR70E-i5hNP~!Q-9T@fK+4}2o=ShfoUj_8544^z9}x1Oa3@?MS2r0& z79!j4!5#{tDw~N47586NgtyQ7O=1~yS5h1>C5J$Py#n;aXddD%!supJ;9UlBh6@x} z%Te{8j?sSy?W~mNXYm&?wYKLmwo%t=S>fN0{tndgQf07~afPE^_*A!2;`)|h$w=W= zrRCHmK=gxpQ3g**l}*k(W8)`JX$HTC>wW7Juwdn26et#6*+xL045CfLSahohDX)=Gs7cJ|MRr7Y= zRN?J|xw7h=sU)P~lV10l`4O6Uaj&v3bU<|zKEEDP$epc6y28X4%GM5BFS z)+|a70R)9)oOUxS+RvsWCM<3GD$&zOo%e@;x_~?}Ro2uybKhU)9U477CTAcT_;~-5 zo(){dPB(Xl>!$vOq<0t@2?#1??54SItKGMigY@aI^CT^a&<=Il=iHY?i>PubZ~)D; z03)n;3+xenjqt2-NCnJwhQbQR6d2l1-I?I3^ELLRI^XowD}jJ9MLGR~ZnPAiM%MV- z)df*h9J|-t?Z#>M*Blk}^i}+#mY(0fr|&N1$WiEBOC>quePW?P{$$IRZd0GUvME91dKr`R>Ug4Yf}xWle4R`u4vDXO`EfWFkC0kA_{5>OC&_K zBsAMV=?FBqQrcYyJS+r}c*Q0b_{z}rs;B5E!!#|{wtPQH`LkBhkHwkt2M4;k?MG{p zbmH>&zna#}&J?cgVD@U6(Y8)OkMj!`yL+<&1_JRtOFOUTfh(yjvV5oq87zfUOs^F% z6B0SE9XYKO>*u?3RRBg`4%92};{}iZ7?tl}2-}nYDlT$TK3M{me;97cuaV7~1_|6d zbXzR9-v8`23F&{+FsET3!hr#?^9?jC;uTxe(CS1nP=*V<)UkVooD@RSJsc=vvtJTKK-Y`GZ!NBu%>h(^* zaO!*b>-yNaPVPB_8-ow1_ov%lk0>_hb`IvNXL&4nL=_tfU2wUV%YXe%3lk0uwHGcB%51a*=X=f#%or{r-N z|0q)bP?3&S(BdxbiY@IqVLSD^n&KDy#@!+mcPdEh+UDiQBc>!4e|q>OY{r$?vFz)| zE3_SH+W$ih5(+(t_rIy>R~+KN=s9LSYNwi~gO@;nz0|C!XR>0x;8ZE&H3KJ>MSS$A zv|jWNqD*E#S{yf&6DXIUX<`>quI5F-clQpk`TJ#Iedshxd z^mU!LzjxOUwLQs+h^viRxmf`t#^WUrb$yRh0w9-KwU(5`MHM3YhvOc}AX0?&rBAog zs@yC=Ea~p-5*0Pz&j&tzGp3@Zwl_)7R!PpUHKj0#-&^UmdVz9|;f4HBksJNEiNpy8s^gSh@npydAn4JT~-9oPGUKqfA$Sv^!om(H+_ z)9|Ev$&kKTqv$`J4UplfKe@Tj^ayr1C6{K}!5syhwoclbt;lL;y?8CsHXtv>x%o|3 zm65Pyg1p(kjHsZ=JZfx2bsXQVKm2`q3lM0o`rC8JzqAjkot;>4y++oV!;MHth$m>v zDSa*`Kgp}KpWq{o;QXd&{~{r_3NUQJ_sMz`^_1z<;5E!i-nclhSlK*LwKL1Z9+91v z`(|mVv5iZ6D!Fvv&}}>H(3G!pky!OH44v)OktPk}f0NRj-NtnPp-K9?er0YcfjbhkwHtV@Q1M81@~4&8J(E=3i=($x5Y1bpr2SljMqBH^ z>r2hscz5u46uv6QhNWbHs6~;Xv_Z|LJsH4dh+yTy0lmz!ibFc20WjcuD5G0gCHSJJ z@QI@xQfLvrw|g|9fD} z!2wvD|I0Q0<>F9|e=+!o7Ib2aAvfHNL8#TyIcY7ux)Px)My*kZ{Ik>dLjj0RD!-HI zeH_Bil3j(lA^ucL>o_Mq1G^wFrvEh*4W2Dn0PojLSKx(+QYTB3!d_~ z4bO^!^jc~3%=FSZi>F3{)=5lpw3s5I6au0mHD`=X2K8nfHO^ zxD@eSTW(ItKu=M`vZZ`zj;SFyJ-b!^YcpBaJ3;q*_ zp@L=C#w&EUukR^%0Q<}T@{9TP=zoa`ZpSyDD&073uh6cOVn9b1}76uD0WWY`RFQklyuxxB-H-U?LR%VGoYWM-DJ5UWmJjmy$8s2izj&56D5x)?HB z8&g2ZFQT^kBw_c?>myS;?!}(>Y_+yK>QV=-pVPWa>1f0)rH_bDa!)VpajGsJHeTuD z=*O-p=?STx_48e8gNoDtuBTVYw=|k(+iRY%4-2DwJCj$PY}nKLoR;yiG@TQOOioEe z)lX`Q&5&8+0>l9SI&UFkcvVlB7A_w;HL`rmnT^x+&P%(N5Sk<;Eg(&i=v_v0HHQGX zGK4CVtlUnG^D~5^&5|inV5dutE_?=RPD%tJTPFS(CPnautDyAYunsj6U^390mz1G= zKvvg?d>0s+GF2xZxq>{~w|eXm4RD`6m#HDWcPMbvvFlLXwCdDY7ILH&5pq3=;8hd@ zVMaCA{C`wB{?Eu6V29N79XE*>#KFz;f4hWbI-(Y~F8&C;IF|;cO}Jk6TxLJ4(W+7B z>TB&@2VyKyM5Twh4rUgobpY3=C}}Qn8MVeRZpd!Mnq&rx2TQO>0YQ zp3uW{ZUA;VTRGU>Dmk6sd8_O3c3 zCvmfa3CGZj`YDKT6(5|9{ovx|H?wx?`tMS!gU7RM+vGtaAwO??d7P&qE|`Gd*U^0@ zJhwHwD;z~ZihxK-Z-jtbNOy%nL7684G>N4&=wgt~&LGOq;vF2Bab7kIFR4j+5-?`s zADnS6OMeFmXCvS2;>kJA6LZDBd}m|g3^%+O4101Z3`c3;&C7O>KPYPHtO(Vc#+V4R zr*7vd<{KUzE+v>xj{WM_?qb}XG{I4FBKRk(NM%-*u!Yme01(R;rnF?+QIKlBy8$Hy zV8SQqQ^>Yiblch@v0k(jG`6#wx9{z(v~?8?PZ0oZ>op|I@$cHw7yoz{y@pki8te(d z@4+P?!aD(HWsVOMX|@wM+G+U(&mHG;zTe?fl37F{4ru|1c4eNh7NQ7;n1`x|9QHh^ z0`=rWF(#sLr3Ek*q_O`Dt%v5VDg!Z};{gQ2A#^sr;<*UbLlT-S&tv@yh10v}Bft^# zTn~`yNJ-p0xuu0AVPk@Pv_mrXt@d@b7&LYx)oU(8I*H&BW}0^ z$|yseOQV7(1^FR&p-%H_AkqE7 z(TFcE$N87G%=hFhrW`oxCN|LY;{z{O3J3&c@X73M)C$741N`x!&|ciN?R{p%%>I%9 z3CV4zmc|_|moi4zzGn8EcuP5o(cUlbQk)#>Yo^s7v-Rz!B#<|XP!b8zPn_l9o7sr0nw^pl%)@Vy;lI{IGbgCCqY-J&#b$Ntq+K| zT2R;Jo%rvX8wFdysNYlnRMuA>46(^!E$VE2rxua|!x~H08iFdHX71`y0OQs;ivgVo zVWW#FM%+X_e_n903r?giLr5tFtS*Q`KdgRmk-GhXq3b7Ve}w@7FR84?HZmiJvUYYv zD=^jIRw-lWz%vt*#|ra1TAmCCkyfs!)tyrs(#&{634UdM`2k#-E}L})90?CPSTEkR zdmmQx=9V&1w*jd=`X~CY!2AQ`8~0Gw;E*cQ6+*(w1sPedvzJ#Pp;y9<^Lx;bR{F}d zN#uBd+xMwN|FU{xmgM1qgko>55(3Yr0cV<}&$i~BCE#P$QmXU9s>Pe~Mf`~0F)Vmn zY-@32x{j6+lqjH4tN%Q=>uy^kzTY?S&(&c>znLnU7gOGc#5FBA=f|$oa zX0q20o;j@CCLfllR-_(O&H|akp%pgZd!UV7>Bvo6cncIIO)*F3jE73`ejlqa`Cds2 z(RE?ztq+w^@(H#H{QibZ$CHr4H7-HPlj%e8#L;a9_6RgwK;L-_DORU}3oxZ)8f#5C z$jIY0a*y6&(8w(7iMi-`8)V+tbi{zXNG~N3^;ZtFh=2 zuN^S7wA@_o4IjMCOUpBM@A|ENMkNF%t|ge!F@oiinnf;jq<9s$Z3{F;JVCc{VydnI=Vw z+7m0;Zm{|(8XFeX>I^ai%7x#OR9J}n6aV@;5@w+H1L`*J`p?0TwpCAf5GQb~pJ)P; zNVpf;);+bf?59z5D{iALvrZ<}X-D zOFj3FJa>N~4x)17`qyV<8Wy`+8(Ygv{+^DC{MuNODP#vdG$Md*YRLN_!~E^`8fm-h z>7<}cLnbv&$fnd_$3z0EII-X`X3_&AV|iIxoP@@z88H~h1O^t!6;nPe4rGj`8&MJAxJ7P6{xR(9F*8mzkb`w{I#1+O7S)CSu!x3xPQp0awrk|LL8l1Btj#qHYi1b!Qdt?p@Js~ zOTToQ>R1iUUyG<}DXyrwa%2CgIAD7F2hY2d5J!xgfm=v}bTesgd3kP@+O1=Gv9Jx% zBck!#g5fD+9LEZ({A}iAkrW8{eV^*?HSw?ghqrQbhP++;a&8>8yPj!O-BJ?dB)N`W zpD)JQ>4=v?IC!DDtnF09Z$Tbvy4oye3*uWZKIih!qHoKrJ7)j-`dY;EcwqkytL&(N zI9?n#nlcVR%#4bD&`vEBK}E52ssx|Gs};U`2t85UV5F1Ljo*@)l_6@Wn2mWtxPDe*dT8*FjsU(BEW*Ct+x6jU-v za8NrVvbhp?xf;)M)HyOcZXmt9*F6L&ZB4Tevnz8n%;727DpdL@Ra(Z3zKssl*fl2< zc1BuoB^EGZ67kqd-kwEEov#iGWoP>?EfNC6w|hAi({VW8w=~r`apc5jTk`uXFJV!N zcSzd5{VDR{PW_oOD2+x?rHXTdGj}&hD5G>6eOM+5N|CZqBi#0{0`1i2ypV!`rlxx! zb!fp|vAq)GZmBYMp}h6QxrOhyT8mp7NM)6^)xTu72~ciL3s8}A*n2~F8EgX}8-W!~ z@>O~n)@@RAM{0xblw9{aJYF5RR!`-O<5DP-z9)<<*#Cz^9|~X zX5cafOGK{t%&RYpRJbS_^K3!ZJ+O6ESE&O!4g+PHMm&~{xW|Er(GwJ})=7Vjt2hpH zyR-g`Ay2O>kA(4>OjyUL7MeyZ>dwInsdBb`Gp=+hN_enxsE-4mn}c5S3cmF2J;1RNfOlM1?81n zWcsC0o|&b2T)hLmgH1(U66av<0P6H$;vGVOz^E(<8+)6<1XGQ+w%nGx*Aerpm+o@P zbp=B;<2SEoF`6Z@F(j~)h$3daa(BUOa({h6Xg?wZ zqCAXb$RRDlg<5VeIs*gpYO|%fVVyQWsg1uDY<1cpDO485s1yt=6_LCf_$DAljsn93 z8j6a6YQliLcBxd!(cbf0OhSv{xAb{3<3}_TuNl<>r7r7rcdul3u={b}5&(F^* zT(dk-UWPcu&3dC}xdATtZSU4n=n$!gOLqSXb@#}12Ff(6m@^*Jg$v!OH_>n>%H#$& z@AhvFf^7M5)TCPCi9QPUf#{*rb~friId48`(*55zNv-|!N4kYMAo-xP!$d+vV&VXw zIFYcu+w9GvCZx>UIP7Z6w5RjBFf69Mb|IiIw8r2P`Nc7ve^a;0F4SaL_))%*AyV~n zTXdQ+K=Qt2HZ;%>8o0h_>*t*8kn}|#k6A5NgKl&Yv617MEYpN}#l{jT&LF?Yn1ljZ zNqK&JelZK0>qD1Xcif`+_IswNph;cQDb`^l|G>AfG0DZTFKcNf0^W@}Y=*7MbfAUt z!$#>`HcJ(=0@WV~>h?H6h~05~>VlRfs2&N1c#ZystBtJLd=49}_7;IxiK=M@%cFaT zof$Nxd^@0u+^f~H4p4p7K*a%bu?yB7dE(-y2zhnb{1M8}e13X^1jQN}% zOIj!+CvIABDc}pG8sldo!71GeHi#Khn7IO%B7r0Ue!wyBhfi9xPBdC%J|6!5)>DAr zWcBd+jPFnDvV^(g8SVi;+TOmfORQ<2i&cI7*@U}lUu!mp)6-Y{q~X%dbd$x4fp0dk z;qTu5uspFpeI?q8Vy@!14gaFy;$Sr>XlKu@8hu^Y%Ul0oW?q=%QD2rtH3CJO_S5Y6 zDif<1YMK0?wcU!RLLAJ}m|7}qDt{s6!6ZrF##vBXGWLE)l8@fNU;lHC z+(XS#k(d^H4aq{{HsG|3&P9E5YjeXdy)6K}ow9}885DYWUt#g|+xnpAC;RNeeP~3Z zgx`XdItMmt`+$Rd=(4pafM^;En_o^S zpds5*wTZJQ;Xwd#&sv$Ww%dFg+A&aQ;fC3LbC|RLJZ%PkNR=$ooPqA`{(F z)ta7uS;#=6JR;Cn1wf!O{+T{F`Q?K2%%T@t68YqViDP;$GbMivnggqL_hHKhcV+(BOn%r>Hrs zPlRGe96AK8_BpvP^Pi{$6ffiKFXuU{+|4S$p^kuZ(#5#2grc=k=GlDbu|D=7fs}iR z!jLtXW5qcQP9vl5>z=_rdeIf%Wudm=S?B?~RqMm5koP1nXL%U$31YODiZ2F+Ldit z_P1+@bp{oldNOOY19IT{sGqv2u~K!HuQJ+M|IN)*-Jo%n&ylpXwFIin+ayGE;HD(; ztsCkZP*%oEyRx_nSX;|IS*?E4N|cI_6qZ?FMUxQE05P5g&={b@O>7i*f)Kl3XbJ7O9g^ zH4-~LagtQ1kCpSbVLzvAd64bwgu_skV~E>)qivqfxR@#G$0+09%36B6Y-8cLy2>d< zPr1YWLSm^+sUZa2NwwSp_~SzqsvTmg7}mB~)gzGUXF+pD@0V5k>L#Ctc1A(u3dUib zY+kU&9-2}mWsLH~q^MVp>|K)d(5Xw&enf|X$Ysh;G!bPgJapbb(Id)$%ixovw=Lt- zgTmNusjJ5fzf(rJcX6^IuX1S-3Z2pPN*~O_G)4AqmSbP&7X}pe%E!UqeR;2wqmQ$7a$X112+oX z@=-bq^*u>pBn>FPVaX+QFll(l5Bo$)o`X_Y_r?ukN|P)3^;siE5#jTosNOcYebx)x ze6>Nd+e0o(-zDmnlARCIRAWWK#()+ajq6}4_(9Yim4eU0F1B}mHEHCPhp#v)3tVrY z`T5(giQbqVt`qe3>gSP(LJ*HiyE$PAbILrvh*&qYvM(pcv&7SH5BBo2?D$H!6d)sV z8M(9KW`e3Ce$Gv#x<<`>Xpwxzsr+56G)@54c& ztek4anZ&w362L1DC9~c2diDwx!=Na^5LRf`ki~Lc9V$#}!j;q9?$*3-1Kafhr0D&| zH!ks^F0tir3I+({jVKhy?O_3%85wnj52VC?iDSTb%J<*B4;&*KbK!=%PDvoCy>%PP zIMJ7&BdoFQ%DUApZ&Hu1n=3(;VDpxz&ar>Bl52MrK8+^_J+3&Rq7$5}2*@pqK>w%BWJ1`_PrO@*96g?8-_JWL;`&t^FfFT4s@4jr>vH?}`qND@ zs%myf_Vtau7`(;I=`<$$AP7-F&c|da%UJc=Ifgx+@!_{No`GxTh0R3=vIvri)^8ho zRYC|LEQ1Tj_TEy#Xrevbntn6mwT)`tShYSGa=f}c75ZkXUa8YOw`1khFEy^7NVQyV zQ<5$5D}`9YE(6!oY0Az4;Fy@AWzha9iVxfj#K;6vjZQ>J>sny#FVHTod)bVpoW$FO zT>eeY9+iJRU%&o8_mJE_Ii9q4NT-}bg6Bp%5d7b>qUB)QAJlKY1g z!z!8R69xGhxzJBd{Q?O&TJoR5={P7Fp&z8Y@tUatQ&69@Vkd{@{7%B26evFqp&9DR zE?Wu?a1h0Y*CnJSX>J7#JJ6Z@S{0o<)RdUYL#L8@g=|F#^9h2glH~g z#|~UAnE(Y_QD_jHbLygQK3U^*s&HjJ$w99buLJ$L?wz#Kg*PCFX0ArlKx+{vfn4A2 zk(?^7%)*K~4wR-mRHSW`Hk$0r#zJAp9wHl{0p3H+Q>1Y<#AY|Gf{u3k)q%;0eLkm@ zBLQqMjJ^=F^Zk$waFP^+rl$KPBk1)yhjeCar~!Koz|e(QQO5bur6=F$YF{r>;w@L| zs#MrLJRgMj+t;1eN5t0czlQvy^S!fHW`qK(&RN9U4OCF*%C^4tb?q9@$h~SjS+UY< zy+&VHFtldcD91BH*pG*KMc&!C>%mY%m9ZW-IW?8GMJKCbr(;ODCuGeQH_;pk6kQvOobVKL6Z%JVhI zHcpMxQC+~Q1}MuR7iJDQe}cXUkSr(#73jf5a+x;+;}Opb;7UgvDvl-UAqF)EA;3sS zB9p|E`y5xS&^UylVPs`6$Musb9t7~>Qtz|Ys4vi8O`!OHx)Pg3*^a@6Fx8U0G{7(m zvp@@kqUzw$+(R_g=k@reH;?ycAVGHLVtE>>RX->N`LVUHO!bo5n^Q_`!3F6|D-;$Mk#c>WVo-j9K>Z@}`QQUr1wV_+2F_ zM-u8YeArC+Rr(!1Fy@E>H|RI`l=~DD#)*q3Xy}N9Dtb1K{xBn9F zzaE@&pnBuHzMh(AB4~5852$`l!!gsEb=ci<`IB|GvYt8?>D5^k`AI>3{N5O|i{m@p zq+5x`cw}i(0+%&CIYYQ-~j>}O1Fy#=XS*jR+N`~QT z7nUI*km9ON`xx;KYTNno4rZ@?ub2$A1Kc!04j8AVatL? zLSP34j%+16zsGZ270)@eX zzX{ZCERdVUuiWO6<76onyTzF^78zrJ4CMzg8#hCk`KrfS0kWX99d)G=%D-zYl8h@f z$8FmqNmrM2Ew+L5ug?{c#pSP{98#lRK~cdO_~Kas=FYZvKly><$6{C4O|mxzi{6t5 z+5O%3Ws~wZ69;+_n$U1P|A|wJ&?s8ZpLf2Cjg9*l`*Bi|)5vE2n7O6;Zz1yKG%7(W zZv!RAWB7^>oQ@z?^V|t~-(u$ZgASF7^fOdU4>vUB{G@lx9{vcKAFoZxYp+Z1^XIW3 zD(vhEyZm`IsX+%RN>?PuB<(Ox{dw8N$GQi&&4B*z^JmAKm`$_3+w6cWf|TMt(){8aSDb0X3CbN7)T{4b7eZnNmyCR9q(?HBTH8o3Q5xdE`i0KePNnN0jn z*<2!I1XD8XCc~S%8xVYlC%=cUP~?r8?4WLvPJ0EZ5XL$ zkV$JG5(c8Ra{u>_F^TpUw$cgS5hHjsRe2txy_11C_|{62VB{0uf=|$Gnt(N(pxBNqqph!+$LOYU;P6=6R#05_%}ZvnYlSW82W zHUSC;`uXqS_E&9yDM7IW-tI2C_-1o+e0eJ} z`yBS+tb(t^PQ$nwF6Jxrz(@J-VR5@HW8aW>Ez<`kRuF!mj-Q98C!+5$FV2jTi?$k= zCV=n&{(TqUOaiIRGpS{TX~~fb`DuaG2UH4);h3Rt&Mxugz3O%%N+qcS4%0&)Ny^<@ zLGDEaz4AEJ_86A6XTN#os(CcJMOCsQ^3k)e>G`MdEu!>0KC|gJKf`|eIdqjykaF?p zK?MuEbSN;qU$E$(_rWH!^gt@-^8frY)uJQ_Aa{{oJRUV2!N2tK4XR`J+RI4g5A>cV zHai{C@7N40{YI6)an%Ey)$W2Tu$QC`(RG&v$IZcLK-*Fo8#na}JQ;APP*X{i}*^ufS#QrCcb l^0N=O=Gwr~ft^Y$SQZ}v9H2{z%qhspfkaCyqb7^=e*o*=m;nF) delta 12359 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 -> n| -$0 -> guess| +set do random<1;128;> -> n| +set 0 -> guess| until variable guess = variable n [ - $do input<'guess: ';> -> guess| + set do input<'guess: ';> -> guess| do print<'too high';> if variable guess > variable n| do print<'too low';> if variable guess < variable n| do print<'correct!';> if variable guess = variable n| diff --git a/plthy_impl/ast_nodes.py b/plthy_impl/ast_nodes.py index aaf28c6..cbfa3d7 100644 --- a/plthy_impl/ast_nodes.py +++ b/plthy_impl/ast_nodes.py @@ -2,6 +2,13 @@ import random from rply.token import BaseBox + +BUILTIN_ARGS = { + "print": "*", + "input" : "*", + "random": 2 +} + def rep_join(l): format_string = ',\n'.join( [repr(i) if not isinstance(i, str) else i for i in l] @@ -11,7 +18,6 @@ def rep_join(l): format_string = f"\n {format_string}\n" return format_string - class Exp(BaseBox): def eval(self, vtable, ftable): return vtable, ftable, None @@ -86,8 +92,7 @@ class ExpABinop(Exp): elif self.op == "<": return vtable, ftable, r1 < r2 else: - print(f"E007: Unknown binop {self.op}") - exit() + raise Exception(f"Unknown binop {self.op}") class ExpList(Exp): def __init__(self, expressions: list[Exp]): @@ -143,9 +148,15 @@ class Command(BaseBox): return f"command()" class Builtin(Command): - def __init__(self, builtin: str, args: list[Exp]): - self.builtin = builtin + def __init__(self, builtin, args: list[Exp]): + self.builtin = builtin.value self.args = args + self.position = builtin.source_pos.lineno + expected_args = BUILTIN_ARGS[self.builtin] + + if not (expected_args == "*" or expected_args == len(self.args)): + print(f"E005: Wrong number of arguments for builtin '{self.builtin}' ({len(self.args)}) at line {self.position}") + exit() def __repr__(self) -> str: return f"builtin({self.builtin}, {self.args})" @@ -174,10 +185,6 @@ class Builtin(Command): result = input() return vtable, ftable, result elif self.builtin == "random": - if not len(self.args) == 2: - print(f"E006: Wrong number of arguments for builtin '{self.builtin}' ({len(self.args)})") - exit() - vtable, ftable, r1 = self.args[0].eval(vtable, ftable) vtable, ftable, r2 = self.args[1].eval(vtable, ftable) @@ -185,7 +192,7 @@ class Builtin(Command): return vtable, ftable, r else: - raise Exception(f"E005: Unknown builtin {self.builtin}") + raise Exception(f"Unknown builtin {self.builtin}") class Do(BaseBox): def __init__(self, command: Command): @@ -309,6 +316,22 @@ class StatementIf(Statement): else: return vtable, ftable, result +class StatementBecause(Statement): + def __init__(self, statement: Statement, condition): + self.statement = statement + self.condition = condition + + def __repr__(self) -> str: + return f"if({self.statement}, {self.condition})" + + def eval(self, vtable, ftable): + vtable, ftable, result = self.condition.eval(vtable, ftable) + if result: + return self.statement.eval(vtable, ftable) + else: + print("C001: Because assertion incorrect") + exit() + class StatementUntil(Statement): def __init__(self, statement: Statement, condition): self.statement = statement diff --git a/plthy_impl/lexer.py b/plthy_impl/lexer.py index f2d2a98..d8bdd38 100644 --- a/plthy_impl/lexer.py +++ b/plthy_impl/lexer.py @@ -9,13 +9,14 @@ KEYWORD_TOKENS = [("KEYWORD_"+i.upper(), i) for i in [ "maybe", "do", "if", -# "because", + "because", "until", "define", "as", "variable", "return", - "argument" + "argument", + "set" ]] BUILTIN_TOKENS = [("BUILTIN", i) for i in [ @@ -50,7 +51,7 @@ SYMBOL_TOKENS = [ ("SYMBOL_LT", r"\<"), ("SYMBOL_GT", r"\>"), ("SYMBOL_EQUALS", r"\="), - ("SYMBOL_DOLLAR", r"\$") +# ("SYMBOL_DOLLAR", r"\$") ] ALL_TOKENS = ( diff --git a/plthy_impl/parser.py b/plthy_impl/parser.py index 9674cd2..c48ef8f 100644 --- a/plthy_impl/parser.py +++ b/plthy_impl/parser.py @@ -9,9 +9,9 @@ class Parser(): [i[0] for i in ALL_TOKENS], precedence=[ ('left', ["KEYWORD_MAYBE", "KEYWORD_RETURN"]), - ('left', ["KEYWORD_IF", "KEYWORD_UNTIL", "KEYWORD_DEFINE", "KEYWORD_AS"]), - ('left', ["KEYWORD_DO", "BUILTIN"]), - ('left', ["SYMBOL_EQUALS", "SYMBOL_SET"]), + ('left', ["KEYWORD_IF", "KEYWORD_BECAUSE", "KEYWORD_UNTIL", "KEYWORD_DEFINE", "KEYWORD_AS"]), + ('left', ["KEYWORD_DO", "BUILTIN", "SYMBOL_SET"]), + ('left', ["SYMBOL_EQUALS"]), ('left', ["SYMBOL_PLUS", "SYMBOL_MINUS"]), ('left', ["SYMBOL_TIMES", "SYMBOL_DIVIDE", "SYMBOL_LT","SYMBOL_GT"]) ] @@ -33,7 +33,7 @@ class Parser(): return [tokens[0]] + tokens[2] ## statement ## - @self.pg.production('statement : SYMBOL_DOLLAR expression SYMBOL_SET ID', precedence="SYMBOL_SET") + @self.pg.production('statement : KEYWORD_SET expression SYMBOL_SET ID', precedence="SYMBOL_SET") def statement_set(tokens): return ast_nodes.StatementSet(tokens[1], tokens[3].value) @@ -49,6 +49,10 @@ class Parser(): def statement_if(tokens): return ast_nodes.StatementIf(tokens[0], tokens[2]) + @self.pg.production('statement : statement KEYWORD_BECAUSE expression') + def statement_because(tokens): + return ast_nodes.StatementBecause(tokens[0], tokens[2]) + @self.pg.production('statement : KEYWORD_UNTIL expression statement') def statement_until(tokens): return ast_nodes.StatementUntil(tokens[2],tokens[1]) @@ -68,7 +72,7 @@ class Parser(): ## command ## @self.pg.production('command : BUILTIN SYMBOL_LT expressions SYMBOL_GT') def command_builtin(tokens): - return ast_nodes.Builtin(tokens[0].value, tokens[2]) + return ast_nodes.Builtin(tokens[0], tokens[2]) @self.pg.production('command : SYMBOL_QUOTE ID SYMBOL_QUOTE SYMBOL_LT expressions SYMBOL_GT') def command_call(tokens): @@ -89,7 +93,7 @@ class Parser(): return ast_nodes.ExpInt(int(tokens[0].value)) @self.pg.production('expression : DATA_FLOAT') - def exp_int(tokens): + def exp_float(tokens): return ast_nodes.ExpInt(float(tokens[0].value)) @self.pg.production('expression : DATA_STRING') diff --git a/test.sh b/test.sh old mode 100644 new mode 100755 diff --git a/tests/02_variable.plthy b/tests/02_variable.plthy index b4e1676..fb6fe5b 100644 --- a/tests/02_variable.plthy +++ b/tests/02_variable.plthy @@ -1,4 +1,4 @@ hello| -$2 -> x| +set 2 -> x| do print| goodbye| \ No newline at end of file diff --git a/tests/03_math.plthy b/tests/03_math.plthy index 2e1cd5a..92898b2 100644 --- a/tests/03_math.plthy +++ b/tests/03_math.plthy @@ -1,10 +1,10 @@ hello| -$1 -> x| -$2 -> y| -$5 -> z| -$variable x+variable y -> z| // 3 -$5-variable z -> z| // 2 -$2*variable z -> x| // 4 -$variable x/variable y -> y| // 2 +set 1 -> x| +set 2 -> y| +set 5 -> z| +set variable x+variable y -> z| // 3 +set 5-variable z -> z| // 2 +set 2*variable z -> x| // 4 +set variable x/variable y -> y| // 2 do print| goodbye| \ No newline at end of file diff --git a/tests/04_scope.plthy b/tests/04_scope.plthy index a17f1a2..346168d 100644 --- a/tests/04_scope.plthy +++ b/tests/04_scope.plthy @@ -1,6 +1,6 @@ hello| [ - $5 -> x| + set 5 -> x| do print| ]| goodbye| \ No newline at end of file diff --git a/tests/05_maybe.plthy b/tests/05_maybe.plthy index ab547bd..8ceea39 100644 --- a/tests/05_maybe.plthy +++ b/tests/05_maybe.plthy @@ -1,5 +1,5 @@ hello| -$1 -> x| -maybe $variable x + 1 -> x| +set 1 -> x| +maybe set variable x + 1 -> x| do print| goodbye| \ No newline at end of file diff --git a/tests/06_if.plthy b/tests/06_if.plthy index b826fe4..98bcfae 100644 --- a/tests/06_if.plthy +++ b/tests/06_if.plthy @@ -1,5 +1,5 @@ hello| -$2 -> x| +set 2 -> x| do print<'a';> if variable x = 1| do print<'b';> if variable x = 2| goodbye| \ No newline at end of file diff --git a/tests/08_precedence.plthy b/tests/08_precedence.plthy index 203cca0..1fb801c 100644 --- a/tests/08_precedence.plthy +++ b/tests/08_precedence.plthy @@ -1,8 +1,8 @@ hello| -$ 1 + 2 * 3 -> x| +set 1 + 2 * 3 -> x| do print| -$ 5 -> y if variable x = 7| +set 5 -> y if variable x = 7| do print| -$$5 -> z + 1 -> a| +set set 5 -> z + 1 -> a| do print| goodbye| \ No newline at end of file diff --git a/tests/10_E001.plthy b/tests/10_E001.plthy index 15bcb54..29b2ef4 100644 --- a/tests/10_E001.plthy +++ b/tests/10_E001.plthy @@ -1,2 +1,2 @@ -$2 -> x| +set 2 -> x| goodbye| \ No newline at end of file diff --git a/tests/11_E002.plthy b/tests/11_E002.plthy index 7a71af5..3d74007 100644 --- a/tests/11_E002.plthy +++ b/tests/11_E002.plthy @@ -1,2 +1,2 @@ hello| -$2 -> x| \ No newline at end of file +set 2 -> x| \ No newline at end of file diff --git a/tests/12_list.plthy b/tests/12_list.plthy index e491c73..03ee620 100644 --- a/tests/12_list.plthy +++ b/tests/12_list.plthy @@ -1,6 +1,6 @@ hello| -${1;2;3;} -> x| +set {1;2;3;} -> x| do print| -${1;1+1;do print<3;>;} -> y| +set {1;1+1;do print<3;>;} -> y| do print| goodbye| \ No newline at end of file diff --git a/tests/13_because.expected b/tests/13_because.expected new file mode 100644 index 0000000..00750ed --- /dev/null +++ b/tests/13_because.expected @@ -0,0 +1 @@ +3 diff --git a/tests/13_because.plthy b/tests/13_because.plthy new file mode 100644 index 0000000..1e105c4 --- /dev/null +++ b/tests/13_because.plthy @@ -0,0 +1,5 @@ +hello| +set 2 -> x| +set 3 -> x because variable x = 2| +do print| +goodbye| \ No newline at end of file diff --git a/tests/14_E005-random.expected b/tests/14_E005-random.expected new file mode 100644 index 0000000..a44a167 --- /dev/null +++ b/tests/14_E005-random.expected @@ -0,0 +1 @@ +E005: Wrong number of arguments for builtin 'random' (1) at line 2 diff --git a/tests/14_E005-random.plthy b/tests/14_E005-random.plthy new file mode 100644 index 0000000..1e2dc2e --- /dev/null +++ b/tests/14_E005-random.plthy @@ -0,0 +1,3 @@ +hello| +do random<2;>| +goodbye| \ No newline at end of file diff --git a/tests/15_C001.expected b/tests/15_C001.expected new file mode 100644 index 0000000..37d9401 --- /dev/null +++ b/tests/15_C001.expected @@ -0,0 +1 @@ +C001: Because assertion incorrect diff --git a/tests/15_C001.plthy b/tests/15_C001.plthy new file mode 100644 index 0000000..f5cba89 --- /dev/null +++ b/tests/15_C001.plthy @@ -0,0 +1,5 @@ +hello| +set 2 -> x| +set 3 -> x because variable x = 3| +do print| +goodbye| \ No newline at end of file