--- a/cws/cw05.tex Tue Nov 30 10:16:47 2021 +0000
+++ b/cws/cw05.tex Fri Dec 03 17:45:11 2021 +0000
@@ -25,11 +25,19 @@
You can do the implementation of your compiler in any programming
language you like, but you need to submit the source code with which
you generated the LLVM-IR files, otherwise a mark of 0\% will be
-awarded. You should use the lexer and parser from the previous
-courseworks, but you need to make some modifications to them for the
-`typed' fun-language. I will award up to 5\% if a lexer and a parser are
-correctly implemented. At the end, please package everything(!) in a zip-file
-that creates a directory with the name \texttt{YournameYourFamilyname}
+awarded. You are asked to submit the code of your compiler, but also
+the generated \texttt{.ll} files. You should use the lexer and parser
+from the previous courseworks, but you need to make some modifications
+to them for the `typed' fun-language. I will award up to 5\% if a
+lexer and a parser are correctly implemented. At the end, please
+package everything(!) in a zip-file that creates a directory with the
+name
+
+\begin{center}
+\texttt{YournameYourFamilyname}
+\end{center}
+
+\noindent
on my end.
\subsection*{Disclaimer\alert}
@@ -43,18 +51,18 @@
\subsection*{Task}
-The goal is to lex and parse the Mandelbrot program shown in
-Figure~\ref{mand} and generate corresponding code for the
-LLVM-IR. Unfortunately the calculations for the Mandelbrot set require
-floating point arithmetic and therefore we cannot be as simple-minded
-about types as we have been so far (remember the LLVM-IR is a
-fully-typed language and needs to know the exact types of each
-expression). The idea is to deal appropriately with three types,
-namely \texttt{Int}, \texttt{Double} and \texttt{Void} (they are
-represented in the LLVM-IR as \texttt{i32}, \texttt{double} and
-\texttt{void}). You need to extend the lexer and parser accordingly in
-order to deal with type annotations. The Fun-language includes global
-constants, such as
+The main goal is to lex and parse 4 Fun-programs, including the
+Mandelbrot program shown in Figure~\ref{mand}, and generate
+corresponding code for the LLVM-IR. Unfortunately the calculations for
+the Mandelbrot Set require floating point arithmetic and therefore we
+cannot be as simple-minded about types as we have been so far
+(remember the LLVM-IR is a fully-typed language and needs to know the
+exact types of each expression). The idea is to deal appropriately
+with three types, namely \texttt{Int}, \texttt{Double} and
+\texttt{Void} (they are represented in the LLVM-IR as \texttt{i32},
+\texttt{double} and \texttt{void}). You need to extend the lexer and
+parser accordingly in order to deal with type annotations. The
+Fun-language includes global constants, such as
\begin{lstlisting}[numbers=none]
val Ymin: Double = -1.3;
@@ -70,12 +78,13 @@
\begin{lstlisting}[numbers=none]
def foo(n: Int, x: Double) : Double = ...
+ def id(n: Int) : Int = ...
def bar() : Void = ...
\end{lstlisting}
\noindent
The idea is to record all typing information that is given
-in the program, but then delay any further typing inference to
+in the Fun-program, but then delay any further typing inference to
after the CPS-translation. That means the parser should
generate ASTs given by the Scala dataypes:
@@ -93,8 +102,9 @@
case class Call(name: String, args: List[Exp]) extends Exp
case class If(a: BExp, e1: Exp, e2: Exp) extends Exp
case class Var(s: String) extends Exp
-case class Num(i: Int) extends Exp // integer numbers
-case class FNum(i: Float) extends Exp // floating numbers
+case class Num(i: Int) extends Exp // integer numbers
+case class FNum(i: Float) extends Exp // floating numbers
+case class ChConst(c: Int) extends Exp // char constant
case class Aop(o: String, a1: Exp, a2: Exp) extends Exp
case class Sequence(e1: Exp, e2: Exp) extends Exp
case class Bop(o: String, a1: Exp, a2: Exp) extends BExp
@@ -120,6 +130,15 @@
\caption{Ascii output of the Mandelbrot program.\label{mand}}
\end{figure}
+Also note that the second version of the Mandelbrot program and also
+the Tower of Hanoi program uses character constants, like \texttt{'a'},
+\texttt{'1'}, \texttt{'$\backslash$n'} and so on. When they are tokenised,
+such characters should be interpreted as the corresponding ASCII code (an
+integer), such that we can use them in calculations like \texttt{'a' + 10}
+where the result should be 107. As usual, the character \texttt{'$\backslash$n'} is the
+ASCII code 10.
+
+
\subsection*{LLVM-IR}
There are some subtleties in the LLVM-IR you need to be aware of:
@@ -175,6 +194,7 @@
case "*" => "mul i32 "
case "-" => "sub i32 "
case "==" => "icmp eq i32 "
+ case "!=" => "icmp ne i32 "
case "<=" => "icmp sle i32 " // signed less or equal
case "<" => "icmp slt i32 " // signed less than
}\end{lstlisting}
@@ -187,6 +207,7 @@
case "*" => "fmul double "
case "-" => "fsub double "
case "==" => "fcmp oeq double "
+ case "!=" => "fcmp one double "
case "<=" => "fcmp ole double "
case "<" => "fcmp olt double "
}\end{lstlisting}
@@ -220,8 +241,8 @@
\item \textbf{Build-In Functions}: The `prelude' comes
with several build-in functions: \texttt{new\_line()},
- \texttt{skip}, \texttt{print\_int(n)}, \texttt{print\_space()}
- and \texttt{print\_star()}. You can find the `prelude' for
+ \texttt{skip}, \texttt{print\_int(n)}, \texttt{print\_space()},
+ \texttt{print\_star()} and \texttt{print\_char(n)}. You can find the `prelude' for
example in the file \texttt{sqr.ll}.
\end{itemize}