| author | Christian Urban <christian.urban@kcl.ac.uk> | 
| Mon, 20 Oct 2025 22:18:21 +0200 | |
| changeset 1012 | fbe868b97e33 | 
| parent 991 | b4b97704815b | 
| 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}
 | 
| 309 
640e4a05cd9b
updated
 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}
 | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 5 | |
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 6 | \begin{document}
 | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 7 | |
| 354 
86b2aeae3e98
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
333diff
changeset | 8 | %https://github.com/Storyyeller/Krakatau | 
| 
86b2aeae3e98
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
333diff
changeset | 9 | %https://docs.oracle.com/javase/specs/jvms/se7/html/ | 
| 
86b2aeae3e98
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
333diff
changeset | 10 | |
| 706 | 11 | % Jasmin Tutorial | 
| 12 | %http://saksagan.ceng.metu.edu.tr/courses/ceng444/link/jvm-cpm.html | |
| 13 | ||
| 751 | 14 | \section*{Coursework 4}
 | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 15 | |
| 836 | 16 | \noindent This coursework is worth 15\% and is due on \cwFOUR{}
 | 
| 877 | 17 | at 16:00. You are asked to implement a compiler for | 
| 309 
640e4a05cd9b
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
298diff
changeset | 18 | the WHILE language that targets the assembler language | 
| 823 | 19 | provided by Jasmin or Krakatau (both have a very similar | 
| 973 | 20 | syntax). You can do the implementation in any programming | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 21 | language you like, but you need to submit the source code with | 
| 985 | 22 | which you answered the tasks, otherwise a mark of 0\% will | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 23 | be awarded. You should use the lexer and parser from the | 
| 951 | 24 | previous courseworks. Implement your compiler in the file \texttt{cw04.sc}.
 | 
| 920 | 25 | |
| 26 | %Please package \emph{everything}(!) in
 | |
| 27 | %a zip-file that creates a directory with the name | |
| 28 | %\texttt{YournameYourFamilyname} on my end.
 | |
| 358 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 29 | |
| 751 | 30 | \subsection*{Disclaimer\alert}
 | 
| 358 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 31 | |
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 32 | It should be understood that the work you submit represents | 
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 33 | 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: 
354diff
changeset | 34 | exception is the Scala code I showed during the lectures, | 
| 991 | 35 | which you can use. You can also use your own code from | 
| 36 | CW~1, CW~2 and CW~3. | |
| 37 | %But do not | |
| 38 | %be tempted to ask Github Copilot for help or do any other | |
| 39 | %shenanigans like this! | |
| 358 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 40 | |
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 41 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 42 | \subsection*{Jasmin Assembler}
 | 
| 358 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 43 | |
| 950 | 44 | For this coursework you will need an assembler. | 
| 358 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 45 | The Jasmin assembler is available from | 
| 201 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 46 | |
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 47 | \begin{center}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 48 | \url{http://jasmin.sourceforge.net}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 49 | \end{center}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 50 | |
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 51 | \noindent | 
| 991 | 52 | This jar-file is also included in your template files for CW 4. | 
| 53 | You can run it on the command line with \texttt{java -jar jasmin}.
 | |
| 201 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 54 | There is a user guide for Jasmin | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 55 | |
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 56 | \begin{center}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 57 | \url{http://jasmin.sourceforge.net/guide.html}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 58 | \end{center}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 59 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 60 | \noindent and also a description of some of the instructions | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 61 | that the JVM understands | 
| 201 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 62 | |
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 63 | \begin{center}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 64 | \url{http://jasmin.sourceforge.net/instructions.html}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 65 | \end{center}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 66 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 67 | \noindent If you generated a correct assembler file for | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 68 | Jasmin, for example \texttt{loops.j}, you can use
 | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 69 | |
| 205 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 70 | \begin{center}
 | 
| 950 | 71 | \texttt{java -jar jasmin.jar loops.j}
 | 
| 205 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 72 | \end{center}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 73 | |
| 991 | 74 | \noindent in order to translate it into Java Byte Code. If relevant, you | 
| 852 | 75 | need to give the path to the Jasmin jar-file. The resulting class | 
| 76 | file can be run with | |
| 205 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 77 | |
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 78 | \begin{center}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 79 | \texttt{java loops}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 80 | \end{center}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 81 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 82 | \noindent where you might need to give the correct path to the | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 83 | class file. For example: | 
| 322 
698ed1c96cd0
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
321diff
changeset | 84 | |
| 
698ed1c96cd0
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
321diff
changeset | 85 | \begin{center}
 | 
| 
698ed1c96cd0
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
321diff
changeset | 86 | \texttt{java -cp . loops/loops}
 | 
| 
698ed1c96cd0
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
321diff
changeset | 87 | \end{center}
 | 
| 
698ed1c96cd0
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
321diff
changeset | 88 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 89 | \noindent There are also other resources about Jasmin on the | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 90 | Internet, for example | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 91 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 92 | \begin{center}
 | 
| 836 | 93 | \small\url{https://saksagan.ceng.metu.edu.tr/courses/ceng444/link/f3jasmintutorial.html}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 94 | \end{center}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 95 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 96 | \noindent and | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 97 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 98 | \begin{center}
 | 
| 991 | 99 |   \small\url{https://urbanchr.github.io/cfl/JVM.pdf}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 100 | \end{center}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 101 | |
| 950 | 102 | \noindent | 
| 991 | 103 | The latter is courtesy of Tom Way. | 
| 950 | 104 | If possible use Jasmin for the coursework. The Krakatau assembler | 
| 973 | 105 | below has a slightly different syntax. | 
| 950 | 106 | |
| 107 | ||
| 958 
6caee1c0222e
updated and added pascal.while file
 Christian Urban <christian.urban@kcl.ac.uk> parents: 
951diff
changeset | 108 | \subsection*{Krakatau Assembler (Version 1 \& 2)}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 109 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 110 | The Krakatau assembler is available from | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 111 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 112 | \begin{center}
 | 
| 950 | 113 |   \url{https://github.com/Storyyeller/Krakatau/tree/master}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 114 | \end{center}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 115 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 116 | \noindent This assembler requires Python and a package called | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 117 | \pcode{ply} available from
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 118 | |
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 119 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 120 | \url{https://pypi.python.org/pypi/ply}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 121 | \end{center}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 122 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 123 | \noindent This assembler is largely compatible with the Jasmin | 
| 958 
6caee1c0222e
updated and added pascal.while file
 Christian Urban <christian.urban@kcl.ac.uk> parents: 
951diff
changeset | 124 | syntax---that means for the files we are concerned with here, it | 
| 
6caee1c0222e
updated and added pascal.while file
 Christian Urban <christian.urban@kcl.ac.uk> parents: 
951diff
changeset | 125 | understands the same input syntax (no changes to your compiler need to | 
| 
6caee1c0222e
updated and added pascal.while file
 Christian Urban <christian.urban@kcl.ac.uk> parents: 
951diff
changeset | 126 | be made; ok maybe some small syntactic adjustments are needed, for | 
| 
6caee1c0222e
updated and added pascal.while file
 Christian Urban <christian.urban@kcl.ac.uk> parents: 
951diff
changeset | 127 | example labels need to start with a capital '\texttt{L}'). You can generate Java
 | 
| 
6caee1c0222e
updated and added pascal.while file
 Christian Urban <christian.urban@kcl.ac.uk> parents: 
951diff
changeset | 128 | Byte Code by using | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 129 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 130 | \begin{center}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 131 | \texttt{python Krakatau-master/assemble.py loops.j}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 132 | \end{center}
 | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 133 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 134 | \noindent where you may have to adapt the directory where | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 135 | Krakatau is installed (I just downloaded the zip file from | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 136 | Github and \pcode{Krakatau-master} was the directory where it
 | 
| 473 | 137 | was installed). Again the resulting class-file you can run with | 
| 950 | 138 | \texttt{java}. There is also a newer version of Krakatau available at
 | 
| 139 | ||
| 140 | \begin{center}
 | |
| 141 | \url{https://github.com/Storyyeller/Krakatau/tree/v2}
 | |
| 142 | \end{center}
 | |
| 143 | ||
| 144 | \noindent | |
| 145 | This is now a Rust program using Cargo as package manager (I have not tried this | |
| 146 | version---I assume it should produce the same output, but might be | |
| 147 | easier to install because it avoids Python's \emph{dependency hell}).
 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 148 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 149 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 150 | %\noindent You need to submit a document containing the answers | 
| 985 | 151 | %for the two tasks below. You can do the implementation in | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 152 | %any programming language you like, but you need to submit the | 
| 985 | 153 | %source code with which you answered the tasks. Otherwise | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 154 | %the submission will not be counted. However, the coursework | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 155 | %will \emph{only} be judged according to the answers. You can
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 156 | %submit your answers in a txt-file or as pdf.\bigskip | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 157 | |
| 985 | 158 | %\subsection*{Task 0 (Unmarked)}
 | 
| 920 | 159 | % | 
| 160 | %Please include in the PDF at the beginning your email address, your student | |
| 161 | %number and whether you are BSc / MSci student and for the latter in which | |
| 162 | %year your are in. Thanks! | |
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 163 | |
| 985 | 164 | \subsection*{Task 1}
 | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 165 | |
| 958 
6caee1c0222e
updated and added pascal.while file
 Christian Urban <christian.urban@kcl.ac.uk> parents: 
951diff
changeset | 166 | You need to lex and parse WHILE programs, and then generate Java Byte | 
| 
6caee1c0222e
updated and added pascal.while file
 Christian Urban <christian.urban@kcl.ac.uk> parents: 
951diff
changeset | 167 | Code instructions for the Jasmin assembler (or Krakatau | 
| 
6caee1c0222e
updated and added pascal.while file
 Christian Urban <christian.urban@kcl.ac.uk> parents: 
951diff
changeset | 168 | assembler). For this you should use the ASTs defined in CW3 (including | 
| 
6caee1c0222e
updated and added pascal.while file
 Christian Urban <christian.urban@kcl.ac.uk> parents: 
951diff
changeset | 169 | logical operators). As part of the solution you need to submit the assembler | 
| 973 | 170 | instructions for the Fibonacci and Factorial programs. | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 171 | |
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 172 | \begin{figure}[t]
 | 
| 852 | 173 | \lstinputlisting[language=while]{../cwtests/cw04/fib.while}
 | 
| 320 
0c43ef11e086
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
313diff
changeset | 174 | \caption{The Fibonacci program in the WHILE language.\label{fibs}}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 175 | \end{figure}
 | 
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 176 | |
| 985 | 177 | \subsection*{Task 2}
 | 
| 201 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 178 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 179 | Extend the syntax of your language so that it contains also | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 180 | \texttt{for}-loops, like
 | 
| 201 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 181 | |
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 182 | \begin{center}
 | 
| 391 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 183 | \lstset{language=While}
 | 
| 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 184 | \code{for} \;\textit{Id} \texttt{:=} \textit{AExp}\; \code{upto} 
 | 
| 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 185 | \;\textit{AExp}\; \code{do} \textit{Block} 
 | 
| 201 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 186 | \end{center}
 | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 187 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 188 | \noindent The intended meaning is to first assign the variable | 
| 950 | 189 | \textit{Id} the value of the first arithmetic expression, then test
 | 
| 598 | 190 | whether this value is less or equal than the value of the | 
| 391 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 191 | second arithmetic expression. If yes, go through the loop, and | 
| 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 192 | at the end increase the value of the loop variable by 1 and | 
| 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 193 | start again with the test. If no, leave the loop. For example | 
| 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 194 | the following instance of a \code{for}-loop is supposed to
 | 
| 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 195 | print out the numbers \pcode{2}, \pcode{3}, \pcode{4}.
 | 
| 202 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 196 | |
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 197 | |
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 198 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 199 | \begin{minipage}{12cm}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 200 | \begin{lstlisting}[language=While, numbers=none]
 | 
| 202 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 201 | for i := 2 upto 4 do {
 | 
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 202 | write i | 
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 203 | } | 
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 204 | \end{lstlisting}
 | 
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 205 | \end{minipage}
 | 
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 206 | \end{center}
 | 
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 207 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 208 | \noindent There are two ways how this can be implemented: one | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 209 | is to adapt the code generation part of the compiler and | 
| 391 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 210 | generate specific code for \code{for}-loops; the other is to
 | 
| 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 211 | translate the abstract syntax tree of \code{for}-loops into
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 212 | an abstract syntax tree using existing language constructs. | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 213 | For example the loop above could be translated to the | 
| 391 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 214 | following \code{while}-loop:
 | 
| 203 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 215 | |
| 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 216 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 217 | \begin{minipage}{12cm}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 218 | \begin{lstlisting}[language=While, numbers=none]
 | 
| 203 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 219 | i := 2; | 
| 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 220 | while (i <= 4) do {
 | 
| 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 221 | write i; | 
| 905 | 222 | i := i + 1 | 
| 203 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 223 | } | 
| 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 224 | \end{lstlisting}
 | 
| 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 225 | \end{minipage}
 | 
| 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 226 | \end{center}
 | 
| 202 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 227 | |
| 985 | 228 | \subsection*{Task 3 (OPTIONAL)}
 | 
| 333 
8890852e18b7
updated coursework
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
328diff
changeset | 229 | |
| 985 | 230 | \noindent In this task you are asked to think about the following | 
| 973 | 231 | program: | 
| 205 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 232 | |
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 233 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 234 | \begin{minipage}{12cm}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 235 | \begin{lstlisting}[language=While, numbers=none]
 | 
| 333 
8890852e18b7
updated coursework
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
328diff
changeset | 236 | for i := 1 upto 10 do {
 | 
| 
8890852e18b7
updated coursework
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
328diff
changeset | 237 |   for i := 1 upto 10 do {
 | 
| 
8890852e18b7
updated coursework
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
328diff
changeset | 238 | write i | 
| 205 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 239 | } | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 240 | } | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 241 | \end{lstlisting}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 242 | \end{minipage}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 243 | \end{center}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 244 | |
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 245 | \noindent | 
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 246 | Note that in this program the variable \pcode{i} is used
 | 
| 973 | 247 | twice. Therefore you need to make a decision about how it should be compiled? | 
| 248 | What should the program print? | |
| 202 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 249 | |
| 985 | 250 | \subsection*{Task 4}
 | 
| 920 | 251 | |
| 942 | 252 | Extend the lexer and parser to add a \textcolor{codepurple}{\pcode{break}} keyword.  Modify
 | 
| 253 | the compiler (including lexer and parser) such that when a \textcolor{codepurple}{\texttt{break}}-statement is encountered
 | |
| 958 
6caee1c0222e
updated and added pascal.while file
 Christian Urban <christian.urban@kcl.ac.uk> parents: 
951diff
changeset | 254 | the code should jump out of the ``enclosing'' for/while-loop, or in case it | 
| 
6caee1c0222e
updated and added pascal.while file
 Christian Urban <christian.urban@kcl.ac.uk> parents: 
951diff
changeset | 255 | is not inside such a loop to the end of the program. For example the | 
| 920 | 256 | program | 
| 257 | ||
| 258 | \begin{center}
 | |
| 259 | \begin{minipage}{12cm}
 | |
| 260 | \begin{lstlisting}[language=While, numbers=none]
 | |
| 942 | 261 | // should print 0 .. 10 | 
| 920 | 262 | for i := 0 upto 10 do {
 | 
| 263 | write i; | |
| 264 | write "\n" | |
| 265 | }; | |
| 910 | 266 | |
| 942 | 267 | // should print 0 .. 4 | 
| 920 | 268 | for i := 0 upto 10 do {
 | 
| 269 | if i > 4 then break else skip; | |
| 270 | write i; | |
| 271 | write "\n" | |
| 272 | }; | |
| 910 | 273 | |
| 920 | 274 | write "Should print\n"; | 
| 275 | break; | |
| 276 | write "Should not print\n" | |
| 277 | \end{lstlisting}
 | |
| 278 | \end{minipage}
 | |
| 279 | \end{center}
 | |
| 280 | ||
| 281 | \noindent | |
| 950 | 282 | should print out 0 to 10 with the first for-loop, but only 0 | 
| 920 | 283 | to 4 in the second. Similarly it should print out \code{"Should print"},
 | 
| 284 | but not \code{"Should not print"}. For this you need to add
 | |
| 958 
6caee1c0222e
updated and added pascal.while file
 Christian Urban <christian.urban@kcl.ac.uk> parents: 
951diff
changeset | 285 | a label to the end of every for- and while-loop and also to the end of the | 
| 920 | 286 | whole program just in case you need to jump to that label via a | 
| 985 | 287 | \code{break}. The file you need to be able to process for this task
 | 
| 951 | 288 | is called \texttt{break.while}.
 | 
| 920 | 289 | |
| 910 | 290 | |
| 204 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 291 | \subsection*{Further Information}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 292 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 293 | The Java infrastructure unfortunately does not contain an | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 294 | assembler out-of-the-box (therefore you need to download the | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 295 | additional package Jasmin or Krakatau---see above). But it | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 296 | does contain a disassembler, called \texttt{javap}. A
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 297 | dissembler does the ``opposite'' of an assembler: it generates | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 298 | readable assembler code from Java Byte Code. Have a look at | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 299 | the following example: Compile using the usual Java compiler | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 300 | the simple Hello World program below: | 
| 204 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 301 | |
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 302 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 303 | \begin{minipage}{12cm}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 304 | \begin{lstlisting}[language=Java,numbers=none]
 | 
| 204 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 305 | class HelloWorld {
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 306 |     public static void main(String[] args) {
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 307 |         System.out.println("Hello World!");
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 308 | } | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 309 | } | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 310 | \end{lstlisting}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 311 | \end{minipage}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 312 | \end{center}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 313 | |
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 314 | \noindent | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 315 | You can use the command | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 316 | |
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 317 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 318 | \begin{minipage}{12cm}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 319 | \begin{lstlisting}[language={},numbers=none]
 | 
| 950 | 320 | javap -c HelloWorld | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 321 | \end{lstlisting}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 322 | \end{minipage}
 | 
| 204 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 323 | \end{center}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 324 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 325 | \noindent to see the assembler instructions of the Java Byte | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 326 | Code that has been generated for this program. You can compare | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 327 | this with the code generated for the Scala version of Hello | 
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 328 | World. | 
| 204 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 329 | |
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 330 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 331 | \begin{minipage}{12cm}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 332 | \begin{lstlisting}[language=Scala,numbers=none]
 | 
| 204 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 333 | object HelloWorld {
 | 
| 950 | 334 |    def main(args: Array[String]) = {
 | 
| 204 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 335 |       println("Hello World!")
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 336 | } | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 337 | } | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 338 | \end{lstlisting}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 339 | \end{minipage}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 340 | \end{center}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 341 | |
| 222 
b712519b41d3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
216diff
changeset | 342 | |
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 343 | \subsection*{Library Functions}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 344 | |
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 345 | You need to generate code for the commands \texttt{write} and
 | 
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 346 | \texttt{read}. This will require the addition of some
 | 
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 347 | ``library'' functions to your generated code. The first | 
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 348 | command even needs two versions, because you need to write out | 
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 349 | an integer and string. The Java byte code will need two | 
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 350 | separate functions for this. For writing out an integer, you | 
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 351 | can use the assembler code | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 352 | |
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 353 | \begin{center}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 354 | \begin{minipage}{12cm}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 355 | \begin{lstlisting}[language=JVMIS, numbers=none]
 | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 356 | .method public static write(I)V | 
| 859 | 357 | .limit locals 1 | 
| 358 | .limit stack 2 | |
| 359 | getstatic java/lang/System/out Ljava/io/PrintStream; | |
| 360 | iload 0 | |
| 361 | invokevirtual java/io/PrintStream/println(I)V | |
| 362 | return | |
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 363 | .end method | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 364 | \end{lstlisting}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 365 | \end{minipage}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 366 | \end{center}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 367 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 368 | \noindent This function will invoke Java's \texttt{println}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 369 | function for integers. Then if you need to generate code for | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 370 | \texttt{write x} where \texttt{x} is an integer variable, you
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 371 | can generate | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 372 | |
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 373 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 374 | \begin{minipage}{12cm}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 375 | \begin{lstlisting}[language=JVMIS, numbers=none]
 | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 376 | iload n | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 377 | invokestatic XXX/XXX/write(I)V | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 378 | \end{lstlisting}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 379 | \end{minipage}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 380 | \end{center}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 381 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 382 | \noindent where \texttt{n} is the index where the value of the
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 383 | variable \texttt{x} is stored. The \texttt{XXX/XXX} needs to
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 384 | be replaced with the class name which you use to generate the | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 385 | code (for example \texttt{fib/fib} in case of the Fibonacci
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 386 | numbers). | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 387 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 388 | Writing out a string is similar. The corresponding library | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 389 | function uses strings instead of integers: | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 390 | |
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 391 | \begin{center}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 392 | \begin{minipage}{12cm}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 393 | \begin{lstlisting}[language=JVMIS, numbers=none]
 | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 394 | .method public static writes(Ljava/lang/String;)V | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 395 | .limit stack 2 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 396 | .limit locals 1 | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 397 | getstatic java/lang/System/out Ljava/io/PrintStream; | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 398 | aload 0 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 399 | invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 400 | return | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 401 | .end method | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 402 | \end{lstlisting}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 403 | \end{minipage}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 404 | \end{center}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 405 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 406 | \noindent The code that needs to be generated for \code{write
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 407 | "some_string"} commands is | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 408 | |
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 409 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 410 | \begin{minipage}{12cm}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 411 | \begin{lstlisting}[language=JVMIS,numbers=none]
 | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 412 | ldc "some_string" | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 413 | invokestatic XXX/XXX/writes(Ljava/lang/String;)V | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 414 | \end{lstlisting}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 415 | \end{minipage}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 416 | \end{center}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 417 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 418 | \noindent Again you need to adjust the \texttt{XXX/XXX} part
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 419 | in each call. | 
| 202 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 420 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 421 | The code for \texttt{read} is more complicated. The reason is
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 422 | that inputting a string will need to be transformed into an | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 423 | integer. The code in Figure~\ref{read} does this. It can be
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 424 | called with | 
| 214 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 425 | |
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 426 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 427 | \begin{minipage}{12cm}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 428 | \begin{lstlisting}[language=JVMIS,numbers=none]
 | 
| 214 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 429 | invokestatic XXX/XXX/read()I | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 430 | istore n | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 431 | \end{lstlisting}
 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 432 | \end{minipage}
 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 433 | \end{center}
 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 434 | |
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 435 | \noindent | 
| 950 | 436 | where \texttt{n} is the index of the variable that requires an input.
 | 
| 437 | %If you | |
| 438 | %use Windows you need to take into account that a ``return'' is not just a newline, | |
| 439 | %\code{'\\10'}, but \code{'\\13\\10'}. This means you need to change line~12 in 
 | |
| 440 | %Figure~\ref{read} to \pcode{ldc 13}.  
 | |
| 214 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 441 | |
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 442 | |
| 321 
c5850f8f3f5e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
320diff
changeset | 443 | \begin{figure}[t]\small
 | 
| 540 | 444 | \begin{lstlisting}[language=JVMIS,numbers=left]
 | 
| 214 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 445 | .method public static read()I | 
| 859 | 446 | .limit locals 10 | 
| 447 | .limit stack 10 | |
| 214 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 448 | |
| 859 | 449 | ldc 0 | 
| 450 | istore 1 ; this will hold our final integer | |
| 214 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 451 | Label1: | 
| 859 | 452 | getstatic java/lang/System/in Ljava/io/InputStream; | 
| 453 | invokevirtual java/io/InputStream/read()I | |
| 454 | istore 2 | |
| 455 | iload 2 | |
| 950 | 456 | ldc 10 ; test for the newline delimiter for Unix | 
| 859 | 457 | isub | 
| 950 | 458 | ifeq Label2 | 
| 459 | iload 2 | |
| 460 | ldc 13 ; test for the carriage-return in Windows | |
| 461 | isub | |
| 462 | ifeq Label2 | |
| 859 | 463 | iload 2 | 
| 464 | ldc 32 ; the space delimiter | |
| 465 | isub | |
| 466 | ifeq Label2 | |
| 467 | iload 2 | |
| 468 | ldc 48 ; we have our digit in ASCII, have to subtract it from 48 | |
| 469 | isub | |
| 470 | ldc 10 | |
| 471 | iload 1 | |
| 472 | imul | |
| 473 | iadd | |
| 474 | istore 1 | |
| 475 | goto Label1 | |
| 214 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 476 | Label2: | 
| 859 | 477 | ; when we come here we have our integer computed | 
| 478 | ; in local variable 1 | |
| 479 | iload 1 | |
| 480 | ireturn | |
| 214 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 481 | .end method | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 482 | \end{lstlisting}\normalsize
 | 
| 950 | 483 | \caption{Assembler code for reading an integer from the console.
 | 
| 484 | This code is portable for Unix and Windows (see Lines 11--18 for 2 separate | |
| 485 | tests for the various end-of-line markers). Thanks to Harry | |
| 486 |   Dilnot to make it portable.\label{read}}
 | |
| 214 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 487 | \end{figure}
 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 488 | |
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 489 | \end{document}
 | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 490 | |
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 491 | %%% Local Variables: | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 492 | %%% mode: latex | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 493 | %%% TeX-master: t | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 494 | %%% End: |