| author | Christian Urban <christian.urban@kcl.ac.uk> | 
| Tue, 03 Oct 2023 23:23:57 +0100 | |
| changeset 937 | b3a237a5f4ad | 
| parent 920 | bcff91cc274f | 
| child 942 | 7f52427568ff | 
| 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 | 
| 20 | syntax). Please submit your answers to the questions | |
| 21 | below as PDF. 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 | 22 | language you like, but you need to submit the source code with | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 23 | which you answered the questions, otherwise a mark of 0\% will | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 24 | be awarded. You should use the lexer and parser from the | 
| 920 | 25 | previous courseworks. | 
| 26 | ||
| 27 | %Please package \emph{everything}(!) in
 | |
| 28 | %a zip-file that creates a directory with the name | |
| 29 | %\texttt{YournameYourFamilyname} on my end.
 | |
| 358 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 30 | |
| 751 | 31 | \subsection*{Disclaimer\alert}
 | 
| 358 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 32 | |
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 33 | 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 | 34 | 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 | 35 | exception is the Scala code I showed during the lectures, | 
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 36 | which you can use. You can also use your own code from the | 
| 886 | 37 | CW~1, CW~2 and CW~3. 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 | |
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 44 | The Jasmin assembler is available from | 
| 201 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 45 | |
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 46 | \begin{center}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 47 | \url{http://jasmin.sourceforge.net}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 48 | \end{center}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 49 | |
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 50 | \noindent | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 51 | There is a user guide for Jasmin | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 52 | |
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 53 | \begin{center}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 54 | \url{http://jasmin.sourceforge.net/guide.html}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 55 | \end{center}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 56 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 57 | \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 | 58 | that the JVM understands | 
| 201 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 59 | |
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 60 | \begin{center}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 61 | \url{http://jasmin.sourceforge.net/instructions.html}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 62 | \end{center}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 63 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 64 | \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 | 65 | 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 | 66 | |
| 205 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 67 | \begin{center}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 68 | \texttt{java -jar jasmin-2.4/jasmin.jar loops.j}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 69 | \end{center}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 70 | |
| 852 | 71 | \noindent in order to translate it into Java Byte Code. If needed, you | 
| 72 | need to give the path to the Jasmin jar-file. The resulting class | |
| 73 | file can be run with | |
| 205 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 74 | |
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 75 | \begin{center}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 76 | \texttt{java loops}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 77 | \end{center}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 78 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 79 | \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 | 80 | class file. For example: | 
| 322 
698ed1c96cd0
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
321diff
changeset | 81 | |
| 
698ed1c96cd0
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
321diff
changeset | 82 | \begin{center}
 | 
| 
698ed1c96cd0
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
321diff
changeset | 83 | \texttt{java -cp . loops/loops}
 | 
| 
698ed1c96cd0
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
321diff
changeset | 84 | \end{center}
 | 
| 
698ed1c96cd0
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
321diff
changeset | 85 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 86 | \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 | 87 | Internet, for example | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 88 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 89 | \begin{center}
 | 
| 836 | 90 | \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 | 91 | \end{center}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 92 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 93 | \noindent and | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 94 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 95 | \begin{center}
 | 
| 905 | 96 |   \small\url{http://www.csc.villanova.edu/~tway/courses/csc4181/s2022/labs/finalproject/JVM.pdf}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 97 | \end{center}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 98 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 99 | \subsection*{Krakatau Assembler}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 100 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 101 | The Krakatau assembler is available from | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 102 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 103 | \begin{center}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 104 | \url{https://github.com/Storyyeller/Krakatau}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 105 | \end{center}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 106 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 107 | \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 | 108 | \pcode{ply} available from
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 109 | |
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 110 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 111 | \url{https://pypi.python.org/pypi/ply}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 112 | \end{center}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 113 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 114 | \noindent This assembler is largely compatible with the Jasmin | 
| 473 | 115 | syntax---that means for the files we are concerned with here, | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 116 | it understands the same input syntax (no changes to your | 
| 473 | 117 | compiler need to be made; ok maybe some small syntactic | 
| 118 | adjustments are needed). You can generate Java Byte Code by | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 119 | using | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 120 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 121 | \begin{center}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 122 | \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 | 123 | \end{center}
 | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 124 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 125 | \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 | 126 | 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 | 127 | Github and \pcode{Krakatau-master} was the directory where it
 | 
| 473 | 128 | was installed). Again the resulting class-file you can run with | 
| 129 | \texttt{java}.
 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 130 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 131 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 132 | %\noindent You need to submit a document containing the answers | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 133 | %for the two questions below. You can do the implementation in | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 134 | %any programming language you like, but you need to submit the | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 135 | %source code with which you answered the questions. Otherwise | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 136 | %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 | 137 | %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 | 138 | %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 | 139 | |
| 920 | 140 | %\subsection*{Question 0 (Unmarked)}
 | 
| 141 | % | |
| 142 | %Please include in the PDF at the beginning your email address, your student | |
| 143 | %number and whether you are BSc / MSci student and for the latter in which | |
| 144 | %year your are in. Thanks! | |
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 145 | |
| 419 
4110ab35e5d8
updated courseworks
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
391diff
changeset | 146 | \subsection*{Question 1}
 | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 147 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 148 | You need to lex and parse WHILE programs, and then generate | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 149 | Java Byte Code instructions for the Jasmin assembler (or | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 150 | Krakatau assembler). As solution you need to submit the | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 151 | assembler instructions for the Fibonacci and Factorial | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 152 | programs. Both should be so modified that a user can input on | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 153 | the console which Fibonacci number and which Factorial should | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 154 | be calculated. The Fibonacci program is given in | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 155 | Figure~\ref{fibs}. You can write your own program for
 | 
| 473 | 156 | calculating factorials. Submit your assembler code as | 
| 157 | a file that can be run, not as PDF-text. | |
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 158 | |
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 159 | \begin{figure}[t]
 | 
| 852 | 160 | \lstinputlisting[language=while]{../cwtests/cw04/fib.while}
 | 
| 320 
0c43ef11e086
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
313diff
changeset | 161 | \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 | 162 | \end{figure}
 | 
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 163 | |
| 419 
4110ab35e5d8
updated courseworks
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
391diff
changeset | 164 | \subsection*{Question 2}
 | 
| 201 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 165 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 166 | 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 | 167 | \texttt{for}-loops, like
 | 
| 201 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 168 | |
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 169 | \begin{center}
 | 
| 391 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 170 | \lstset{language=While}
 | 
| 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 171 | \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 | 172 | \;\textit{AExp}\; \code{do} \textit{Block} 
 | 
| 201 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 173 | \end{center}
 | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 174 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 175 | \noindent The intended meaning is to first assign the variable | 
| 391 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 176 | \textit{Id} the value of the first arithmetic expression, test
 | 
| 598 | 177 | 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 | 178 | 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 | 179 | 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 | 180 | 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 | 181 | 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 | 182 | 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 | 183 | |
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 184 | |
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 185 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 186 | \begin{minipage}{12cm}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 187 | \begin{lstlisting}[language=While, numbers=none]
 | 
| 202 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 188 | for i := 2 upto 4 do {
 | 
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 189 | write i | 
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 190 | } | 
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 191 | \end{lstlisting}
 | 
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 192 | \end{minipage}
 | 
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 193 | \end{center}
 | 
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 194 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 195 | \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 | 196 | 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 | 197 | 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 | 198 | 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 | 199 | an abstract syntax tree using existing language constructs. | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 200 | 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 | 201 | following \code{while}-loop:
 | 
| 203 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 202 | |
| 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 203 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 204 | \begin{minipage}{12cm}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 205 | \begin{lstlisting}[language=While, numbers=none]
 | 
| 203 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 206 | i := 2; | 
| 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 207 | while (i <= 4) do {
 | 
| 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 208 | write i; | 
| 905 | 209 | i := i + 1 | 
| 203 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 210 | } | 
| 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 211 | \end{lstlisting}
 | 
| 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 212 | \end{minipage}
 | 
| 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 213 | \end{center}
 | 
| 202 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 214 | |
| 630 | 215 | \subsection*{Question 3}
 | 
| 333 
8890852e18b7
updated coursework
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
328diff
changeset | 216 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 217 | \noindent In this question you are supposed to give the | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 218 | assembler instructions for the program | 
| 205 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 219 | |
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 220 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 221 | \begin{minipage}{12cm}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 222 | \begin{lstlisting}[language=While, numbers=none]
 | 
| 333 
8890852e18b7
updated coursework
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
328diff
changeset | 223 | for i := 1 upto 10 do {
 | 
| 
8890852e18b7
updated coursework
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
328diff
changeset | 224 |   for i := 1 upto 10 do {
 | 
| 
8890852e18b7
updated coursework
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
328diff
changeset | 225 | write i | 
| 205 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 226 | } | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 227 | } | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 228 | \end{lstlisting}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 229 | \end{minipage}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 230 | \end{center}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 231 | |
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 232 | \noindent | 
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 233 | Note that in this program the variable \pcode{i} is used
 | 
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 234 | twice. You need to make a decision how it should be compiled? | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 235 | Explain your decision and indicate what this program would | 
| 333 
8890852e18b7
updated coursework
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
328diff
changeset | 236 | print out. | 
| 202 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 237 | |
| 920 | 238 | \subsection*{Question 4}
 | 
| 239 | ||
| 240 | Extend the lexer and parser to add a \texttt{break} keyword.  Modify
 | |
| 241 | the compiler such that when a \texttt{break}-statement is encountered
 | |
| 242 | the code should jump out of the ``enclosing'' for-loop, or in case it | |
| 243 | is not inside a for-loop to the end of the program. For example the | |
| 244 | program | |
| 245 | ||
| 246 | \begin{center}
 | |
| 247 | \begin{minipage}{12cm}
 | |
| 248 | \begin{lstlisting}[language=While, numbers=none]
 | |
| 249 | for i := 0 upto 10 do {
 | |
| 250 | write i; | |
| 251 | write "\n" | |
| 252 | }; | |
| 910 | 253 | |
| 920 | 254 | for i := 0 upto 10 do {
 | 
| 255 | if i > 4 then break else skip; | |
| 256 | write i; | |
| 257 | write "\n" | |
| 258 | }; | |
| 910 | 259 | |
| 920 | 260 | write "Should print\n"; | 
| 261 | break; | |
| 262 | write "Should not print\n" | |
| 263 | \end{lstlisting}
 | |
| 264 | \end{minipage}
 | |
| 265 | \end{center}
 | |
| 266 | ||
| 267 | \noindent | |
| 268 | should print out 1 to 10 with the first for-loop, but only 1 | |
| 269 | to 4 in the second. Similarly it should print out \code{"Should print"},
 | |
| 270 | but not \code{"Should not print"}. For this you need to add
 | |
| 271 | a label to the end of every for-loop and also to the end of the | |
| 272 | whole program just in case you need to jump to that label via a | |
| 273 | \code{break}.
 | |
| 274 | ||
| 910 | 275 | |
| 204 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 276 | \subsection*{Further Information}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 277 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 278 | The Java infrastructure unfortunately does not contain an | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 279 | 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 | 280 | 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 | 281 | does contain a disassembler, called \texttt{javap}. A
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 282 | 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 | 283 | 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 | 284 | 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 | 285 | the simple Hello World program below: | 
| 204 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 286 | |
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 287 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 288 | \begin{minipage}{12cm}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 289 | \begin{lstlisting}[language=Java,numbers=none]
 | 
| 204 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 290 | class HelloWorld {
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 291 |     public static void main(String[] args) {
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 292 |         System.out.println("Hello World!");
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 293 | } | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 294 | } | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 295 | \end{lstlisting}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 296 | \end{minipage}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 297 | \end{center}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 298 | |
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 299 | \noindent | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 300 | You can use the command | 
| 
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}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 304 | \begin{lstlisting}[language={},numbers=none]
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 305 | javap -v HelloWorld | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 306 | \end{lstlisting}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 307 | \end{minipage}
 | 
| 204 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 308 | \end{center}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 309 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 310 | \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 | 311 | 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 | 312 | 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 | 313 | World. | 
| 204 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 314 | |
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 315 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 316 | \begin{minipage}{12cm}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 317 | \begin{lstlisting}[language=Scala,numbers=none]
 | 
| 204 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 318 | object HelloWorld {
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 319 |    def main(args: Array[String]) {
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 320 |       println("Hello World!")
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 321 | } | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 322 | } | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 323 | \end{lstlisting}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 324 | \end{minipage}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 325 | \end{center}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 326 | |
| 222 
b712519b41d3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
216diff
changeset | 327 | |
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 328 | \subsection*{Library Functions}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 329 | |
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 330 | 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 | 331 | \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 | 332 | ``library'' functions to your generated code. The first | 
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 333 | 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 | 334 | 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 | 335 | 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 | 336 | can use the assembler code | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 337 | |
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 338 | \begin{center}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 339 | \begin{minipage}{12cm}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 340 | \begin{lstlisting}[language=JVMIS, numbers=none]
 | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 341 | .method public static write(I)V | 
| 859 | 342 | .limit locals 1 | 
| 343 | .limit stack 2 | |
| 344 | getstatic java/lang/System/out Ljava/io/PrintStream; | |
| 345 | iload 0 | |
| 346 | invokevirtual java/io/PrintStream/println(I)V | |
| 347 | return | |
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 348 | .end method | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 349 | \end{lstlisting}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 350 | \end{minipage}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 351 | \end{center}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 352 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 353 | \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 | 354 | 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 | 355 | \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 | 356 | can generate | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 357 | |
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 358 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 359 | \begin{minipage}{12cm}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 360 | \begin{lstlisting}[language=JVMIS, numbers=none]
 | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 361 | iload n | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 362 | invokestatic XXX/XXX/write(I)V | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 363 | \end{lstlisting}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 364 | \end{minipage}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 365 | \end{center}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 366 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 367 | \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 | 368 | 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 | 369 | 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 | 370 | 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 | 371 | numbers). | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 372 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 373 | 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 | 374 | function uses strings instead of integers: | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 375 | |
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 376 | \begin{center}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 377 | \begin{minipage}{12cm}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 378 | \begin{lstlisting}[language=JVMIS, numbers=none]
 | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 379 | .method public static writes(Ljava/lang/String;)V | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 380 | .limit stack 2 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 381 | .limit locals 1 | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 382 | getstatic java/lang/System/out Ljava/io/PrintStream; | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 383 | aload 0 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 384 | 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 | 385 | return | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 386 | .end method | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 387 | \end{lstlisting}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 388 | \end{minipage}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 389 | \end{center}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 390 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 391 | \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 | 392 | "some_string"} commands is | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 393 | |
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 394 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 395 | \begin{minipage}{12cm}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 396 | \begin{lstlisting}[language=JVMIS,numbers=none]
 | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 397 | ldc "some_string" | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 398 | invokestatic XXX/XXX/writes(Ljava/lang/String;)V | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 399 | \end{lstlisting}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 400 | \end{minipage}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 401 | \end{center}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 402 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 403 | \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 | 404 | in each call. | 
| 202 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 405 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 406 | 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 | 407 | 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 | 408 | 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 | 409 | called with | 
| 214 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 410 | |
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 411 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 412 | \begin{minipage}{12cm}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 413 | \begin{lstlisting}[language=JVMIS,numbers=none]
 | 
| 214 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 414 | invokestatic XXX/XXX/read()I | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 415 | istore n | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 416 | \end{lstlisting}
 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 417 | \end{minipage}
 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 418 | \end{center}
 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 419 | |
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 420 | \noindent | 
| 321 
c5850f8f3f5e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
320diff
changeset | 421 | where \texttt{n} is the index of the variable that requires an input. If you
 | 
| 
c5850f8f3f5e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
320diff
changeset | 422 | use Windows you need to take into account that a ``return'' is not just a newline, | 
| 
c5850f8f3f5e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
320diff
changeset | 423 | \code{'\\10'}, but \code{'\\13\\10'}. This means you need to change line~12 in 
 | 
| 
c5850f8f3f5e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
320diff
changeset | 424 | Figure~\ref{read} to \pcode{ldc 13}.  
 | 
| 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 | |
| 321 
c5850f8f3f5e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
320diff
changeset | 427 | \begin{figure}[t]\small
 | 
| 540 | 428 | \begin{lstlisting}[language=JVMIS,numbers=left]
 | 
| 214 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 429 | .method public static read()I | 
| 859 | 430 | .limit locals 10 | 
| 431 | .limit stack 10 | |
| 214 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 432 | |
| 859 | 433 | ldc 0 | 
| 434 | 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 | 435 | Label1: | 
| 859 | 436 | getstatic java/lang/System/in Ljava/io/InputStream; | 
| 437 | invokevirtual java/io/InputStream/read()I | |
| 438 | istore 2 | |
| 439 | iload 2 | |
| 440 | ldc 10 ; the newline delimiter for Unix (Windows 13) | |
| 441 | isub | |
| 442 | ifeq Label2 | |
| 443 | iload 2 | |
| 444 | ldc 32 ; the space delimiter | |
| 445 | isub | |
| 446 | ifeq Label2 | |
| 447 | iload 2 | |
| 448 | ldc 48 ; we have our digit in ASCII, have to subtract it from 48 | |
| 449 | isub | |
| 450 | ldc 10 | |
| 451 | iload 1 | |
| 452 | imul | |
| 453 | iadd | |
| 454 | istore 1 | |
| 455 | goto Label1 | |
| 214 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 456 | Label2: | 
| 859 | 457 | ; when we come here we have our integer computed | 
| 458 | ; in local variable 1 | |
| 459 | iload 1 | |
| 460 | ireturn | |
| 214 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 461 | .end method | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 462 | \end{lstlisting}\normalsize
 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 463 | \caption{Assembler code for reading an integer from the console.\label{read}}
 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 464 | \end{figure}
 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 465 | |
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 466 | \end{document}
 | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 467 | |
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 468 | %%% Local Variables: | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 469 | %%% mode: latex | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 470 | %%% TeX-master: t | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 471 | %%% End: |