hws/hw09.tex
author Christian Urban <christian.urban@kcl.ac.uk>
Tue, 07 Oct 2025 16:20:30 +0100
changeset 1001 a039af69b12e
parent 957 03c5a8987141
permissions -rw-r--r--
updated
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
208
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
     1
\documentclass{article}
292
7ed2a25dd115 updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 208
diff changeset
     2
\usepackage{../style}
7ed2a25dd115 updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 208
diff changeset
     3
\usepackage{../graphics}
459
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
     4
\usepackage{../langs}
906
e7e7fe274f5c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 901
diff changeset
     5
\usepackage{../grammar}
208
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
     6
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
     7
\begin{document}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
     8
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
     9
\section*{Homework 9}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    10
916
2ab96407f350 texupdate
Christian Urban <christian.urban@kcl.ac.uk>
parents: 906
diff changeset
    11
%\HEADER
359
db106e5b7c4d updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 314
diff changeset
    12
208
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    13
\begin{enumerate}
292
7ed2a25dd115 updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 208
diff changeset
    14
\item Describe what is meant by \emph{eliminating tail
459
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    15
      recursion}? When can this optimization be applied and
957
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    16
    why is it of benefit?
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    17
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    18
    \solution{ Tail-call optimisation replaces a recursive call (in
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    19
      tail-call position) by a jump to the beginning of a function.
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    20
      In this way a recursion is replaced by a loop. This saves stack
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    21
      space because no new stack space needs to be allocated when a
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    22
      function is called recursively.
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    23
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    24
      Tail-call optimisation can be applied when the recursive call is
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    25
    the last instruction that is run in the function.}
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    26
    
459
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    27
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    28
\item A programming language has arithmetic expression. For an
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    29
  arithmetic expression the compiler of this language produces the
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    30
  following snippet of JVM code.
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    31
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    32
\begin{lstlisting}[language=JVMIS,numbers=none]
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    33
ldc 1 
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    34
ldc 2 
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    35
ldc 3 
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    36
imul 
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    37
ldc 4 
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    38
ldc 3 
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    39
isub 
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    40
iadd 
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    41
iadd
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    42
\end{lstlisting}
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    43
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    44
  Give the arithmetic expression that produced this code.  Make sure
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    45
  you give all necessary parentheses.
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    46
957
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    47
  \solution{
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    48
    $1 + ((2 * 3) + (4 - 3))$
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    49
  }
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    50
647
d74702cba346 updated
Christian Urban <urbanc@in.tum.de>
parents: 577
diff changeset
    51
\item Describe what the following JVM instructions do!
459
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    52
647
d74702cba346 updated
Christian Urban <urbanc@in.tum.de>
parents: 577
diff changeset
    53
  
d74702cba346 updated
Christian Urban <urbanc@in.tum.de>
parents: 577
diff changeset
    54
\begin{lstlisting}[language=JVMIS2,numbers=none]
d74702cba346 updated
Christian Urban <urbanc@in.tum.de>
parents: 577
diff changeset
    55
ldc 3    
459
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    56
iload 3
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    57
istore 1
525
e5a004ffa681 updated
cu
parents: 459
diff changeset
    58
ifeq label
647
d74702cba346 updated
Christian Urban <urbanc@in.tum.de>
parents: 577
diff changeset
    59
if_icmpge label
459
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    60
\end{lstlisting}
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
    61
957
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    62
\solution{
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    63
(1) load the constant 3 onto the stack. (2) load the 4th local variable onto the stack. (3) store the top of the stack into the 2nd local variable (deleting the top element from the stack) (4) tests whether the top of the stack is equal to zero (if yes, then jump to label; delete top of the stack) (5) compares the top 2 elements of the stack whether they are greater or equal (if yes jump to label; delete two topmost elements from the stack) 
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    64
  }
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    65
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    66
901
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    67
\item What does the following JVM function calculate?
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    68
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    69
\begin{lstlisting}[language=JVMIS2,numbers=none]    
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    70
.method public static bar(I)I
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    71
.limit locals 1
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    72
.limit stack 9
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    73
   iload 0
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    74
   ldc 0
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    75
   if_icmpne If_else_8
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    76
   ldc 0
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    77
   goto If_end_9
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    78
If_else_8:
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    79
   iload 0
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    80
   ldc 1
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    81
   if_icmpne If_else_10
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    82
   ldc 1
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    83
   goto If_end_11
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    84
If_else_10:
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    85
   iload 0
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    86
   ldc 1
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    87
   isub
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    88
   invokestatic bar(I)I
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    89
   iload 0
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    90
   ldc 2
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    91
   isub
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    92
   invokestatic bar(I)I
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    93
   iadd
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    94
If_end_11:
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    95
If_end_9:
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    96
   ireturn
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    97
.end method  
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 805
diff changeset
    98
\end{lstlisting}
577
1d6043a87a3e updated
Christian Urban <urbanc@in.tum.de>
parents: 525
diff changeset
    99
957
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   100
\solution{ Fibonacci function..students should be able to read what the instructions do on the stack).}
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   101
703
7f9a6beea278 updated
Christian Urban <urbanc@in.tum.de>
parents: 649
diff changeset
   102
\item What does the following LLVM function calculate? Give the
7f9a6beea278 updated
Christian Urban <urbanc@in.tum.de>
parents: 649
diff changeset
   103
  corresponding arithmetic expression .
648
a64c9a1007ee updated
Christian Urban <urbanc@in.tum.de>
parents: 647
diff changeset
   104
a64c9a1007ee updated
Christian Urban <urbanc@in.tum.de>
parents: 647
diff changeset
   105
\begin{lstlisting}[language=LLVM,numbers=none]  
a64c9a1007ee updated
Christian Urban <urbanc@in.tum.de>
parents: 647
diff changeset
   106
define i32 @foo(i32 %a, i32 %b)  {
a64c9a1007ee updated
Christian Urban <urbanc@in.tum.de>
parents: 647
diff changeset
   107
  %1 = mul i32 %a, %a
a64c9a1007ee updated
Christian Urban <urbanc@in.tum.de>
parents: 647
diff changeset
   108
  %2 = mul i32 %a, 2
a64c9a1007ee updated
Christian Urban <urbanc@in.tum.de>
parents: 647
diff changeset
   109
  %3 = mul i32 %2, %b
a64c9a1007ee updated
Christian Urban <urbanc@in.tum.de>
parents: 647
diff changeset
   110
  %4 = add i32 %1, %3
a64c9a1007ee updated
Christian Urban <urbanc@in.tum.de>
parents: 647
diff changeset
   111
  %5 = mul i32 %b, %b
a64c9a1007ee updated
Christian Urban <urbanc@in.tum.de>
parents: 647
diff changeset
   112
  %6 = add i32 %5, %4
a64c9a1007ee updated
Christian Urban <urbanc@in.tum.de>
parents: 647
diff changeset
   113
  ret i32 %6
a64c9a1007ee updated
Christian Urban <urbanc@in.tum.de>
parents: 647
diff changeset
   114
}
a64c9a1007ee updated
Christian Urban <urbanc@in.tum.de>
parents: 647
diff changeset
   115
\end{lstlisting}
a64c9a1007ee updated
Christian Urban <urbanc@in.tum.de>
parents: 647
diff changeset
   116
957
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   117
\solution{ $a^2+a*2*b + b^2$
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   118
  }
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   119
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   120
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   121
\item As an optimisation technique, a compiler might want to detect
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   122
  `dead code' and not generate anything for this code. Why does this
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   123
  optimisation technique have the potential of speeding up the
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   124
  run-time of a program? (Hint: On what kind of CPUs are programs run
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   125
  nowadays?)
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   126
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   127
  \solution{ Modern CPUs use predictive branching (guessing which
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   128
    code-branch is run) and use the cache extensively...any code that
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   129
    isn't in the program helps with guessing the right branch and does
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   130
    not occupy anything in the cache. So in effect the code will run
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   131
    faster.  }
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   132
  
906
e7e7fe274f5c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 901
diff changeset
   133
e7e7fe274f5c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 901
diff changeset
   134
\item In an earlier question, we analysed the advantages of having a lexer-phase
e7e7fe274f5c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 901
diff changeset
   135
  before running the parser (having a lexer is definitely a good thing to have). But you
e7e7fe274f5c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 901
diff changeset
   136
  might wonder if a lexer can also be implemented by a parser and some simple
e7e7fe274f5c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 901
diff changeset
   137
  grammar rules. Consider for example:
e7e7fe274f5c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 901
diff changeset
   138
e7e7fe274f5c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 901
diff changeset
   139
  \begin{plstx}[margin=1cm]
e7e7fe274f5c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 901
diff changeset
   140
    : \meta{S\/} ::= (\meta{Kw\/}\mid \meta{Id\/}\mid \meta{Ws\/}) \cdot \meta{S\/} \;\mid\; \epsilon\\
e7e7fe274f5c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 901
diff changeset
   141
    : \meta{Kw\/} ::= \texttt{if} \mid \texttt{then} \mid \ldots\\
e7e7fe274f5c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 901
diff changeset
   142
    : \meta{Id\/} ::= (\texttt{a} \mid\ldots\mid \texttt{z}) \cdot \meta{Id\/} \;\mid\; \epsilon\\
e7e7fe274f5c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 901
diff changeset
   143
    : \meta{Ws\/} ::= \ldots\\
e7e7fe274f5c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 901
diff changeset
   144
  \end{plstx}
e7e7fe274f5c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 901
diff changeset
   145
e7e7fe274f5c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 901
diff changeset
   146
  What is wrong with implementing a lexer in this way?
e7e7fe274f5c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 901
diff changeset
   147
957
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   148
  \solution { There is no problem in terms of which strings are
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   149
    matched (the grammar can be defined such that it matches exactly
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   150
    the same strings. However, CFG do not obey the POSIX rules,
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   151
    meaning they cannot implement ``how regular expressions matc a
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   152
    string'' (for example longest match rule; rule priority).  }
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   153
  
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   154
705
a5fa8ab52fe0 updated
Christian Urban <urbanc@in.tum.de>
parents: 703
diff changeset
   155
\item What is the difference between a parse tree and an abstract
a5fa8ab52fe0 updated
Christian Urban <urbanc@in.tum.de>
parents: 703
diff changeset
   156
  syntax tree? Give some simple examples for each of them.
648
a64c9a1007ee updated
Christian Urban <urbanc@in.tum.de>
parents: 647
diff changeset
   157
957
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   158
  \solution { Parse-trees follow the grammar rules, therefore the
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   159
    inner nodes correspond to the non-terminal symbols in CFGs. ASTs
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   160
    represent the tree-structure of the programs. }
03c5a8987141 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   161
940
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
   162
\item What are the two main features of code in
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
   163
  static single assignment form (SSA)?
577
1d6043a87a3e updated
Christian Urban <urbanc@in.tum.de>
parents: 525
diff changeset
   164
940
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
   165
  \solution{
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
   166
    Variables are only assigned once and all operations are
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
   167
    primitive (in the sense of simple arithmetic operations,
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
   168
    function calls and so on).
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
   169
  }
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
   170
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
   171
  
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
   172
%\item Give a description of how the Brzozowski matcher works. 
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
   173
%  The description should be coherent and logical.
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
   174
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
   175
%\item Give a description of how a compiler for the While-language can
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
   176
%  be implemented. You should assume you are producing code for the JVM.
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
   177
%  The description should be coherent and logical.
805
0fc41a8475ff updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 705
diff changeset
   178
0fc41a8475ff updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 705
diff changeset
   179
  
459
858f62bc930a updated
Christian Urban <urbanc@in.tum.de>
parents: 359
diff changeset
   180
\item \POSTSCRIPT  
208
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   181
314
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   182
%  \item It is true (I confirmed it) that
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   183
%  
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   184
%  \begin{center} if $\varnothing$ does not occur in $r$
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   185
%  \;\;then\;\;$L(r) \not= \{\}$ 
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   186
%  \end{center}
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   187
%  
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   188
%  \noindent
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   189
%  holds, or equivalently
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   190
%  
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   191
%  \begin{center}
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   192
%  $L(r) = \{\}$ \;\;implies\;\; $\varnothing$ occurs in $r$.
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   193
%  \end{center}
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   194
%  
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   195
%  \noindent
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   196
%  You can prove either version by induction on $r$. The best way to
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   197
%  make more formal what is meant by `$\varnothing$ occurs in $r$', you can define
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   198
%  the following function:
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   199
%  
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   200
%  \begin{center}
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   201
%  \begin{tabular}{@ {}l@ {\hspace{2mm}}c@ {\hspace{2mm}}l@ {}}
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   202
%  $occurs(\varnothing)$      & $\dn$ & $true$\\
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   203
%  $occurs(\epsilon)$           & $\dn$ &  $f\!alse$\\
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   204
%  $occurs (c)$                    & $\dn$ &  $f\!alse$\\
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   205
%  $occurs (r_1 + r_2)$       & $\dn$ &  $occurs(r_1) \vee occurs(r_2)$\\ 
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   206
%  $occurs (r_1 \cdot r_2)$ & $\dn$ &  $occurs(r_1) \vee occurs(r_2)$\\
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   207
%  $occurs (r^*)$                & $\dn$ & $occurs(r)$ \\
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   208
%  \end{tabular}
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   209
%  \end{center}
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   210
%  
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   211
%  \noindent
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   212
%  Now you can prove 
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   213
%  
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   214
%  \begin{center}
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   215
%  $L(r) = \{\}$ \;\;implies\;\; $occurs(r)$.
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   216
%  \end{center}
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   217
%  
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   218
%  \noindent
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   219
%  The interesting cases are $r_1 + r_2$ and $r^*$.
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   220
%  The other direction is not true, that is if $occurs(r)$ then $L(r) = \{\}$. A counter example
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   221
%  is $\varnothing + a$: although $\varnothing$ occurs in this regular expression, the corresponding
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   222
%  language is not empty. The obvious extension to include the not-regular expression, $\sim r$,
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   223
%  also leads to an incorrect statement. Suppose we add the clause
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   224
%    
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   225
%  \begin{center}
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   226
%  \begin{tabular}{@ {}l@ {\hspace{2mm}}c@ {\hspace{2mm}}l@ {}}
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   227
%  $occurs(\sim r)$      & $\dn$ & $occurs(r)$
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   228
%  \end{tabular}
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   229
%  \end{center}  
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   230
%  
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   231
%  \noindent
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   232
%  to the definition above, then it will not be true that
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   233
%  
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   234
%  \begin{center}
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   235
%  $L(r) = \{\}$ \;\;implies\;\; $occurs(r)$.
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   236
%  \end{center}
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   237
%  
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   238
%  \noindent
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   239
%  Assume the alphabet contains just $a$ and $b$, find a counter example to this
7dd5797a5ffa updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
   240
%  property.
208
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   241
  
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   242
\end{enumerate}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   243
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   244
\end{document}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   245
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   246
%%% Local Variables: 
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   247
%%% mode: latex
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   248
%%% TeX-master: t
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   249
%%% End: