| author | Christian Urban <christian.urban@kcl.ac.uk> | 
| Tue, 28 Nov 2023 11:42:31 +0000 | |
| changeset 955 | ca67172b8fa1 | 
| parent 949 | 58720903336e | 
| child 967 | 258e18af6d14 | 
| permissions | -rw-r--r-- | 
| 630 | 1 | % !TEX program = xelatex | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 2 | \documentclass{article}
 | 
| 299 
6322922aa990
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
298diff
changeset | 3 | \usepackage{../style}
 | 
| 216 
f5ec7c597c5b
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
214diff
changeset | 4 | \usepackage{../langs}
 | 
| 949 | 5 | \usepackage[normalem]{ulem}
 | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 6 | |
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 7 | \begin{document}
 | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 8 | |
| 419 
4110ab35e5d8
updated courseworks
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
358diff
changeset | 9 | \section*{Coursework 3}
 | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 10 | |
| 722 | 11 | |
| 12 | ||
| 750 | 13 | \noindent This coursework is worth 10\% and is due on \cwTHREE{} at
 | 
| 877 | 14 | 16:00. You are asked to implement a parser for the WHILE language and | 
| 955 | 15 | also an interpreter. The parser needs to use parser combinators. | 
| 16 | You can do the implementation in any programming | |
| 748 | 17 | language you like, but you need to submit the source code with which | 
| 18 | you answered the questions, otherwise a mark of 0\% will be | |
| 19 | awarded. You should use the lexer from the previous coursework for the | |
| 942 | 20 | parser. Please submit your code to Github by the deadline. | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 21 | |
| 750 | 22 | \subsection*{Disclaimer\alert}
 | 
| 358 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
333diff
changeset | 23 | |
| 750 | 24 | It should be understood that the work you submit represents your own | 
| 25 | effort. You have not copied from anyone else. An exception is the | |
| 26 | Scala code I showed during the lectures or uploaded to KEATS, which | |
| 27 | you can both use. You can also use your own code from the CW~1 and | |
| 886 | 28 | CW~2. But do not | 
| 29 | be tempted to ask Github Copilot for help or do any other | |
| 30 | shenanigans like this! | |
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 31 | |
| 299 
6322922aa990
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
298diff
changeset | 32 | |
| 419 
4110ab35e5d8
updated courseworks
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
358diff
changeset | 33 | \subsection*{Question 1}
 | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 34 | |
| 419 
4110ab35e5d8
updated courseworks
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
358diff
changeset | 35 | Design a grammar for the WHILE language and give the grammar | 
| 544 | 36 | 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 | 37 | |
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 38 | \begin{itemize}
 | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 39 | \item arithmetic expressions (with the operations from the | 
| 682 | 40 |   previous coursework, that is \pcode{+}, \pcode{-}, \pcode{*},
 | 
| 41 |   \pcode{/} and \pcode{\%})
 | |
| 42 | \item boolean expressions (with the operations \pcode{==}, \pcode{<}, \pcode{>},
 | |
| 686 | 43 |   \code{>=}, \code{<=}, 
 | 
| 682 | 44 |   \code{!=}, \pcode{&&}, \pcode{||}, \pcode{true} and \pcode{false})
 | 
| 45 | \item single statements (that is \pcode{skip}, assignments, \pcode{if}s,
 | |
| 46 |   \pcode{while}-loops, \pcode{read} and \pcode{write})
 | |
| 300 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 47 | \item compound statements separated by semicolons | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 48 | \item blocks which are enclosed in curly parentheses | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 49 | \end{itemize}
 | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 50 | |
| 683 | 51 | \noindent | 
| 52 | Make sure the grammar is not left-recursive. | |
| 53 | ||
| 419 
4110ab35e5d8
updated courseworks
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
358diff
changeset | 54 | \subsection*{Question 2}
 | 
| 201 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 55 | |
| 684 | 56 | You should implement a parser for the WHILE language using parser | 
| 57 | combinators. Be careful that the parser takes as input a stream, or | |
| 750 | 58 | list, of \emph{tokens} generated by the tokenizer from the previous
 | 
| 684 | 59 | coursework. For this you might want to filter out whitespaces and | 
| 60 | comments. Your parser should be able to handle the WHILE programs in | |
| 801 | 61 | Figures~\ref{fib} -- \ref{collatz}.  In addition give the
 | 
| 901 | 62 | parse tree according to your grammar for the statement: | 
| 300 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 63 | |
| 301 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 64 | \begin{lstlisting}[language=While,numbers=none]
 | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 65 | 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 | 66 | \end{lstlisting}
 | 
| 300 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 67 | |
| 301 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 68 | \noindent | 
| 901 | 69 | The output of the parser is an abstract syntax tree (AST). | 
| 70 | A (possibly incomplete) datatype for ASTs of the WHILE language | |
| 71 | is shown in Figure~\ref{trees}.
 | |
| 300 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 72 | |
| 750 | 73 | \begin{figure}[p]
 | 
| 300 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 74 | \begin{lstlisting}[language=Scala]
 | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 75 | abstract class Stmt | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 76 | abstract class AExp | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 77 | abstract class BExp | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 78 | |
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 79 | type Block = List[Stmt] | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 80 | |
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 81 | case object Skip extends Stmt | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 82 | 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 | 83 | 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 | 84 | case class Assign(s: String, a: AExp) extends Stmt | 
| 750 | 85 | case class Read(s: String) extends Stmt | 
| 86 | case class WriteVar(s: String) extends Stmt | |
| 87 | case class WriteStr(s: String) extends Stmt | |
| 88 | // for printing variables and strings | |
| 300 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 89 | |
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 90 | case class Var(s: String) extends AExp | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 91 | case class Num(i: Int) extends AExp | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 92 | 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 | 93 | |
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 94 | case object True extends BExp | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 95 | case object False extends BExp | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 96 | case class Bop(o: String, a1: AExp, a2: AExp) extends BExp | 
| 682 | 97 | case class Lop(o: String, b1: BExp, b2: BExp) extends BExp | 
| 750 | 98 | // logical operations: and, or | 
| 300 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 99 | \end{lstlisting}
 | 
| 901 | 100 | \caption{The datatype for abstract syntax trees in Scala.\label{trees}}
 | 
| 300 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 101 | \end{figure}
 | 
| 201 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 102 | |
| 419 
4110ab35e5d8
updated courseworks
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
358diff
changeset | 103 | \subsection*{Question 3}
 | 
| 205 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 104 | |
| 301 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 105 | 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 | 106 | and parsed in Question 1 and 2. This interpreter should take | 
| 901 | 107 | as input an AST. However be careful because, programs | 
| 301 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 108 | contain variables and variable assignments. This means | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 109 | 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 | 110 | 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 | 111 | 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 | 112 | evaluation function (interpreter) needs to look roughly as | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 113 | follows | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 114 | |
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 115 | \begin{lstlisting}[numbers=none]
 | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 116 | eval_stmt(stmt, env) | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 117 | \end{lstlisting}
 | 
| 300 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 118 | |
| 301 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 119 | \noindent | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 120 | where \pcode{stmt} corresponds to the parse tree
 | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 121 | 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 | 122 | acting as a store for variable values. | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 123 | Consider the Fibonacci program in Figure~\ref{fib}.
 | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 124 | 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 | 125 | 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 | 126 | the variables \pcode{minus1} and \pcode{minus2}
 | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 127 | 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 | 128 | 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 | 129 | according to straightforward rules: for example an | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 130 | 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 | 131 | evaluates to \pcode{true}, otherwise the else-branch.
 | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 132 | Loops should be run as long as the boolean is \pcode{true}.
 | 
| 949 | 133 | Note also that some programs contain a read-statement, | 
| 134 | which means you need to read and integer from the commandline | |
| 135 | and store the value in the corresponding variable. | |
| 750 | 136 | Programs you should be able to run are shown in | 
| 949 | 137 | Figures \ref{fib} -- \ref{collatz}. The output
 | 
| 138 | of the \texttt{primes.while} should look as follows:
 | |
| 684 | 139 | |
| 949 | 140 | \begin{figure}[h]
 | 
| 141 | {\small
 | |
| 142 | \begin{lstlisting}[numbers=none]
 | |
| 143 | 2 | |
| 144 | 3 | |
| 145 | 5 | |
| 146 | 7 | |
| 147 | 11 | |
| 148 | 13 | |
| 149 | 17 | |
| 150 | 19 | |
| 151 | 23 | |
| 152 | 29 | |
| 153 | 31 | |
| 154 | 37 | |
| 155 | 41 | |
| 156 | 43 | |
| 157 | 47 | |
| 158 | 53 | |
| 159 | 59 | |
| 160 | 61 | |
| 161 | 67 | |
| 162 | 71 | |
| 163 | 73 | |
| 164 | 79 | |
| 165 | 83 | |
| 166 | 89 | |
| 167 | 97 | |
| 168 | Map(end -> 100, n -> 100, f -> 4, tmp -> 1) | |
| 169 | \end{lstlisting}}
 | |
| 170 | \caption{Sample output for the file \texttt{primes.while}.\label{fib}}
 | |
| 171 | \end{figure}
 | |
| 684 | 172 | |
| 949 | 173 | \noindent | 
| 301 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 174 | Give some time measurements for your interpreter | 
| 
e8c0269c8ff5
update
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
300diff
changeset | 175 | 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 | 176 | 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 | 177 | 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 | 178 | you scale this value if you are willing to wait, say | 
| 473 | 179 | 1 Minute? | 
| 202 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 180 | |
| 949 | 181 | \clearpage | 
| 182 | ||
| 750 | 183 | \begin{figure}[h]
 | 
| 860 | 184 | \lstinputlisting[language=while,xleftmargin=20mm]{../cwtests/cw03/fib.while}
 | 
| 300 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 185 | \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 | 186 | \end{figure}
 | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 187 | |
| 750 | 188 | \begin{figure}[h]
 | 
| 860 | 189 | \lstinputlisting[language=while,xleftmargin=20mm]{../cwtests/cw03/loops.while}
 | 
| 300 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 190 | \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 | 191 | Usually used for timing measurements.\label{loop}}
 | 
| 
08d99acd35e8
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
299diff
changeset | 192 | \end{figure}
 | 
| 214 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 193 | |
| 750 | 194 | \begin{figure}[h]
 | 
| 860 | 195 | \lstinputlisting[language=while,xleftmargin=0mm]{../cwtests/cw03/primes.while}
 | 
| 750 | 196 | \caption{Prime number program.\label{primes}}
 | 
| 197 | \end{figure}
 | |
| 198 | ||
| 199 | ||
| 684 | 200 | \begin{figure}[p]
 | 
| 860 | 201 | \lstinputlisting[language=while,xleftmargin=0mm]{../cwtests/cw03/collatz2.while}
 | 
| 750 | 202 | \caption{Collatz series program.\label{collatz}}
 | 
| 684 | 203 | \end{figure}
 | 
| 204 | ||
| 942 | 205 | \clearpage | 
| 206 | \newpage | |
| 207 | \section*{Answers}
 | |
| 208 | ||
| 949 | 209 | \mbox{}  
 | 
| 210 | ||
| 211 | \noindent | |
| 212 | \textbf{Name:}\uline{\hfill}\bigskip
 | |
| 213 | ||
| 214 | ||
| 215 | ||
| 942 | 216 | \noindent | 
| 217 | \textbf{Question 1 (Grammar):}\\
 | |
| 218 | ||
| 219 | \mbox{}\\[9cm]
 | |
| 220 | ||
| 949 | 221 | \newpage | 
| 942 | 222 | \noindent | 
| 949 | 223 | \textbf{Question 2 (Parse Tree):}\\
 | 
| 942 | 224 | |
| 225 | \mbox{}\\[8cm]
 | |
| 226 | ||
| 227 | ||
| 228 | \noindent | |
| 229 | \textbf{Question 3 (Timings):}\\
 | |
| 230 | ||
| 231 | \begin{center}
 | |
| 232 |   \def\arraystretch{1.5}
 | |
| 233 |   \begin{tabular}{l|l}
 | |
| 234 | n & secs\\ | |
| 235 | \hline | |
| 236 | 100 & \\ | |
| 237 | 500 & \\ | |
| 238 | 700 & \\ | |
| 239 | 1000 & \\ | |
| 240 | \\ | |
| 241 | \\ | |
| 242 | \\ | |
| 243 | \\ | |
| 244 |    \end{tabular} 
 | |
| 245 | \end{center}  
 | |
| 246 | ||
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 247 | \end{document}
 | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 248 | |
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 249 | %%% Local Variables: | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 250 | %%% mode: latex | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 251 | %%% TeX-master: t | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 252 | %%% End: |