# HG changeset patch # User Christian Urban # Date 1415374468 0 # Node ID 08d99acd35e822b41b9c9b0a261426ef18be1805 # Parent 6322922aa990b1cb368eb7bff7f79e3cc5617c36 updated diff -r 6322922aa990 -r 08d99acd35e8 coursework/cw03.pdf Binary file coursework/cw03.pdf has changed diff -r 6322922aa990 -r 08d99acd35e8 coursework/cw03.tex --- a/coursework/cw03.tex Fri Nov 07 14:02:38 2014 +0000 +++ b/coursework/cw03.tex Fri Nov 07 15:34:28 2014 +0000 @@ -9,25 +9,89 @@ \noindent This coursework is worth 5\% and is due on 28 November at 16:00. You are asked to implement a parser for the WHILE language and also -an iterpreter. +an interpreter. You should use the lexer from the previous +coursework for the parser. \subsection*{Question 1 (marked with 1\%)} -You need to lex and parse WHILE programs and submit the assembler -instructions for the Fibonacci program and for the program you submitted -in Coursework 2 in Question 3. The latter should be so modified that -a user can input the upper bound on the console (in the original question -it was fixed to 100). +Design a grammar for the WHILE language and give the grammar +rules. The main categories of non-terminal will be: + +\begin{itemize} +\item arithmetic expressions (with the operations from the + previous coursework, such as \pcode{+}, \pcode{*} and so on) +\item boolean expressions (such as \pcode{<}, \pcode{!=} and + so on) +\item single statements (such as \pcode{skip}, assignments, \pcode{if}s, + \pcode{while}-loops and so on) +\item compound statements separated by semicolons +\item blocks which are enclosed in curly parentheses +\end{itemize} \subsection*{Question 2 (marked with 2\%)} +You should implement a parser based on parser combinators +for the WHILE language. Be careful that the parser takes +as input a stream of token generated by the tokenizer from +the previous courswork. Your parser should be able to handle +the WHILE programs in Figures~\ref{fib} and \ref{loop}. + +Give the parse tree for the statement: + +\begin{center} +\code{if (a < b) then skip else a := a * b + 1} +\end{center} + +A (possibly incomplete) datatype for parse trees in Scala would +look as in Figure~\ref{trees}. + +\begin{figure} +\begin{lstlisting}[language=Scala] +abstract class Stmt +abstract class AExp +abstract class BExp + +type Block = List[Stmt] + +case object Skip extends Stmt +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 Var(s: String) extends AExp +case class Num(i: Int) extends AExp +case class Aop(o: String, a1: AExp, a2: AExp) extends AExp + +case object True extends BExp +case object False extends BExp +case class Bop(o: String, a1: AExp, a2: AExp) extends BExp +\end{lstlisting} +\caption{The datatype for parse trees in Scala.} +\end{figure} \subsection*{Question 3 (marked with 2\%)} +Implement an interpreter for the WHILE language you +designed and parsed above. + +\begin{figure}[p] +\begin{center} +\mbox{\lstinputlisting[language=while]{../progs/fib.while}} +\end{center} +\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} +\caption{The three-nested-loops program in the WHILE language. +Usually used for timing measurements.\label{loop}} +\end{figure} \end{document}