# HG changeset patch # User Christian Urban # Date 1573082839 0 # Node ID 1ee523c4f09891922fa4f05cf4dd6d2fb504e1cc # Parent c6c79d21f8a8ea5c1cc530f4885bcef2ddc709c6 update diff -r c6c79d21f8a8 -r 1ee523c4f098 coursework/cw03.pdf Binary file coursework/cw03.pdf has changed diff -r c6c79d21f8a8 -r 1ee523c4f098 coursework/cw03.tex --- a/coursework/cw03.tex Wed Nov 06 23:17:05 2019 +0000 +++ b/coursework/cw03.tex Wed Nov 06 23:27:19 2019 +0000 @@ -46,12 +46,13 @@ \subsection*{Question 2} -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 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} and \ref{loop}. +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 +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: \begin{lstlisting}[language=While,numbers=none] @@ -118,6 +119,8 @@ evaluates to \pcode{true}, otherwise the else-branch. Loops should be run as long as the boolean is \pcode{true}. + + Give some time measurements for your interpreter and the loop program in Figure~\ref{loop}. For example how long does your interpreter take when \pcode{start} @@ -126,20 +129,21 @@ 1 Minute? \begin{figure}[p] -\begin{center} -\mbox{\lstinputlisting[language=while]{../progs/fib.while}} -\end{center} +\lstinputlisting[language=while,xleftmargin=20mm]{../progs/fib.while} \caption{Fibonacci program in the WHILE language.\label{fib}} \end{figure} \begin{figure}[p] -\begin{center} -\mbox{\lstinputlisting[language=while]{../progs/loops.while}} -\end{center} +\lstinputlisting[language=while,xleftmargin=20mm]{../progs/loops.while} \caption{The three-nested-loops program in the WHILE language. Usually used for timing measurements.\label{loop}} \end{figure} +\begin{figure}[p] +\lstinputlisting[language=while,xleftmargin=0mm]{../progs/primes.while} +\caption{Prime number program.\label{primes}} +\end{figure} + \end{document} %%% Local Variables: diff -r c6c79d21f8a8 -r 1ee523c4f098 progs/comb2.scala --- a/progs/comb2.scala Wed Nov 06 23:17:05 2019 +0000 +++ b/progs/comb2.scala Wed Nov 06 23:27:19 2019 +0000 @@ -115,10 +115,10 @@ // boolean expressions with some simple nesting lazy val BExp: Parser[String, BExp] = - (AExp ~ "==" ~ AExp) ==> { case x ~ y ~ z => Bop("==", x, z): BExp } || - (AExp ~ "!=" ~ AExp) ==> { case x ~ y ~ z => Bop("!=", x, z): BExp } || - (AExp ~ "<" ~ AExp) ==> { case x ~ y ~ z => Bop("<", x, z): BExp } || - (AExp ~ ">" ~ AExp) ==> { case x ~ y ~ z => Bop(">", x, z): BExp } || + (AExp ~ "==" ~ AExp) ==> { case x ~ _ ~ z => Bop("==", x, z): BExp } || + (AExp ~ "!=" ~ AExp) ==> { case x ~ _ ~ z => Bop("!=", x, z): BExp } || + (AExp ~ "<" ~ AExp) ==> { case x ~ _ ~ z => Bop("<", x, z): BExp } || + (AExp ~ ">" ~ AExp) ==> { case x ~ _ ~ z => Bop(">", x, z): BExp } || ("(" ~ BExp ~ ")" ~ "&&" ~ BExp) ==> { case x ~ y ~ z ~ u ~ v => And(y, v): BExp } || ("(" ~ BExp ~ ")" ~ "||" ~ BExp) ==> { case x ~ y ~ z ~ u ~ v => Or(y, v): BExp } || ("true" ==> (_ => True: BExp )) ||