diff -r bb2335a5ca58 -r e93a9e74ca8e coursework/cw03.tex --- a/coursework/cw03.tex Mon Aug 31 18:15:12 2020 +0100 +++ b/coursework/cw03.tex Tue Sep 01 12:44:07 2020 +0100 @@ -7,11 +7,9 @@ \section*{Coursework 3} -TODO: Testcases for expressions -\url{https://github.com/ArashPartow/math-parser-benchmark-project} -\noindent This coursework is worth 5\% and is due on \cwTHREE{} at +\noindent This coursework is worth 10\% and is due on \cwTHREE{} at 18:00. You are asked to implement a parser for the WHILE language and also an interpreter. You can do the implementation in any programming language you like, but you need to submit the source code with which @@ -20,13 +18,13 @@ parser. Please package everything(!) in a zip-file that creates a directory with the name \texttt{YournameYourFamilyname} on my end. -\subsection*{Disclaimer} +\subsection*{Disclaimer\alert} -It should be understood that the work you submit represents -your own effort. You have not copied from anyone else. An -exception is the Scala code I showed during the lectures, -which you can use. You can also use your own code from the -CW~1 and CW~2. +It should be understood that the work you submit represents your own +effort. You have not copied from anyone else. An exception is the +Scala code I showed during the lectures or uploaded to KEATS, which +you can both use. You can also use your own code from the CW~1 and +CW~2. \subsection*{Question 1} @@ -54,22 +52,21 @@ You should implement a parser for the WHILE language using parser combinators. Be careful that the parser takes as input a stream, or -list, of tokens generated by the tokenizer from the previous +list, of \emph{tokens} generated by the tokenizer from the previous coursework. For this you might want to filter out whitespaces and comments. Your parser should be able to handle the WHILE programs in -Figures~\ref{fib}, \ref{loop} and \ref{primes} (if your lexer cannot -deal with comments you can delete them from the prime number program). -In addition give the parse tree for the statement: +Figures~\ref{fib}, \ref{loop} and \ref{primes}. In addition give the +parse tree for the statement: \begin{lstlisting}[language=While,numbers=none] if (a < b) then skip else a := a * b + 1 \end{lstlisting} \noindent -A (possibly incomplete) datatype for parse trees in Scala would -look as in Figure~\ref{trees}. +A (possibly incomplete) datatype for parse trees in Scala is shown +in Figure~\ref{trees}. -\begin{figure} +\begin{figure}[p] \begin{lstlisting}[language=Scala] abstract class Stmt abstract class AExp @@ -81,6 +78,10 @@ case class If(a: BExp, bl1: Block, bl2: Block) extends Stmt case class While(b: BExp, bl: Block) extends Stmt case class Assign(s: String, a: AExp) extends Stmt +case class Read(s: String) extends Stmt +case class WriteVar(s: String) extends Stmt +case class WriteStr(s: String) extends Stmt + // for printing variables and strings case class Var(s: String) extends AExp case class Num(i: Int) extends AExp @@ -90,6 +91,7 @@ case object False extends BExp case class Bop(o: String, a1: AExp, a2: AExp) extends BExp case class Lop(o: String, b1: BExp, b2: BExp) extends BExp + // logical operations: and, or \end{lstlisting} \caption{The datatype for parse trees in Scala.\label{trees}} \end{figure} @@ -124,7 +126,8 @@ if-statement will ``run'' the if-branch if the boolean evaluates to \pcode{true}, otherwise the else-branch. Loops should be run as long as the boolean is \pcode{true}. - +Programs you should be able to run are shown in +Figures \ref{fib} -- \ref{collatz}. Give some time measurements for your interpreter @@ -134,20 +137,26 @@ you scale this value if you are willing to wait, say 1 Minute? -\begin{figure}[p] -\lstinputlisting[language=while,xleftmargin=20mm]{../progs/fib.while} +\begin{figure}[h] +\lstinputlisting[language=while,xleftmargin=20mm]{../progs/while-tests/fib.while} \caption{Fibonacci program in the WHILE language.\label{fib}} \end{figure} -\begin{figure}[p] -\lstinputlisting[language=while,xleftmargin=20mm]{../progs/loops.while} +\begin{figure}[h] +\lstinputlisting[language=while,xleftmargin=20mm]{../progs/while-tests/loops.while} \caption{The three-nested-loops program in the WHILE language. Usually used for timing measurements.\label{loop}} \end{figure} +\begin{figure}[h] +\lstinputlisting[language=while,xleftmargin=0mm]{../progs/while-tests/primes.while} +\caption{Prime number program.\label{primes}} +\end{figure} + + \begin{figure}[p] -\lstinputlisting[language=while,xleftmargin=0mm]{../progs/primes.while} -\caption{Prime number program.\label{primes}} +\lstinputlisting[language=while,xleftmargin=0mm]{../progs/while-tests/collatz2.while} +\caption{Collatz series program.\label{collatz}} \end{figure} \end{document}