From ee2817afbb1b93ef2b6328507ca8dc79c06424d5 Mon Sep 17 00:00:00 2001 From: Nikolaj Gade Date: Wed, 21 Feb 2024 15:37:38 +0100 Subject: [PATCH] :sparkles: --- documentation/plthy.pdf | Bin 22313 -> 22309 bytes documentation/plthy.tex | 6 +++--- plthy_impl/ast_nodes.py | 8 ++++---- plthy_impl/lexer.py | 4 ++-- plthy_impl/parser.py | 36 +++++++++++++++++++---------------- tests/06_if.plthy | 4 ++-- tests/08_precedence.expected | 2 +- tests/08_precedence.plthy | 8 ++++---- tests/09_fib.plthy | 4 ++-- tests/13_because.plthy | 2 +- tests/15_C001.plthy | 2 +- 11 files changed, 40 insertions(+), 36 deletions(-) diff --git a/documentation/plthy.pdf b/documentation/plthy.pdf index 2b51666ffd8c6a83be05f3f77008fa83801d6f99..09e5149117620a74816d56b46aa955853ef59d57 100644 GIT binary patch delta 6418 zcmaiXRZtv&k}VM2-JQV)*TLO2xVyVMgS)%K0KwgY1ouF2NU-1qy`SB?Kl^{G ztNTdR>FNgPFAdNsd|-Z%hzPQWr@NJz6SD8xvc8}T4Ik#kEislzfP1 zbSKK^f;xU>L&MDe;+-2%06-_piUh&J%x+`{z2C)}KM-hw-|YH|6Q3E+Qv~W45-Ho} z3w+lL4%Q8R)&eH^SuEXLwUNT&l;EG_wwwEPzWVJOPAx*?g16~03rNT*SX36s7JdAl z|LpjjA?Gz@49%8Y3xCOL=o?0wZSw#m_)x-D(9jC;9z+d4=-&{+KSsda(X zp>h_*cB;+&`cKJ;I3gV_?@Uccn~`h-LGqyj&h$OMWkYtj6+C5r-O!^-9>vdVdn|T- zS-nRfIY{S-8|=O4Y0b|?x;qDcd>{Wcz=Kw9YTOxyCbUD-%tb&ExC$+{%l5hQ!oXmV zgVk}Kx5_S%oBq`#K%nv?n}Hd(U7KMxLuWb8!`CAapbrT3aF7rkB(7S)MCZbSI~z(U zV_rAY;_4Z0sXz+> z5;2BY^~HwHZRBsVLyeY<3<{f-G_H>fzQ_9;C+uanCp(XH;?Q#}Z3?m4>0hW+}RQjKvt`;lp9dcGdzcOi`!w`Q8lVP1ltpLAz9%J# z#H8CLIPMSJd+l+@Hil_ANr(usDd6K_>}ZX{AFOru&rsTNJHd*O49~lAO@!*o-Cl31 z)nmN_p*13VDXNTit0sAr55%RpS=G#WFXJZ}ayq|}7fQHB#TPxO*gzzkuzKd)a+MLm zbGoz3aFVvptc>}EWkDVS&BWYj#eEOR#Ow0~I1#`#mUUQb1(zD->~9mgSbtPv-4pkF zlwvav#@O`pUXrMwkMn5bqL@0=E?N<@9Guo00t)g5)#6sCZ3c?c6veVZGEi+s|SQ>r2>y#)^TjHS+a( zmYRf5g11H?w3@&4t{`z+uqN1OTHNd^;i{2u6>rPrHZT=8r*@jb=k?dZCamzS zR3K&xX-MuJl#q+}+Nx$OrJKf|Mp9N$*1IV>JOL2b_$Fx-yTrC9A@$GJ4X>_G^l%DR zd*500M+7qFlvFCqFOH;)1u#1 zB+h~(%HRNH?%GelB6KC3^N`wT&v=Se0lX}Jq89smHHp-}NH&#FL%>+L`@yzy@oilO zU%iZZz=sO9MoNchakr>1oN_Sn1;a4;z6zy~xUlvet`jK}EY+s(BCy}TL8y}j4M@B^ zVKIe0Of;KGG6BTJlJ-iS`=(et-&%SI?F*nIo-k3*x0=7|=FGAK%V84mecso zS0SF}!ZE)rm`KlbU#yjSRgJg+n|-6=(*>79Qj*4s(#b-mVPJ9=oB1my*q=G?>$g)S z(AE!7I9#x;6xccXTO8~Nq?6s4OV-}EP1qZnhJ^ua8 zc}>=54CAGCCFAsGuPmHi*qUXz;!~`;4!zU;uiv|g+2E)}yE!vR3wNfqVICM-`uqZ%MbFu`S)Dv<^4r45vjzIPf#iE2a}TMEOE(!N zpw{V7Q~$R;{Uh`FlIrK!qQUB|6OmJ&q)L(|yG(MS zMWzTHBi|SK=UXi^r0I#niX76S^t5&QA6ks>T1w?vpb)ON+>O&75Kr*)1$fM%oHiW| zQ6PN)8z1~0r&p1&Eo&bg#(_%`4v|;POlb!u8i@muR*fGoYh@=&KVcW-3Su}L`Y6+n z!d!n(yxOH(qOlN|Ky2=1oiy?sS;oW#jj9S5wQv5(7J~k9^BP^QJJof82F9i7LZ#kJxOd z6Oq)ezvPD)QpVPNPgWduQ*tZdv9hfqMwuN%4YVTIb36ZsmLA-??S(5#ni(5}luniKMbpqIWDK0#zuI;{RuX#N^Af#Ue zaikj|34l5OXV)=OTelx(M-6(=Ic~PdFdTyq$0TI53Z*5He}PV_w~TrY+ZEcsBu_0wSsCAZ&F@U@Pz#dGgBj4jpQg%`5A{>NXxN<8+VzxeSp=(7y1oYX%%m0 zYlly@Cv}I1Z@+fhHu%XJvpxR8gR#d2pIQVW0vrEm^v{rcImw_%4??9WS6HhulZup+ zT``(&0a7z^w_WR>WA5TT_?B#i%Ikm@J!gG|P1rW$aM*k}E!3N(5xd`{C+8->A3gSj zqimG}!9V!C^ZG1Pd-uc%UPaF0B5m`@ld*#$@iGR-Hw(PP@oq7E%-pAt)3cC4(7fq$ z$kbq*@;?IhFP|3n&m!_7azyU7R6QUVC=7vJQ>jy{zd83f82A5`6?PpxZgG2Ei9dMKY(-0*GrKu4 z3jqu&FN??^NR|mG-w06yL{!>kZ73|SsqVpW#)rM(nWh0=wDBIR&xL=Tr_tcmlIE%y z0zpw#1RAKSuT9##sv=54=@u4l-0uqVQVNSnMNf)T@6o ziPx)Baos9No{{01(TL`fbH@9_ceV)Wx@Dd2H?ML%vAr zp|I4TNaB-4{f^R^ z#wo^N1={@KSP0u#gifx(s7tG7YK=*4nO# zb)5$j_j$NT7n^s`SwcSEx`Zc%OE;Z&g(5wvsHw6}a@KVJ1@l4Y zYTxHeE!F9_-!8#@-fS)};b+V{0r837c){_D91kFes>nar4KZ+8@lJjeGN&l>3RwVj ziwm23bN4N}nW7Vh)~HaW2w94c)+!0elBB z2!r_r9Hm6}m&SE42zA8GXXC|PWnjki6#C>OE-0yJc?3f2#(ZO;k!-e!383_x+94_v zP0}}C8oI`Yv_o3vPE&+sFq+SyiFOOm@!M5CHM5B(TN_u6i!AfiS3>94bJcRGcH!LV zD$y?2ac)sKop<#AcT$qEIl#RCp+SnWLj?Oj4c_BG&W!OC2AlDS1_Xl(PKsU_>jp|P z%ysfH*W3LrB9<6ra@)CnN8xi?{mp+#X{mQiZ-b9dmBg?61(?;3f zSBik(%k=V${86-U(EcO40kU1s#>=Ox@<6QgB^&{0?sN=XBCw#$by=_{r9`cV?n?bq zmQkg@r$i$5ed$MV9^aigbmaJcjz^lsm|j|}wdJ9_x3mgPEwQ=+ako7Fh_fc&P!pLp z?`YMR-_lb7!wJdXK6Y6+JbWHOL8Qi_$wv(bLmewNHI;(dfBw+62WfwfT+WtNot~db zd*w)2vMxQEZL)rmqXX(Jbbnqo4tbDCr9Ia&!&D(} zSW)3GpEv9;MWQdsZDp;2c=sUib`!^71XK?ocRD#~~MWNgfu3xyIb zsJ21CD5$1;J&kJy7e|4MF&8mOp03_BjL|07Q^{jI!%W|{0%no8*nF+Tby{~a!88eZ z7^ZxlqG~ikOi{cU71L_Sc9IllMI22bc~xyT+!Q+MOB6I6-gH0?U(Pt#Y{LMaffEr$ zSP5yyESK?w9X%xK88SL1YC zr63jQlE0qMhW@Cb26FNHlKp}zG($kUqs?HO{!T^tuSnLi{)g?quFV8KOf!7wMs4GR zX4r0K>pBZJHiiJ%{?SupjK2}f9(h@+0|GLWJ1)BWpZPW^e)@pV*73^$K4IYX->mm{ z@n)@DlV9^( zP4FF&VJrtLnT}DZjTZ=)%Vm`<^}np$DE0i}6zWili5zvj;I#S77I;W$ZdGk$X*>=C z-A9U$< zfT~k-eSqq6xCi0J`5rqsi-72(moE}vd8l)hV&3zb0Hc%j6`c5E^mV`ZNQAJ54Aq4mny;3IQdof#S5yE!;X?v zZpcolT9F)j3ld8Yjenzh#b|4;OpV5r;18kD8x<3JD(Pn6#&@h;T_Wchhosen56B}kJ zlhJSAvf^>ix8&^AcUvLQ<0_<;8gv0XMd>ak``S<5Ct_O+#tO{D*A`L|*p1Dg}-ekjy+ZN>2%y;84SUE~QYM15yXnWkRhH;LmBujJi`V=mnu zYEYfHNWDTP8Fom&WZJRH9-8`z*!XYzsO%JsUFN0PiR|+?w&LGf=0W|0o+cqQX1O#n zLbMbp5I$PVTFXp;+%Td$OFur-DZsX%e`o)KYlSs$r!T~xFF%Vju^lbx>5$v5+cW)92 zP;`OPI6`Yu@o-A|g+PjR4{Gu8^m{&1k8EJ`-p$G63-MbZF+Ca4>)MQD`r<=f{QIKK z^;&22DDacxopB_sVltG$5mu9YfK$aIf>N$k8yLFL(;g)~Sqms(ZDGb^#tpKzG1 zJ{wg|V$4#m0ucE~4IG?VY1tmJ_QZ(#zPa6guO{JSB_qni-50fOk0>GPUr!_8uzGyh zL+9^N&zTmljWVe?HRxEsJbVT@pcb^dPwj1I(uLKh0Ve5d0r~WCfVUy_FFFZmM` Xr40o7>Cie9NE|%Kw6xNyGRXf0h|nYS delta 6428 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 diff --git a/documentation/plthy.tex b/documentation/plthy.tex index 1d59838..8228aff 100644 --- a/documentation/plthy.tex +++ b/documentation/plthy.tex @@ -18,12 +18,12 @@ \textit{statement} & $\rightarrow$ & \texttt{maybe} \textit{statement}\\ \hline \textit{statement} & $\rightarrow$ & \texttt{do} \textit{command}\\ \hline \textit{statement} & $\rightarrow$ & \texttt{[} \textit{statements} \texttt{]}\\ \hline - \textit{statement} & $\rightarrow$ & \textit{statement} \texttt{if} \textit{expression} \\ \hline - \textit{statement} & $\rightarrow$ & \textit{statement} \texttt{because} \textit{expression} \\ \hline - \textit{statement} & $\rightarrow$ & \texttt{until} \textit{expression} \textit{statement} \\ \hline \textit{statement} & $\rightarrow$ & \texttt{set} \textit{expression} \texttt{->} \textbf{id} \\ \hline \textit{statement} & $\rightarrow$ & \texttt{define} \textbf{function} \texttt{<} \textbf{int} \texttt{>} \texttt{as} \textit{statement} \\ \hline \textit{statement} & $\rightarrow$ & \texttt{return} \textit{expression} \\ \hline\hline + \textit{command} & $\rightarrow$ & \textit{statement} \texttt{if} \textit{expression} \\ \hline + \textit{command} & $\rightarrow$ & \textit{statement} \texttt{because} \textit{expression} \\ \hline + \textit{command} & $\rightarrow$ & \textit{statement} \texttt{until} \textit{expression} \\ \hline \textit{command} & $\rightarrow$ & \textbf{builtin} \texttt{<} \textit{expressions} \texttt{>} \\ \hline \textit{command} & $\rightarrow$ & \texttt{"} \textbf{function} \texttt{" <} \textit{expressions} \texttt{>} \\ \hline\hline \textit{expressions} & $\rightarrow$ & \\ \hline diff --git a/plthy_impl/ast_nodes.py b/plthy_impl/ast_nodes.py index 62abba8..c849bab 100644 --- a/plthy_impl/ast_nodes.py +++ b/plthy_impl/ast_nodes.py @@ -301,7 +301,7 @@ class Call(Statement): return vtable, ftable, result -class StatementIf(Statement): +class CommandIf(Command): def __init__(self, statement: Statement, condition): self.statement = statement self.condition = condition @@ -316,13 +316,13 @@ class StatementIf(Statement): else: return vtable, ftable, result -class StatementBecause(Statement): +class CommandBecause(Command): def __init__(self, statement: Statement, condition): self.statement = statement self.condition = condition def __repr__(self) -> str: - return f"if({self.statement}, {self.condition})" + return f"because({self.statement}, {self.condition})" def eval(self, vtable, ftable): vtable, ftable, result = self.condition.eval(vtable, ftable) @@ -332,7 +332,7 @@ class StatementBecause(Statement): print("C001: Because assertion incorrect") exit() -class StatementUntil(Statement): +class CommandUntil(Command): def __init__(self, statement: Statement, condition): self.statement = statement self.condition = condition diff --git a/plthy_impl/lexer.py b/plthy_impl/lexer.py index 16c17b9..25aded3 100644 --- a/plthy_impl/lexer.py +++ b/plthy_impl/lexer.py @@ -36,8 +36,8 @@ SYMBOL_TOKENS = [ ("SYMBOL_AND", r"\/\\"), ("SYMBOL_SET", r"\-\>"), ("SYMBOL_TILDE", r"\~"), -# ("SYMBOL_LPARENS", r"\("), -# ("SYMBOL_RPARENS", r"\)"), + ("SYMBOL_LPARENS", r"\("), + ("SYMBOL_RPARENS", r"\)"), ("SYMBOL_LBRACKET", r"\["), ("SYMBOL_RBRACKET", r"\]"), ("SYMBOL_LCURL", r"\{"), diff --git a/plthy_impl/parser.py b/plthy_impl/parser.py index a5f6cc2..34f49c2 100644 --- a/plthy_impl/parser.py +++ b/plthy_impl/parser.py @@ -8,9 +8,9 @@ class Parser(): self.pg = ParserGenerator( [i[0] for i in ALL_TOKENS], precedence=[ - ('left', ["KEYWORD_MAYBE", "KEYWORD_RETURN"]), - ('left', ["KEYWORD_IF", "KEYWORD_BECAUSE", "KEYWORD_UNTIL", "KEYWORD_DEFINE", "KEYWORD_AS"]), - ('left', ["KEYWORD_DO", "BUILTIN", "SYMBOL_SET"]), + ('left', ["KEYWORD_SET", "SYMBOL_SET", "KEYWORD_IF", "KEYWORD_MAYBE", "KEYWORD_RETURN"]), + ('left', [ "KEYWORD_BECAUSE", "KEYWORD_UNTIL", "KEYWORD_DEFINE", "KEYWORD_AS"]), + ('left', ["KEYWORD_DO", "BUILTIN"]), ('left', ["SYMBOL_EQUALS", "SYMBOL_LT","SYMBOL_GT"]), ('left', ["SYMBOL_PLUS", "SYMBOL_MINUS", "SYMBOL_OR", "SYMBOL_AND"]), ('left', ["SYMBOL_TIMES", "SYMBOL_DIVIDE", "SYMBOL_TILDE"]) @@ -33,7 +33,7 @@ class Parser(): return [tokens[0]] + tokens[2] ## statement ## - @self.pg.production('statement : KEYWORD_SET expression SYMBOL_SET ID', precedence="SYMBOL_SET") + @self.pg.production('statement : KEYWORD_SET expression SYMBOL_SET ID') def statement_set(tokens): return ast_nodes.StatementSet(tokens[1], tokens[3].value) @@ -45,18 +45,6 @@ class Parser(): def statement_maybe(tokens): return ast_nodes.Maybe(tokens[1]) - @self.pg.production('statement : statement KEYWORD_IF expression') - 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]) - @self.pg.production('statement : KEYWORD_DEFINE ID SYMBOL_LT DATA_INT SYMBOL_GT KEYWORD_AS statement', precedence="KEYWORD_DEFINE") def statement_define(tokens): return ast_nodes.StatementDefine(tokens[1].value, int(tokens[3].value), tokens[6]) @@ -78,6 +66,18 @@ class Parser(): def command_call(tokens): return ast_nodes.Call(tokens[1].value,tokens[4]) + @self.pg.production('command : statement KEYWORD_IF expression') + def command_if(tokens): + return ast_nodes.CommandIf(tokens[0], tokens[2]) + + @self.pg.production('command : statement KEYWORD_BECAUSE expression') + def command_because(tokens): + return ast_nodes.CommandBecause(tokens[0], tokens[2]) + + @self.pg.production('command : statement KEYWORD_UNTIL expression') + def command_until(tokens): + return ast_nodes.CommandUntil(tokens[0],tokens[2]) + ## expressions ## @self.pg.production('expressions : ') def expressions_none(_): @@ -92,6 +92,10 @@ class Parser(): def exp_int(tokens): return ast_nodes.ExpInt(int(tokens[0].value)) + @self.pg.production('expression : SYMBOL_LPARENS expression SYMBOL_RPARENS') + def exp_paren(tokens): + return tokens[1] + @self.pg.production('expression : DATA_FLOAT') def exp_float(tokens): return ast_nodes.ExpInt(float(tokens[0].value)) diff --git a/tests/06_if.plthy b/tests/06_if.plthy index 98bcfae..3670b7e 100644 --- a/tests/06_if.plthy +++ b/tests/06_if.plthy @@ -1,5 +1,5 @@ hello| set 2 -> x| -do print<'a';> if variable x = 1| -do print<'b';> if variable x = 2| +do do print<'a';> if variable x = 1| +do do print<'b';> if variable x = 2| goodbye| \ No newline at end of file diff --git a/tests/08_precedence.expected b/tests/08_precedence.expected index 4e41fda..79c22c4 100644 --- a/tests/08_precedence.expected +++ b/tests/08_precedence.expected @@ -1,4 +1,4 @@ 7 -5 +5 5 5 6 True diff --git a/tests/08_precedence.plthy b/tests/08_precedence.plthy index 559255b..4bc5c86 100644 --- a/tests/08_precedence.plthy +++ b/tests/08_precedence.plthy @@ -1,9 +1,9 @@ hello| set 1 + 2 * 3 -> x| do print| -set 5 -> y if variable x = 7| -do print| -set set 5 -> z + 1 -> a| -do print| +set do set 5 -> y if variable x = 7 -> z| +do print| +set set 5 -> a + 1 -> b| +do print| do print2*2+5;>| goodbye| \ No newline at end of file diff --git a/tests/09_fib.plthy b/tests/09_fib.plthy index 3fd522a..1aa6c78 100644 --- a/tests/09_fib.plthy +++ b/tests/09_fib.plthy @@ -1,7 +1,7 @@ hello| define fib<1> as [ - return 1 if argument #1 = 1| - return 1 if argument #1 = 2| + do return 1 if argument #1 = 1| + do return 1 if argument #1 = 2| return do "fib" + do "fib"| ]| do print;>| diff --git a/tests/13_because.plthy b/tests/13_because.plthy index 1e105c4..1602b2f 100644 --- a/tests/13_because.plthy +++ b/tests/13_because.plthy @@ -1,5 +1,5 @@ hello| set 2 -> x| -set 3 -> x because variable x = 2| +do set 3 -> x because variable x = 2| do print| goodbye| \ No newline at end of file diff --git a/tests/15_C001.plthy b/tests/15_C001.plthy index f5cba89..451a024 100644 --- a/tests/15_C001.plthy +++ b/tests/15_C001.plthy @@ -1,5 +1,5 @@ hello| set 2 -> x| -set 3 -> x because variable x = 3| +do set 3 -> x because variable x = 3| do print| goodbye| \ No newline at end of file