| author | Christian Urban <urbanc@in.tum.de> | 
| Tue, 20 Nov 2018 08:00:16 +0000 | |
| changeset 606 | fb5592db1c8a | 
| parent 567 | a48605bdf467 | 
| child 630 | 3cea57c5501f | 
| permissions | -rw-r--r-- | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 1 | \documentclass{article}
 | 
| 299 
6322922aa990
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
298diff
changeset | 2 | \usepackage{../style}
 | 
| 216 
f5ec7c597c5b
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
214diff
changeset | 3 | \usepackage{../langs}
 | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 4 | |
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 5 | \begin{document}
 | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 6 | |
| 419 
4110ab35e5d8
updated courseworks
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
358diff
changeset | 7 | \section*{Coursework 3}
 | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 8 | |
| 556 | 9 | \noindent This coursework is worth 5\% and is due on 23 | 
| 567 | 10 | November at 18:00. You are asked to implement a parser for the | 
| 358 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
333diff
changeset | 11 | WHILE language and also an interpreter. You can do the | 
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
333diff
changeset | 12 | implementation in any programming language you like, but you | 
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
333diff
changeset | 13 | need to submit the source code with which you answered the | 
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
333diff
changeset | 14 | questions, otherwise a mark of 0\% will be awarded. You should | 
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
333diff
changeset | 15 | use the lexer from the previous coursework for the parser. | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 16 | |
| 358 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
333diff
changeset | 17 | \subsection*{Disclaimer}
 | 
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
333diff
changeset | 18 | |
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
333diff
changeset | 19 | It should be understood that the work you submit represents | 
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
333diff
changeset | 20 | your own effort. You have not copied from anyone else. An | 
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
333diff
changeset | 21 | exception is the Scala code I showed during the lectures, | 
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
333diff
changeset | 22 | which you can use. You can also use your own code from the | 
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
333diff
changeset | 23 | CW~1 and CW~2. | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 24 | |
| 299 
6322922aa990
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
298diff
changeset | 25 | |
| 419 
4110ab35e5d8
updated courseworks
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
358diff
changeset | 26 | \subsection*{Question 1}
 | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 27 | |
| 419 
4110ab35e5d8
updated courseworks
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
358diff
changeset | 28 | Design a grammar for the WHILE language and give the grammar | 
| 544 | 29 | rules. The main categories of non-terminals should be: | 
| 300 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 30 | |
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 31 | \begin{itemize}
 | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 32 | \item arithmetic expressions (with the operations from the | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 33 |   previous coursework, such as \pcode{+}, \pcode{*} and so on)
 | 
| 301 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 34 | \item boolean expressions (such as \pcode{<}, \code{!=} and 
 | 
| 300 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 35 | so on) | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 36 | \item single statements (such as \pcode{skip}, assignments, \pcode{if}s,
 | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 37 |   \pcode{while}-loops and so on)
 | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 38 | \item compound statements separated by semicolons | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 39 | \item blocks which are enclosed in curly parentheses | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 40 | \end{itemize}
 | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 41 | |
| 419 
4110ab35e5d8
updated courseworks
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
358diff
changeset | 42 | \subsection*{Question 2}
 | 
| 201 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 43 | |
| 301 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 44 | You should implement a parser for the WHILE language using | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 45 | parser combinators. Be careful that the parser takes as input | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 46 | a stream, or list, of tokens generated by the tokenizer from | 
| 419 
4110ab35e5d8
updated courseworks
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
358diff
changeset | 47 | the previous coursework. For this you might want to filter out | 
| 304 
1daaf6f6e45b
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
301diff
changeset | 48 | whitespaces and comments. Your parser should be able to handle | 
| 300 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 49 | the WHILE programs in Figures~\ref{fib} and \ref{loop}.
 | 
| 301 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 50 | In addition give the parse tree for the statement: | 
| 300 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 51 | |
| 301 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 52 | \begin{lstlisting}[language=While,numbers=none]
 | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 53 | if (a < b) then skip else a := a * b + 1 | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 54 | \end{lstlisting}
 | 
| 300 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 55 | |
| 301 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 56 | \noindent | 
| 300 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 57 | A (possibly incomplete) datatype for parse trees in Scala would | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 58 | look as in Figure~\ref{trees}.
 | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 59 | |
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 60 | \begin{figure}
 | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 61 | \begin{lstlisting}[language=Scala]
 | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 62 | abstract class Stmt | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 63 | abstract class AExp | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 64 | abstract class BExp | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 65 | |
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 66 | type Block = List[Stmt] | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 67 | |
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 68 | case object Skip extends Stmt | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 69 | case class If(a: BExp, bl1: Block, bl2: Block) extends Stmt | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 70 | case class While(b: BExp, bl: Block) extends Stmt | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 71 | case class Assign(s: String, a: AExp) extends Stmt | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 72 | |
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 73 | case class Var(s: String) extends AExp | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 74 | case class Num(i: Int) extends AExp | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 75 | case class Aop(o: String, a1: AExp, a2: AExp) extends AExp | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 76 | |
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 77 | case object True extends BExp | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 78 | case object False extends BExp | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 79 | case class Bop(o: String, a1: AExp, a2: AExp) extends BExp | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 80 | \end{lstlisting}
 | 
| 301 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 81 | \caption{The datatype for parse trees in Scala.\label{trees}}
 | 
| 300 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 82 | \end{figure}
 | 
| 201 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 83 | |
| 419 
4110ab35e5d8
updated courseworks
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
358diff
changeset | 84 | \subsection*{Question 3}
 | 
| 205 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 85 | |
| 301 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 86 | Implement an interpreter for the WHILE language you designed | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 87 | and parsed in Question 1 and 2. This interpreter should take | 
| 419 
4110ab35e5d8
updated courseworks
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
358diff
changeset | 88 | as input a parse tree. However be careful because, programs | 
| 301 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 89 | contain variables and variable assignments. This means | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 90 | you need to maintain a kind of memory, or environment, | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 91 | where you can look up a value of a variable and also | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 92 | store a new value if it is assigned. Therefore an | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 93 | evaluation function (interpreter) needs to look roughly as | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 94 | follows | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 95 | |
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 96 | \begin{lstlisting}[numbers=none]
 | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 97 | eval_stmt(stmt, env) | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 98 | \end{lstlisting}
 | 
| 300 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 99 | |
| 301 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 100 | \noindent | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 101 | where \pcode{stmt} corresponds to the parse tree
 | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 102 | of the program and \pcode{env} is an environment
 | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 103 | acting as a store for variable values. | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 104 | Consider the Fibonacci program in Figure~\ref{fib}.
 | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 105 | At the beginning of the program this store will be | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 106 | empty, but needs to be extended in line 3 and 4 where | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 107 | the variables \pcode{minus1} and \pcode{minus2}
 | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 108 | are assigned values. These values need to be reassigned in | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 109 | lines 7 and 8. The program should be interpreted | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 110 | according to straightforward rules: for example an | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 111 | if-statement will ``run'' the if-branch if the boolean | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 112 | evaluates to \pcode{true}, otherwise the else-branch.
 | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 113 | Loops should be run as long as the boolean is \pcode{true}.
 | 
| 205 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 114 | |
| 301 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 115 | Give some time measurements for your interpreter | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 116 | and the loop program in Figure~\ref{loop}. For example
 | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 117 | how long does your interpreter take when \pcode{start}
 | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 118 | is initialised with 100, 500 and so on. How far can | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 119 | you scale this value if you are willing to wait, say | 
| 473 | 120 | 1 Minute? | 
| 202 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 121 | |
| 300 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 122 | \begin{figure}[p]
 | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 123 | \begin{center}
 | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 124 | \mbox{\lstinputlisting[language=while]{../progs/fib.while}}
 | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 125 | \end{center}
 | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 126 | \caption{Fibonacci program in the WHILE language.\label{fib}}
 | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 127 | \end{figure}
 | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 128 | |
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 129 | \begin{figure}[p]
 | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 130 | \begin{center}
 | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 131 | \mbox{\lstinputlisting[language=while]{../progs/loops.while}}
 | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 132 | \end{center}
 | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 133 | \caption{The three-nested-loops program in the WHILE language. 
 | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 134 | Usually used for timing measurements.\label{loop}}
 | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 135 | \end{figure}
 | 
| 214 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 136 | |
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 137 | \end{document}
 | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 138 | |
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 139 | %%% Local Variables: | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 140 | %%% mode: latex | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 141 | %%% TeX-master: t | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 142 | %%% End: |