Binary file handouts/ho07.pdf has changed
--- a/handouts/ho07.tex Sat Dec 07 00:57:23 2019 +0000
+++ b/handouts/ho07.tex Sat Dec 14 17:57:43 2019 +0000
@@ -6,13 +6,14 @@
\usepackage{../graphics}
+%% add safety check on references...whether it is above 0 and below the
+%% index
+
\begin{document}
\fnote{\copyright{} Christian Urban, King's College London, 2017, 2018, 2019}
\section*{Handout 7 (Compilation)}
-
-
The purpose of a compiler is to transform a program a human can read and
write into code the machine can run as fast as possible. The fastest
code would be machine code the CPU can run directly, but it is often
Binary file hws/hw09.pdf has changed
--- a/hws/hw09.tex Sat Dec 07 00:57:23 2019 +0000
+++ b/hws/hw09.tex Sat Dec 14 17:57:43 2019 +0000
@@ -60,7 +60,8 @@
}
\end{lstlisting}
-
+\item What is the difference between a parse tree and an abstract
+ syntax tree? Give some simple examples for each of them.
--- a/progs/fun_llvm.scala Sat Dec 07 00:57:23 2019 +0000
+++ b/progs/fun_llvm.scala Sat Dec 14 17:57:43 2019 +0000
@@ -138,7 +138,7 @@
val e7 = Call("foo", List(Num(3)))
CPSi(e7)
-val e8 = Call("foo", List(Num(3), Num(4), Aop("+", Num(5), Num(6))))
+val e8 = Call("foo", List(Aop("*", Num(3), Num(1)), Num(4), Aop("+", Num(5), Num(6))))
CPSi(e8)
val e9 = Sequence(Aop("*", Var("a"), Num(3)), Aop("+", Var("b"), Num(6)))
@@ -239,6 +239,16 @@
(end - start)/(i * 1.0e9)
}
+// for Scala 2.12
+/*
+def deserialise[T](file: String) : Try[T] = {
+ val in = new ObjectInputStream(new FileInputStream(new File(file)))
+ val obj = Try(in.readObject().asInstanceOf[T])
+ in.close()
+ obj
+}
+*/
+
def deserialise[T](fname: String) : Try[T] = {
import scala.util.Using
Using(new ObjectInputStream(new FileInputStream(fname))) {