From 2b45d66ac14c1508183f9d1970942f7b43a83923 Mon Sep 17 00:00:00 2001 From: Marvin Schlegel Date: Mon, 1 Jul 2024 17:00:37 +0200 Subject: [PATCH 1/5] extend doku --- doc/parser.md | 52 +++++++++++++++++++++++++++++++++++++++-- src/Parser/JavaParser.y | 2 +- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/doc/parser.md b/doc/parser.md index 65fb92b..fef7882 100644 --- a/doc/parser.md +++ b/doc/parser.md @@ -12,8 +12,56 @@ Der Parser wurde mit dem Happy tool implementiert. Er baut aus einer Liste von T Um den Parser aufzubauen wurde zuerst ein Großteil der Grammatik auskommentiert und Stück für Stück wurden die Umwandlungen hinzugefügt. Immer wenn ein neues Feature umgesetzt wurde, wurde dafür ein weiterer Unit Test geschrieben. Es gibt also für jede komplexe Ableitungsregel mindestens einen Unittest. -Als erstes wurden leere Methoden und Felder umgesetzt. Da in Java Methoden und Felder durcheinander vorkommen können geben die Ableitungsregeln einen Datentype namens `MethodOrFieldDeclaration` zurück. Über Pattern Matching baut die classbodydeclarations Regel dann eine Tupel mit einer Liste aus Methoden und einer aus Feldern. Über pattern matching werden diese Listen dann erweitert und in der darüberliegenden Regel schließlich extrahiert. Die Konstruktoren sind in diesem Fall auch normale Methoden mit dem Rückgabewert `void` und dem Namen ``. Auf diese Weise müssen sie nicht mehr vom Typcheck oder vom Bytecode verändert werden. +## Klassenaufbau +Als erstes wurden leere Konstruktoren Methoden und Felder umgesetzt. Da in Java Konstruktoren, Methoden und Felder durcheinander vorkommen können geben die Ableitungsregeln einen Datentyp namens `MemberDeclaration` zurück. Die classbodydeclarations Regel baut dann einen 3-Tupel mit einer Liste aus Konstruktoren, einer aus Methoden und einer aus Feldern. Über pattern matching werden diese Listen dann erweitert und in der darüberliegenden Regel schließlich extrahiert. + +Bei folgender Klasse: +```java +class TestClass { + int field; + + TestClass() {} + + void foo() {} +} +``` +würde die Regel folgendes Tupel zurückgeben: +```hs +( + [ConstructorDeclaration "TestClass" [] (Block [])], + [MethodDeclaration "void" "foo" [] (Block [])], + [VariableDeclaration "int" "field" Nothing] +) +``` +und folgende Klasse wird erstellt +```hs +Class "TestClass" + [ConstructorDeclaration "TestClass" [] (Block [])] + [MethodDeclaration "void" "foo" [] (Block [])] + [VariableDeclaration "int" "field" Nothing] +``` +Das Nothing ist in diesem Fall ein Platzhalter für eine Zuweisung, da unser Compiler auch Zuweisung bei der Felddeklaration unterstützt. In Java ist es möglich mehrere Variablen in einer Zeile zu deklarieren (Bsp.: `int x, y;`). Beim Parsen ergiebt sich dann die Schwierigkeit, dass man in dem Moment, wo man die Variable parst nicht weiß welchen Datentyp diese hat. Aus diesem Grund gibt es den Datentyp Declarator, welcher nur den Identifier und eventuell eine Zuweisung enthält. In den darüberliegenden Regeln fielddeclaration und localvariabledeclaration wird dann die Typinformation hinzugefügt mithilfe der Funktion convertDeclarator. -Für die Zuweisung wird auch die Kombination mit Rechenoperatoren unterstützt. Das ganze ist als syntactic sugar im Parser umgesetzt. Wenn es einen Zuweisungsoperator gibt, dann wird der Ausdruck in eine Zuweisung und Rechnung aufgeteilt. Bsp.: `x += 3;` wird umgewandelt in `x = x + 3`. +## Syntactic Sugar +Für die Zuweisung wird auch die Kombination mit Rechenoperatoren unterstützt. Das ganze ist durch Syntactic Sugar im Parser umgesetzt. Wenn es einen Zuweisungsoperator gibt, dann wird der Ausdruck in eine Zuweisung und Rechnung aufgeteilt. Bsp.: `x += 3;` wird umgewandelt in `x = x + 3`. + +For-Schleifen wurde auch rein im Parser durch Syntactic Sugar implementiert. Eine For-Schleife wird dabei in eine While-Schleife umgewandelt. Dafür wird zuerst ein Block erstellt, sodass die deklarierten Variablen auch nur für den Bereich der Schleife gültig sind. Die Bedingung der For-Schleife kann in die While-Schleife übernommen werden. Innerhalb der While-Schleife folgen zuerst die Statements, die im Block der For-Schleife waren und danach die Update-Statements. + +Bsp.: +```java +for (int i = 0; i < 9; i++) { + foo(); +} +``` +wird umgewandelt in: +```java +{ + int i = 0; + while (i < 9) { + foo(); + i++; + } +} +``` \ No newline at end of file diff --git a/src/Parser/JavaParser.y b/src/Parser/JavaParser.y index fe8bf0c..0b20ce7 100644 --- a/src/Parser/JavaParser.y +++ b/src/Parser/JavaParser.y @@ -386,7 +386,7 @@ multiplicativeexpression : unaryexpression { $1 } { -data MethodOrFieldDeclaration = MethodDecl MethodDeclaration +data MemberDeclaration = MethodDecl MethodDeclaration | ConstructorDecl ConstructorDeclaration | FieldDecls [VariableDeclaration] From c05aa302a4ea0398e9eab69aa936debb385e031c Mon Sep 17 00:00:00 2001 From: Marvin Schlegel Date: Mon, 1 Jul 2024 17:41:47 +0200 Subject: [PATCH 2/5] extend parser doc --- doc/parser.tex | 88 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 59 insertions(+), 29 deletions(-) diff --git a/doc/parser.tex b/doc/parser.tex index 877e46a..ba17eb2 100644 --- a/doc/parser.tex +++ b/doc/parser.tex @@ -1,35 +1,65 @@ \section{Lexer \& Parser} \subsection{Lexer} -Der Lexer wurde mit dem Alex tool implementiert. Dieser ist dafür zuständig den langen String in einzelne Tokens umzuwandeln. -In der Alex Datei gibt es für jedes Token einen regulären Ausdruck. Bei den meisten Tokens ist das einfach das Schlüsselwort. -Etwas komplexer waren Identifier, Integerliterale Strings und Chars. -Für die Definition wurde sich eng an die offizielle Java Language Specification gehalten. -Es ist beispielsweise auch möglich Unterstriche in Integerliterale einzubauen (Bsp.: \texttt{234\_343\_000}). -Es sind fast alle Schlüsselwörter von Java im Lexer implementiert, auch wenn nicht alle davon vom Parser geparst werden können. -Whitespace und Kommentare werden direkt ignoriert und verworfen. -Für Charliterale und Integerliterale gibt es auch spezielle Fehlermeldungen. Die meisten Tokens haben nur die Information, zu welchem Keyword sie gehören. -Eine Ausnahme bilden der Identifier und die Literale. Für den Identifier wird noch der Name gespeichert und für die Literale der entsprechende Wert. -Mit der Funktion alexScanTokens kann dann ein beliebiger String in Tokens umgewandelt werden. -Die komplexeren Tokens haben Unittests, welche mit dem Testframework HUnit geschrieben wurden. -Es gibt Tests für Kommentare, Identifier, Literale und ein paar weitere Tokens. +Der Lexer wurde mit dem Alex tool implementiert. Dieser ist dafür zuständig den langen String in einzelne Tokens umzuwandeln. In der Alex Datei gibt es für jedes Token einen regulären Ausdruck. Bei den meisten Tokens ist das einfach das Schlüsselwort. Etwas komplexer waren Identifier, Integerliterale Strings und Chars. Für die Definition wurde sich eng an die offizielle Java Language Specification gehalten. Es ist beispielsweise auch möglich Unterstriche in Integerliterale einzubauen (Bsp.: \verb|234_343_000|) Es sind fast alle Schlüsselwörter von Java im Lexer implementiert, auch wenn nicht alle davon vom Parser geparst werden können. Whitespace und Kommentare werden direkt ignoriert und verworfen. Für Charliterale und Integerliterale gibt es auch spezielle Fehlermeldungen. Die meisten Tokens haben nur die Information, zu welchem Keyword sie gehören. Eine Ausnahme bilden der Identifier und die Literale. Für den Identifier wird noch der Name gespeichert und für die Literale der entsprechende Wert. Mit der Funktion alexScanTokens kann dann ein beliebiger String in Tokens umgewandelt werden. + +Die komplexeren Tokens haben Unittests, welche mit dem Testframework HUnit geschrieben wurden. Es gibt Tests für Kommentare, Identifier, Literale und ein paar weitere Tokens. \subsection{Parser} -Der Parser wurde mit dem Happy tool implementiert. Er baut aus einer Liste von Tokens einen ungetypten AST. -Wir haben bereits eine Grammatik bekommen und mussten diese noch in den AST umwandeln. -Um den Parser aufzubauen wurde zuerst ein Großteil der Grammatik auskommentiert und Stück für Stück wurden die Umwandlungen hinzugefügt. -Immer wenn ein neues Feature umgesetzt wurde, wurde dafür ein weiterer Unit Test geschrieben. -Es gibt also für jede komplexe Ableitungsregel mindestens einen Unittest. Als erstes wurden leere Methoden und Felder umgesetzt. -Da in Java Methoden und Felder durcheinander vorkommen können geben die Ableitungsregeln einen Datentype namens \texttt{MethodOrFieldDeclaration} zurück. -Über Pattern Matching baut die classbodydeclarations Regel dann eine Tupel mit einer Liste aus Methoden und einer aus Feldern. -Über pattern matching werden diese Listen dann erweitert und in der darüberliegenden Regel schließlich extrahiert. -Die Konstruktoren sind in diesem Fall auch normale Methoden mit dem Rückgabewert `void` und dem Namen \texttt{}. -Auf diese Weise müssen sie nicht mehr vom Typcheck oder vom Bytecode verändert werden. -In Java ist es möglich mehrere Variablen in einer Zeile zu deklarieren (Bsp.: \texttt{int x, y;}). -Beim Parsen ergiebt sich dann die Schwierigkeit, dass man in dem Moment, wo man die Variable parst nicht weiß welchen Datentyp diese hat. -Aus diesem Grund gibt es den Datentyp Declarator, welcher nur den Identifier und eventuell eine Zuweisung enthält. -In den darüberliegenden Regeln fielddeclaration und localvariabledeclaration wird dann die Typinformation hinzugefügt mithilfe der Funktion convertDeclarator. -Für die Zuweisung wird auch die Kombination mit Rechenoperatoren unterstützt. Das Ganze ist als syntactic sugar im Parser umgesetzt. -Wenn es einen Zuweisungsoperator gibt, dann wird der Ausdruck in eine Zuweisung und Rechnung aufgeteilt. -Bsp.: \texttt{x += 3;} wird umgewandelt zu \texttt{x = x + 3}. +Der Parser wurde mit dem Happy tool implementiert. Er baut aus einer Liste von Tokens einen ungetypten AST. Wir haben bereits eine Grammatik bekommen und mussten diese noch in den AST umwandeln. + +Um den Parser aufzubauen wurde zuerst ein Großteil der Grammatik auskommentiert und Stück für Stück wurden die Umwandlungen hinzugefügt. Immer wenn ein neues Feature umgesetzt wurde, wurde dafür ein weiterer Unit Test geschrieben. Es gibt also für jede komplexe Ableitungsregel mindestens einen Unittest. + +\subsubsection{Klassenaufbau} +Als erstes wurden leere Konstruktoren Methoden und Felder umgesetzt. Da in Java Konstruktoren, Methoden und Felder durcheinander vorkommen können geben die Ableitungsregeln einen Datentyp namens `MemberDeclaration` zurück. Die classbodydeclarations Regel baut dann einen 3-Tupel mit einer Liste aus Konstruktoren, einer aus Methoden und einer aus Feldern. Über pattern matching werden diese Listen dann erweitert und in der darüberliegenden Regel schließlich extrahiert. + +Bei folgender Klasse: +\begin{lstlisting}[language=Java] +class TestClass { + int field; + + TestClass() {} + + void foo() {} +} +\end{lstlisting} +würde die Regel folgendes Tupel zurückgeben: +\begin{lstlisting}[language=Haskell] +( + [ConstructorDeclaration "TestClass" [] (Block [])], + [MethodDeclaration "void" "foo" [] (Block [])], + [VariableDeclaration "int" "field" Nothing] +) +\end{lstlisting} +und folgende Klasse wird erstellt +\begin{lstlisting}[language=Haskell] +Class "TestClass" + [ConstructorDeclaration "TestClass" [] (Block [])] + [MethodDeclaration "void" "foo" [] (Block [])] + [VariableDeclaration "int" "field" Nothing] +\end{lstlisting} +Das Nothing ist in diesem Fall ein Platzhalter für eine Zuweisung, da unser Compiler auch Zuweisung bei der Felddeklaration unterstützt. + +In Java ist es möglich mehrere Variablen in einer Zeile zu deklarieren (Bsp.: `int x, y;`). Beim Parsen ergiebt sich dann die Schwierigkeit, dass man in dem Moment, wo man die Variable parst nicht weiß welchen Datentyp diese hat. Aus diesem Grund gibt es den Datentyp Declarator, welcher nur den Identifier und eventuell eine Zuweisung enthält. In den darüberliegenden Regeln fielddeclaration und localvariabledeclaration wird dann die Typinformation hinzugefügt mithilfe der Funktion convertDeclarator. + +\subsubsection{Syntactic Sugar} +Für die Zuweisung wird auch die Kombination mit Rechenoperatoren unterstützt. Das ganze ist durch Syntactic Sugar im Parser umgesetzt. Wenn es einen Zuweisungsoperator gibt, dann wird der Ausdruck in eine Zuweisung und Rechnung aufgeteilt. Bsp.: \verb|x += 3;| wird umgewandelt in \verb|x = x + 3|. + +For-Schleifen wurde auch rein im Parser durch Syntactic Sugar implementiert. Eine For-Schleife wird dabei in eine While-Schleife umgewandelt. Dafür wird zuerst ein Block erstellt, sodass die deklarierten Variablen auch nur für den Bereich der Schleife gültig sind. Die Bedingung der For-Schleife kann in die While-Schleife übernommen werden. Innerhalb der While-Schleife folgen zuerst die Statements, die im Block der For-Schleife waren und danach die Update-Statements. + +\begin{lstlisting}[language=Java] +for (int i = 0; i < 9; i++) { + foo(); +} +\end{lstlisting} +wird umgewandelt in: +\begin{lstlisting}[language=Java] +{ + int i = 0; + while (i < 9) { + foo(); + i++; + } +} +\end{lstlisting} From f7d135cdd6aaf00a5771958792401a0f0ac7484d Mon Sep 17 00:00:00 2001 From: Marvin Schlegel Date: Mon, 1 Jul 2024 17:43:21 +0200 Subject: [PATCH 3/5] update pdf --- doc/documentation.pdf | Bin 102245 -> 106000 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/documentation.pdf b/doc/documentation.pdf index 13b81ef7369079bdb7f36e54ffa8a56fbbc6ffa5..c983225bde765a5fc7f5a99a8328fb4ec7c2eacf 100644 GIT binary patch delta 53331 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
)ftAZ zZUVInmSAbWP4-1LB-{EoQq_X={!>X}fbd|q6?u3Ab)|tpa7!+QH$dwleTeUwl7vQ7 zYwDB-*Srv+yl^5v-+ge%ZYO@Lr%XWgSeEoYHqn5!QTyUxijC{His*5dQMMI!N|2ni zS|$H0%KD&_llN#-pL@vAdS7k-fdj%R?&dx@o`l{L`*(f=tusrFN}CxlEB68_;6h8w z-mSv_$~TkBn=zcN^2)aWYIQv^MnS2V0Gd;+&9akAloK0C)wO!bffl>EoMiUyX!#u> z#H+!jG<$ASG(om|X(&Ed2i!g!w8 z7#~y5<;p0KmkgNz>=8##qX;1ffbEu-P#Tf_*n6A_jge-L@^Z%LNrPYUT@N@Lbi7$e z-Oy*BA79ol*S5bhFACaH<=|K~bQ!^ol!C}dldy|kakM@Cj8fWl2$rXI6)VGnpv zH4(2V4#qv1T=Z{+3>Ly2f2Q6TlSE5=sX`@IwN-BS_44dcgw)n;xX#8BKs#HhCWf71Gsk^0b|rmj)_q&fUd%T4MWu`I!@McD6x}cPnwPAAd#M-=l|;o2CFsciB-yP5DaFxG1=Hxx>-)PtEr3_` zeKd7QuDoXH*F~@_fXw?%;_MWAEalI0UU|QSckPrLHI0V@)ZK*%@@U!Ltmj4+mS(>M zGJhNi9yY{=0STNi36NMQ*LBewz=b9qG(uWyNgmcXG)O9Z zC?A98pbf4&H+FmF3kbxvDZEC~L)U>tUHb{A%Hq3XVlmE^o%&}L%g}A)n88-tMzOHR zRo-o)hqTp^eeg}b7-`JO_>PqOQ{c0xZhe1o(aE-03%sVq4!nD*xM{Yf{;32wV^$ye(=2k~@*3pYgj{ z6jbY6YaaJkuVP0S?zT5)wq@L0Td^@QLo#hsg|G-FH%5fSe2eYURjYjj(lQ{Q zywXE+GT)tXqc zw-WhyrA<2$TTP{fBY%AoQge1qFIN^}ljO*HRd@&R=^F|fyC5r=i1~#Z0pEe=z0sR@ zcJyJ2YmYI69|*X9;)UDMvb@a$+SadNS&wy>b@xBgS++ldXJ>Jm4CS8>xQ_|uBLR)L z0<>TQRQt4e(o&|%&eQJsJ%91|3_t}qE59DwX41J$*k$ym)qm$?40uKVnrHm6CjLU; z*usE1BPA9dB*fA3gZc18Ibv{Luqo;E&UKKI)YZrY z@T6fCvx4rfcu)@zNiD+t+axJk3VpG`)ebRt_tzBRgd=+~fxelw+3GhhLh00JA^#${ zT3Jr{EJ9RzdNc}tr*H2CBz~vHJKCl-EBGXI5h!*L-}ss%zemVrYxUqApwX~KE%uyQ zo=Y2=)Oz?NiUq!&(Vg~Ddoe-yWtdGBV8Z^-a}|ceC!?_P+2^UeLK{QYFLbHb&V$VG zZS{R-vYQgw9gycU6WCcDPvP6_Z1o_$`ca=S=X8lFvS=4F9#goh@ze?PdAwlX znYn+XaZkwZtO_H~{oAt+2Ubjf2PwCw4xacxAi>M0cc|2Muh8dkzJ# z-(bKgfVr5Xd3lYJprW+yOW00l&Sru^v~1HBW9pT3ync3aDbQwHBc^3u_f%%f5TYh6 z7qheN9wtuB(^SO$j{hOHcqYtS!%jP&B;75eWBBpNT8re>iq1Bx{-Ic{A7jmSZbu*G zhWX9#LbG!&HKSm|7F`34h)FRIa8->QO^t9hUXg$@r`UY0#FUx$8HE=Rv7p5u7K?+) zs415J7gRvNywHz9Mc@8(8FirJxs0vEys2Qp%kn`oeg0XeQIOR;#+Qs7R);RFTb$PW zFwMF87bNz)eE)h9EMR-wsoU$$Eg>#`6V0l2voP)3M!|`I$PE9Xb`*03Z%Y!iD9pJ;D++>4 zz%Z9Z9)4vhkBfT=lv{1>n>kVSj!I5^*CdxlKFglvs$pYa&%p4YG!h1=-B~v z759*A++sE|zA{B^dHE(AkQ0;0N0`^qcYUWUsuC`^@bknzqbPjZpzbKo_xmTQA4~IC z7#QPwaF2|;4_f`Cl-9D2CR0d#0aC8dZ=H=1N8j+n;fx>MVjMDJU1}LLvuwu-#~wRs z#7zay=Vo;STSrRB^(V|e*X6+bTu1e)Gyq9&rZL;fnX7ieIw`>#04e}*u=1@SmKh|6 zJli4P<~TZxU6*Wy_vQ-}oq6d_3}x!Irg67UeiZ31;7x?JcTwS3fSmMu@=-4%7_;sc zU0Cam5*7l#Q5-0e4O<@9u&rio)T!8xo%}6!4M&?RPru@EG{7%kW!s^(3<(+*Ul&~S zFU6M0g7lT|+ibT000V4>V6Tr}KlvuM?LG8z{jph6vWxgL!6#{Uq{zR(-P}lorQUOh z1L5)vp_f{(?K!q-DzG0}l$#M_G3Psr*w<+!!1OrbZ}40Jthg^*%()T6S`U4(W(W!G zJVCiJ{55HG&Q8TIq+iI%5)3m2lj0PX%S+lMBh`(tPXN__y{VJHZw`*uPDFJegKj6m z;vw+1qQRSpjQ24UaPQlP}gbOLN{kE1oZ4Ca{ac|5lBRiCL3m6x)g) zca70e$B?ZQ?MtulytvO^5<6<+I(d=O$)L1tY zX0_z+T&5`(%|v_TzekfAL^vgB_9*oMf!RVu@dmMl_=t8thnBtaB*^E=fzKI`t9faXm4O<^x<+^P|OS%UZK)e?L`N5^1MXU}pOxE_ri46`HP zYhPd5Y^!FL_nZ3Eg@d*lLC%^eQ}_}7&$@{fxVulmagAlu%ePK}h6d8QOj%tw-JP&T zUm)99A9el~Q=HrU-j#||-~Md8I>G55uqal4pGpUIS=r7>E~+ACyHuc`;6y~4+b7~S z{6LL+8T%cQorcvE*q(?X%$~f}SN9}9XujT5%u_*a^z<2|7L;}wgDA7ON%y~2Slu4q zjk(Apqt^ZM72~$tDle{)3qV)j?=GNC)f4B4@C z3Fyl9lU&E`IxEiH+0*NreH`H`Hv2GYCYc6lI9?(!gpsZ0Uk|Xx#{^K44bG^5>K2r& zcqRD~fP1FPb2$W8(O%X`je{I=-6f_T;(!P5$@#D}J0sH$uxGzM@MN@VPH5i9Kj z!9lK|EsJoVaNf0orf{Z>N5lr;9nM<{PD1m8SW{&X{9i5_G!P2rFTi5 zBGu1azK)frmZYP)bEf_)iMsIo`4LrA;~XBTGqyQu$HYk0YoOi8U6-%U0=>iILSzbV zsjr=I51J3kv+}ilV$|5gJYzL$Q zq9=Q`N1}sp$!?IvlWzc^B8T+%qx|{>54)kV(OD_q;y3aP*;D)@b7G1WP1sCsS`Dsy zrtXHlCnRrV@t=4vmI=;0Wo2Z&dQCpRv?2)u#=rBQQK?eF^U%dpg@zv?-LA?$7Tbm@ zO95LBW7}(dn%MSbk4N+XnllSrwRKU0!HZG@z@@fE&WI8uCoMjp+3Mpc1h25#M|Pg% z9d}rSWAKj_2KDPBT`WVl3;Ys^`p8WTjSS$cDHj61){#M1EXwHXkjD%b+SIt-p0AfO zGGpYOU+=RT+}x{FC2)2BK%$@WK8dt%`f$dQt2)cUd<$l*qve#|P>6>0{-(cX?9awO zz@XI}b+#r$Hqs6_+|3`IEYIjk#t3^dQ6dMqhuKJ7#3xD^HnB1Y>S3sJ(ahPwHhi3mVlr9B?#v7HaQ zS;)X&Ct#)FJ}VM0!*jJIrzE@m%aJN*K5e?@KdFRQ0KA2xzmt9l$NFdyGD8X4 zGgT~KDNz;-vNf_pJ!U18ckBBOSD)9{N$qYHLS$Zjrs!co?RQna>!=qTC;DZxTKp|*mL~?D<%lM4Zh_;>{f#|}jfF?W9vjoN=mDBhqr{aVl(vK; zg8hSIhFvxa_N2k>#NPv=;-kwYLm5z;hCb)E`uVO4^Aen)1kxQjA`eS0F4Lxm3K{}* zCE}cGDaAAUKK+mP+HTWo!VZ)N>{H&xRT}yLpABhs27dYLoDVw081ukO91R?h;ww?7 z$2sL=ynruq=oi1h?6C;*(jnIdoDVYw`+{T8?b+;!RihpL$fH1;V)d+~y13)rP|7h5 z!DMyoL>c#WumD<)3=j$$!(KAMYSm!nXjt%QZN6JiU-Pf@^M4QOPj_TnyZQx{1;T3l- zS#`OE`JGu5x&q6b1GsNu)5D#P3u<~lvCC+7F3{|Q%)0Xn{12St<8A8TL6ItK(fluC zTYNtX#|VA;Yp(=#pNzvmXa3hBA6?=0Z<+kex4^h9Q>?cMYb4>G_pTu2vu!Fs`_;b@ zp|(}iefFa3$%tg6NK9Pk&#B7E7+ON}U0*kvef*s3nIXgC%KX#{%1B^9Wm_oZ4nSV=Ktk z)=l+_ug`Ta?9;=_wu^Amj0er5l)=N3w%|VQ@0e&J|xFVDrQ}m&&x_vb?v#ZuVj4Fn^uExmvxoDPfyEP3*pM1~J zEPlNho|y*R_ig^8vo2(AB<)uP3nA5b{^?4$R`>SsC{FWgW%95dnTj@N8o#C0xN|O| zU|(?!0^P-_ggM%x;E5vuKxWMbW(VekUpP0|I7Y^pa~*Tzj;jfJR}Yy2Wk z>a1qTP$ZJvWi(P%vDznQ2Vw{3{|5mwF*cUhmZ(rMGco_y#NGb@KW5JV2l%lvvHmac zW8q}`k0Bip?E$W`u`~Zmt*R9R5p4x%D6*pi6CN0ZI3HY{T0G2^zt$Ly;+>B7l~83Icxy z0{Iy_`XM_KArS$AMSO__cl-fGv*9In1CrD8$H9Ye8!?R!>v(S!!ox!z_5Jn)s|(@; z`ZO{k+3eW@ZlE{dfEtB>m~9f`4AhO|3AD)r^5ujA5r6%ZfO;N@feNnVB+N}s#jK5v z;qHP9ae_SdUK?=yuEXC|9|QV@i+Q^<@8PHk1QCPuA^_pr%GWFXG2M{=I7o5VW<458f%?07^1(1!fbLd>_E?%C{<*Z9=mxQLpm;#_kfZ_*Uz@hPeL%sPket0Y0Niiqkck<@x*&ffAniI( zu+Wd2Q%NkFAM@zT9^64(0|e3WSVExBr}vdaa3w=G2du@DoyVPD$1E($tZK~r@7ni0 zQBF<{_Wp#i{#gDJvj3>x$q6PzcsKwG804EJCIhWcE?ZxDYNPbimZWPdMi5 zDI$WSdZ0(pl?xG6+yUXzXCFLZ3KtCo^rCl*xW^8w2ovd5pZzc{AS?cFIFC|BkDS3F z+}BBW1S8Vs^-3Ky6f~&K=BAC0LwuKbO)!w(=V*BosP_*Bi+?O8ganZ;&?pWl(6a-_ zrhfDhBn;52&6bUz0o5wO9bn=a6XO&1$MT@ZftW0cSLv4UR6q&Xv$c)*T&oacAr zw=cAR-?jnL^*k>g8S?cbcjrTee9Ca-$ph!{x|h3b!kJ(bQlRTzNNyp7TFm{VGM9Bn z24rD6cO-iJ!oxRfR+u{K_V4ZEkSen>G$I8wNcN)`PnfWt+%8w31;9pMIX;CLvoZUh z*aX)zsOl-E$u*_u6MGU-FK~A~Tg)A|j+?YUSHL`+eA%Z^8zj`!wvXTuOki>_%3qdXRzwq&;@>Km zj$=#U6yqsR%9~pY>j2}>x})kvluU}rt)dMz1=^8S-)X;aE+q+29xa?^6A;^K@i~_- z=YTLXQYUY8`HGv@$Jt(|!+!GE$cN)Q=o2+#ikA_NjL0s^)R44h!-Rwodu>j?9ZI=i z8EAW0mjt!#Vg_K~P@6V$yc|sNa}y^S4C3jb(ed9OmE<)br2#kGR`#7f51jad(o@0} zg%LGFr%l&P?{S$g8xz2i$sGwM2v>rG?s>{j%aVjuF&zl5usj{vLgT#*pMPup=tG!t5R? z;r@$nb%EDQPJrgyRoJmvwK11D1B2bLa$^V7OKt#3LT&0M4nOk zZ+X$;C!Vw|+Ba#w4{z?geh)H#B(#ZZQuH&LVsrp1{K?8daYzln#KWQOmMtI}Bi;;m z#c;u?cLAv6eSg!fV9?XT?g}{9IS%ZEikDKUBc3PIbDM`zICN+`2=pK4YT{Z}7VgX8 z-va69WB|g+q5zL`D8J7^^MYTW(-Iil$^fj^zs822N#evRjqoh%k8@gUnkKZ4@s|6W z8u5Q(_UnhMdrOi9H@-4jU|OZy3F!rjU*OQ!Zt1mumqI23An|_A_t!Nd1LPSbn68>0 zi8_8cVqASfTCba7Bnh3x>`TQ#FlFSB{?K|A`v5i)=QGBDYN)8XKa;`pnhr%6c-%Ov zOTX}VqbB_Bg>sI!fki}m$yG8i2HS9^Tr`Zai`2Vp70*!G#2yKhFlzM5`FIn1%e(}x zpDr&5c@VqLkbjzlCvjvf;`PfmK?t}^ZXqj$}Vov6IL zUI6K39O7*7YIkrXVnZ4&oqx?l3IZJ0EL{Jw8=ns-%{1gr;)ft}?{B{d7kd$$AW<#7 zuESFa>g(ISsfLPcN?FyN%mrtv(kFy#&-1ZTh7^OtGaAl)CFIF*4aXBi#i(OsH?Bm5 z!HsnhcN5iG7rHqb+=i|cCrOzrl`vJGY`~gOYM|k^K*FhUn8@>!1e~i1?&a4aCC%_w zIq5CJh@3SKEaK}k-wuU*24>5bMv?uJ!5n?k+JqW(q%65-XT?BD-m}xANSygS-V2d4 zX=0&addZ{bK+dCA1?`DXYdB>eNbw;gzTb<#oN2#Gx=}S6@q}^TBUaE1e8KZoJOIdw zaBIG-j@>rqR{YZ{Z}jpR4pssEG)ZBiw zIQDuPQl|%7XWSjL&OA}zL369D5yy+|LwXoQlp#Y4u@J*^97DW0x`M#>VN_E);eOXV zd9st3sQ8mK$y*Gv=G7+IX#@Mp7r;�QIcw@?a`H`89Eo@@I&l@%Ju%ehTd5uPVpf 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 delta 49767 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 Um*<@U9t$xwFg6M$B}Gq03i?9avH$=8 From 30288731d36c4af82faa51304e1a375323daa108 Mon Sep 17 00:00:00 2001 From: Marvin Schlegel Date: Wed, 3 Jul 2024 16:32:54 +0200 Subject: [PATCH 4/5] mmooore Tests --- Test/JavaSources/Main.java | 5 +++++ Test/JavaSources/TestLoop.java | 7 +++++++ Test/JavaSources/TestShenanigance.java | 25 +++++++++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 Test/JavaSources/TestShenanigance.java diff --git a/Test/JavaSources/Main.java b/Test/JavaSources/Main.java index acf0eed..b79d383 100644 --- a/Test/JavaSources/Main.java +++ b/Test/JavaSources/Main.java @@ -17,6 +17,7 @@ public class Main { TestMalicious malicious = new TestMalicious(); TestLoop loop = new TestLoop(); TestMethodOverload overload = new TestMethodOverload(); + TestShenanigance shenanigance = new TestShenanigance(); // constructing a basic class works assert empty != null; @@ -35,6 +36,7 @@ public class Main { // self-referencing methods work. assert recursion.fibonacci(15) == 610; assert loop.factorial(5) == 120; + assert loop.weirdFor() == 5; // methods with the same name but different parameters work assert overload.MethodOverload() == 42; assert overload.MethodOverload(15) == 42 + 15; @@ -48,5 +50,8 @@ public class Main { { assert malicious.cursedFormatting(i) == i; } + assert shenanigance.testAssignment() == 5; + assert shenanigance.divEqual() == 234_343_000 / 4; + assert shenanigance.testIf(5); } } diff --git a/Test/JavaSources/TestLoop.java b/Test/JavaSources/TestLoop.java index 40491fb..1976c48 100644 --- a/Test/JavaSources/TestLoop.java +++ b/Test/JavaSources/TestLoop.java @@ -9,4 +9,11 @@ public class TestLoop { return tally; } + + int weirdFor() { + int k = 0; + for (; k < 5; k++) { + } + return k; + } } diff --git a/Test/JavaSources/TestShenanigance.java b/Test/JavaSources/TestShenanigance.java new file mode 100644 index 0000000..693d73e --- /dev/null +++ b/Test/JavaSources/TestShenanigance.java @@ -0,0 +1,25 @@ +class TestShenanigance { + + int testAssignment() { + int x = 1; + int y = x = 5; + return y; + } + + int divEqual() { + int x = 234_343_000; + x /= 4; + return x; + } + + boolean testIf(int x) { + if (true && x < 8) { + char f = 'c'; + return f > x ; + } + ifn't { + return false; + } + } + +} \ No newline at end of file From 574628d3f73166aecf37f9bc049b8a216c880df3 Mon Sep 17 00:00:00 2001 From: Marvin Schlegel Date: Thu, 4 Jul 2024 13:58:13 +0200 Subject: [PATCH 5/5] parser add optional parameters --- Test/JavaSources/Main.java | 7 ++++ Test/JavaSources/TestOptionalParameter.java | 10 +++++ src/Parser/JavaParser.y | 42 +++++++++++++++++---- 3 files changed, 51 insertions(+), 8 deletions(-) create mode 100644 Test/JavaSources/TestOptionalParameter.java diff --git a/Test/JavaSources/Main.java b/Test/JavaSources/Main.java index b79d383..02bfcc2 100644 --- a/Test/JavaSources/Main.java +++ b/Test/JavaSources/Main.java @@ -18,6 +18,7 @@ public class Main { TestLoop loop = new TestLoop(); TestMethodOverload overload = new TestMethodOverload(); TestShenanigance shenanigance = new TestShenanigance(); + TestOptionalParameter optionalParameter = new TestOptionalParameter(); // constructing a basic class works assert empty != null; @@ -50,8 +51,14 @@ public class Main { { assert malicious.cursedFormatting(i) == i; } + // other syntactic sugar assert shenanigance.testAssignment() == 5; assert shenanigance.divEqual() == 234_343_000 / 4; assert shenanigance.testIf(5); + // optional parameters + assert optionalParameter.oneOptional() == 1; + assert optionalParameter.oneOptional(2) == 2; + assert optionalParameter.normalAndOptional(1) == 6; + assert optionalParameter.normalAndOptional(1, 0) == 4; } } diff --git a/Test/JavaSources/TestOptionalParameter.java b/Test/JavaSources/TestOptionalParameter.java new file mode 100644 index 0000000..faba782 --- /dev/null +++ b/Test/JavaSources/TestOptionalParameter.java @@ -0,0 +1,10 @@ +class TestOptionalParameter { + + int oneOptional(int p = 1) { + return p; + } + + int normalAndOptional(int a, int b = 2, int c = 3) { + return a + b + c; + } +} \ No newline at end of file diff --git a/src/Parser/JavaParser.y b/src/Parser/JavaParser.y index 0b20ce7..841d68c 100644 --- a/src/Parser/JavaParser.y +++ b/src/Parser/JavaParser.y @@ -1,5 +1,5 @@ { -module Parser.JavaParser (parse, parseStatement, parseExpression) where +module Parser.JavaParser (parse, parseStatement, parseExpression, parseMethod) where import Ast import Parser.Lexer } @@ -7,6 +7,7 @@ import Parser.Lexer %name parse %name parseStatement statement %name parseExpression expression +%name parseMethod classbodydeclarations %tokentype { Token } %error { parseError } %errorhandlertype explist @@ -104,13 +105,13 @@ modifiers : modifier { } classbodydeclarations : classbodydeclaration { case $1 of ConstructorDecl constructor -> ([constructor], [], []) - MethodDecl method -> ([], [method], []) + MethodDecl method -> ([], (convertMethodDeclarationWithOptionals method), []) FieldDecls fields -> ([], [], fields) } | classbodydeclarations classbodydeclaration { case ($1, $2) of ((constructors, methods, fields), ConstructorDecl constructor) -> ((constructors ++ [constructor]), methods, fields) - ((constructors, methods, fields), MethodDecl method) -> (constructors, (methods ++ [method]), fields) + ((constructors, methods, fields), MethodDecl method) -> (constructors, (methods ++ (convertMethodDeclarationWithOptionals method)), fields) ((constructors, methods, fields), FieldDecls newFields) -> (constructors, methods, (fields ++ newFields)) } @@ -136,7 +137,7 @@ constructordeclaration : constructordeclarator constructorbody { case $1 of (ide fielddeclaration : type variabledeclarators SEMICOLON { FieldDecls $ map (convertDeclarator $1) $2 } | modifiers type variabledeclarators SEMICOLON { FieldDecls $ map (convertDeclarator $2) $3 } -methoddeclaration : methodheader methodbody { case $1 of (returnType, (name, parameters)) -> MethodDecl (MethodDeclaration returnType name parameters $2) } +methoddeclaration : methodheader methodbody { case $1 of (returnType, (name, (parameters, optionalparameters))) -> MethodDecl (MethodDeclarationWithOptionals returnType name parameters optionalparameters $2) } block : LBRACKET RBRACKET { Block [] } | LBRACKET blockstatements RBRACKET { Block $2 } @@ -166,6 +167,10 @@ methodbody : block { $1 } blockstatements : blockstatement { $1 } | blockstatements blockstatement { $1 ++ $2} +formalandoptionalparameterlist : formalparameterlist { ($1, []) } + | formalparameterlist COMMA optionalparameterlist { ($1, $3) } + | optionalparameterlist { ([], $1) } + formalparameterlist : formalparameter { [$1] } | formalparameterlist COMMA formalparameter { $1 ++ [$3] } @@ -175,8 +180,13 @@ explicitconstructorinvocation : THIS LBRACE RBRACE SEMICOLON { } classtypelist : classtype { } | classtypelist COMMA classtype { } -methoddeclarator : IDENTIFIER LBRACE RBRACE { ($1, []) } - | IDENTIFIER LBRACE formalparameterlist RBRACE { ($1, $3) } +methoddeclarator : IDENTIFIER LBRACE RBRACE { ($1, ([], [])) } + | IDENTIFIER LBRACE formalandoptionalparameterlist RBRACE { ($1, $3) } + +optionalparameterlist : optionalparameter { [$1] } + | optionalparameterlist COMMA optionalparameter { $1 ++ [$3] } + +optionalparameter : type variabledeclaratorid ASSIGN variableinitializer { OptionalParameter $1 $2 $4 } primitivetype : BOOLEAN { "boolean" } | numerictype { $1 } @@ -386,9 +396,9 @@ multiplicativeexpression : unaryexpression { $1 } { -data MemberDeclaration = MethodDecl MethodDeclaration +data MemberDeclaration = MethodDecl MethodDeclarationWithOptionals | ConstructorDecl ConstructorDeclaration - | FieldDecls [VariableDeclaration] + | FieldDecls [VariableDeclaration] deriving (Show) data Declarator = Declarator Identifier (Maybe Expression) @@ -399,6 +409,22 @@ extractFunctionName :: Expression -> (Expression, Identifier) extractFunctionName (BinaryOperation NameResolution exp (Reference functionname)) = (exp, functionname) extractFunctionName (Reference functionname) = ((Reference "this"), functionname) +data OptionalParameter = OptionalParameter DataType Identifier Expression deriving (Show) +data MethodDeclarationWithOptionals = MethodDeclarationWithOptionals DataType Identifier [ParameterDeclaration] [OptionalParameter] Statement deriving (Show) +convertMethodDeclarationWithOptionals :: MethodDeclarationWithOptionals -> [MethodDeclaration] +convertMethodDeclarationWithOptionals (MethodDeclarationWithOptionals returnType id param [] stmt) = [MethodDeclaration returnType id param stmt] +convertMethodDeclarationWithOptionals (MethodDeclarationWithOptionals returnType id param (opt : optRest) stmt) = generateHelperMethod returnType id param opt : convertMethodDeclarationWithOptionals (generateBaseMethod returnType id param opt optRest stmt) +convertOptionalParameter :: OptionalParameter -> ParameterDeclaration +convertOptionalParameter (OptionalParameter dtype id exp) = ParameterDeclaration dtype id +generateHelperMethod :: DataType -> Identifier -> [ParameterDeclaration] -> OptionalParameter -> MethodDeclaration +generateHelperMethod returnType methodName params (OptionalParameter dtype id exp) = + let references = ((map (\(ParameterDeclaration paramType ident) -> (Reference ident)) params) ++ [exp]) + methodcall = (MethodCall (Reference "this") methodName references) + lastStatement = if returnType == "void" then StatementExpressionStatement methodcall else Return $ Just $ StatementExpressionExpression methodcall + in MethodDeclaration returnType methodName params $ Block [lastStatement] +generateBaseMethod :: DataType -> Identifier -> [ParameterDeclaration] -> OptionalParameter -> [OptionalParameter] -> Statement -> MethodDeclarationWithOptionals +generateBaseMethod returnType methodName params (OptionalParameter dtype id exp) optRest stmt = MethodDeclarationWithOptionals returnType methodName (params ++ [ParameterDeclaration dtype id]) optRest stmt + parseError :: ([Token], [String]) -> a parseError (errortoken, expected) = error ("parse error on token: " ++ show errortoken ++ "\nexpected one of: " ++ show expected)