\documentclass[dvipsnames,14pt,t,xelatex]{beamer}\usepackage{../slides}\usepackage{../graphics}\usepackage{../langs}\usepackage{../data}\hfuzz=220pt %\setmonofont[Scale=.88]{Consolas}%\newfontfamily{\consolas}{Consolas}\lstset{language=Scala, style=mystyle, numbersep=0pt, numbers=none, xleftmargin=0mm}\newcommand{\bl}[1]{\textcolor{blue}{#1}} % beamer stuff \renewcommand{\slidecaption}{AFL 01, King's College London}\begin{document}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\begin{frame}[t]\frametitle{% \begin{tabular}{@ {}c@ {}} \\[-3mm] \LARGE Automata and \\[-2mm] \LARGE Formal Languages (1)\\[-3mm] \end{tabular}} \begin{center} \includegraphics[scale=0.3]{pics/ante1.jpg}\hspace{5mm} \includegraphics[scale=0.31]{pics/ante2.jpg}\\ \footnotesize\textcolor{gray}{Antikythera automaton, 100 BC (Archimedes?)} \end{center}\normalsize \begin{center} \begin{tabular}{ll} Email: & christian.urban at kcl.ac.uk\\ Office: & S1.27 (1st floor Strand Building)\\ Slides: & KEATS \end{tabular} \end{center}\end{frame}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\begin{frame}[c]\frametitle{The Goal of this Course}\begin{center} \begin{tikzpicture}[scale=1, node/.style={ rectangle,rounded corners=3mm, very thick,draw=black!50,minimum height=18mm, minimum width=20mm, top color=white,bottom color=black!20}] \node at (3.05, 1.8) {\Large\bf A Compiler}; \node (0) at (-2.3,0) {}; \node (A) at (0,0) [node] {}; \node [below right] at (A.north west) {lexer}; \node (B) at (3,0) [node] {}; \node [below right=1mm] at (B.north west) {\mbox{}\hspace{-1mm}parser}; \node (C) at (6,0) [node] {}; \node [below right] at (C.north west) {\mbox{}\hspace{-1mm}code gen}; \node (1) at (8.4,0) {}; \draw [->,line width=4mm] (0) -- (A); \draw [->,line width=4mm] (A) -- (B); \draw [->,line width=4mm] (B) -- (C); \draw [->,line width=4mm] (C) -- (1); \end{tikzpicture} \end{center}\only<2,3>{\begin{textblock}{1}(1,2)\begin{bubble}[9.8cm]\normalsizelexer input: a string\smallskip\\\hspace{5mm}\code{"read(n);"}\medskip\\lexer output: a sequence of tokens\smallskip\\\hspace{5mm}\code{key(read); lpar; id(n); rpar; semi}\end{bubble}\end{textblock}}\only<3>{\begin{textblock}{1}(6,7.8)\begin{tabular}{c}\includegraphics[scale=0.2]{../pics/rosetta.jpg}\\[-2mm]\footnotesize lexing $\Rightarrow$ recognising words (Stone of Rosetta)\end{tabular}\end{textblock}}\only<4>{\begin{textblock}{1}(1,1.5)\begin{bubble}[8.5cm]\normalsizeparser input: a sequence of token\smallskip\\parser output: an abstract syntax tree\smallskip\\\footnotesize\hspace{2cm}\begin{tikzpicture} \node {\code{read}} child {node {\code{lpar}}} child {node {\code{n}}} child {node {\code{rpar}}};\end{tikzpicture}\end{bubble}\end{textblock}}\only<5,6>{\begin{textblock}{1}(1,1.5)\begin{bubble}[4cm]\normalsizecode generator:\smallskip\\\hspace{5mm}\code{istore 2}\\ \hspace{5mm}\code{iload 2}\\ \hspace{5mm}\code{ldc 10}\\\hspace{5mm}\code{isub}\\\hspace{5mm}\code{ifeq Label2}\\ \hspace{5mm}\code{iload 2}\\\hspace{5mm}\code{...}\\\end{bubble}\end{textblock}}\only<6>{\begin{textblock}{6}(8.4,7)\begin{bubble}[5cm]\mbox{\begin{tikzpicture}[scale=0.58,rounded corners=0mm]\begin{axis}[axis x line=bottom, axis y line=left, ylabel=secs, xlabel=n, enlargelimits=0.05, ybar interval=0.7, legend style=small]\addplot file {interpreted2.data};\addplot file {compiled2.data};%\legend{interpreted, compiled}\end{axis}\end{tikzpicture}}\end{bubble}\end{textblock}}\end{frame}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\begin{frame}[c]\frametitle{The subject is quite old}\begin{itemize}\item Turing Machines, 1936\item Regular Expressions, 1956\\\item The first compiler for COBOL, 1957\\ (Grace Hopper)\item But surprisingly research papers are still published nowadays\end{itemize}\begin{flushright}\includegraphics[scale=0.3]{pics/hopper.jpg}\\\footnotesize\textcolor{gray}{Grace Hopper}\end{flushright}\mbox{}\\[-10mm]{\footnotesize\textcolor{gray}{(she made it to David Letterman's Tonight Show, \url{http://www.youtube.com/watch?v=aZOxtURhfEU})}}\end{frame}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\begin{frame}[c]\frametitle{Why Bother?}\begin{columns}[b]\begin{column}{.5\textwidth}Ruby, Python\\ and Others\bigskip\\\begin{tikzpicture}[y=.08cm, x=.10cm] %axis \draw (0,0) -- coordinate (x axis mid) (30,0); \draw (0,0) -- coordinate (y axis mid) (0,30); %ticks \foreach \x in {0,5,...,30} \draw (\x,1pt) -- (\x,-3pt) node[anchor=north] {\footnotesize\x}; \foreach \y in {0,5,...,30} \draw (1pt,\y) -- (-3pt,\y) node[anchor=east] {\footnotesize\y}; %labels \node[below=0.6cm] at (x axis mid) {\footnotesize number of \texttt{a}s}; \node[rotate=90,left=1cm] at (y axis mid) {\footnotesize time in secs}; %plots \draw[color=blue] plot[mark=*] file {re-python.data}; \draw[color=brown] plot[mark=triangle*] file {re-ruby.data}; %legend \begin{scope}[shift={(4,20)}] \draw[color=blue] (0,0) -- plot[mark=*] (0.25,0) -- (0.5,0) node[right]{\small Python}; \draw[yshift=-\baselineskip, color=brown] (0,0) -- plot[mark=triangle*] (0.25,0) -- (0.5,0) node[right]{\small Ruby}; \end{scope} \end{tikzpicture}\end{column}\begin{column}{.5\textwidth}Us (after this course)\\\mbox{}\bigskip\\\begin{tikzpicture}[y=.08cm, x=.0003cm] %axis \draw (0,0) -- coordinate (x axis mid) (12000,0); \draw (0,0) -- coordinate (y axis mid) (0,30); %ticks \foreach \x in {0,4000,...,12000} \draw (\x,1pt) -- (\x,-3pt) node[anchor=north] {\footnotesize\x}; \foreach \y in {0,5,...,30} \draw (1pt,\y) -- (-3pt,\y) node[anchor=east] {\footnotesize\y}; %labels \node[below=0.6cm] at (x axis mid) {\footnotesize number of \texttt{a}s}; \node[rotate=90, left=1cm] at (y axis mid) {\footnotesize time in secs}; %plots \draw[color=green] plot[mark=square*, mark options={fill=white} ] file {re2b.data}; \draw[color=black] plot[mark=square*, mark options={fill=white} ] file {re3.data}; \end{tikzpicture}\end{column}\end{columns}\bigskip\medskip\hspace{2cm}matching \texttt{[a?]\{n\}[a]\{n\}} against $\underbrace{\texttt{a}...\texttt{a}}_n$\end{frame}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\begin{frame}[c]\frametitle{Lectures 1 - 6}transforming strings into structured data\\[10mm]\alert<2>{\LARGE\bf Lexing} \onslide<2>{\hfill{}baseed on regular expressions}\medskip\\\hspace{5mm}(recognising ``words'')\\[6mm]{\LARGE\bf Parsing}\medskip\\\hspace{5mm}(recognising ``sentences'')\begin{textblock}{1}(10,9.1)\begin{tabular}{c}\includegraphics[scale=0.1]{../pics/rosetta.jpg}\\[-2mm]\footnotesize Stone of Rosetta\end{tabular}\end{textblock}\end{frame}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\begin{frame}[t]\frametitle{Familiar Regular Expr.}\small\begin{center}\texttt{[a-z0-9\_.-]+ @ [a-z0-9.-]+ . [a-z.]\{2,6\}}\end{center}\smallskip\begin{center}\begin{tabular}{@{}lp{8.5cm}@{}}\pcode{re*} & matches 0 or more times\\\pcode{re+} & matches 1 or more times\\\pcode{re?} & matches 0 or 1 times\\\pcode{re\{n\}} & matches exactly \pcode{n} number of times\\\pcode{re\{n,m\}} & matches at least \pcode{n} and at most {\tt m} times\\\pcode{[...]} & matches any single character inside the brackets\\\pcode{[^...]} & matches any single character not inside the brackets\\\pcode{a-zA-Z} & character ranges\\\pcode{\\d} & matches digits; equivalent to \pcode{[0-9]}\\\pcode{.} & matches every character except newline\\\pcode{(re)} & groups regular expressions and remembers the matched text\end{tabular}\end{center}\end{frame}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\begin{frame}[c]\frametitle{Today}\begin{itemize}\item the ultimate goal is to implement a small compiler (a really small one for the JVM)\bigskip\end{itemize}Let's start with:\begin{itemize}\item a web-crawler\item an email harvester\item a web-scraper\end{itemize}\end{frame}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\begin{frame}[t]\frametitle{A Web-Crawler}\mbox{}\\[10mm]\begin{enumerate}\item given an URL, read the corresponding webpage\item extract all links from it\item call the web-crawler again for all these links\end{enumerate}\end{frame}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\mode<presentation>{\begin{frame}[t]\frametitle{A Web-Crawler}\mbox{}\\[10mm]\begin{enumerate}\item given an URL, read the corresponding webpage\item if not possible print, out a problem\item if possible, extract all links from it\item call the web-crawler again for all these links\end{enumerate}\bigskip\pause\small (we need a bound for the number of recursive calls)\small (the purpose is to check all links on my own webpage)\end{frame}}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\begin{frame}[c]\begin{textblock}{1}(2,5)\begin{tabular}{c}\includegraphics[scale=0.15]{pics/servers.png}\\[-2mm]\small Server\end{tabular}\end{textblock}\begin{textblock}{1}(5.6,4) \begin{tikzpicture}[scale=1.1] \draw[white] (0,1) node (X) {}; \draw[white] (2,1) node (Y) {}; \draw[white] (0,0) node (X1) {}; \draw[white] (2,0) node (Y1) {}; \draw[white] (0,-1) node (X2) {}; \draw[white] (2,-1) node (Y2) {}; \draw[red, <-, line width = 2mm] (X) -- (Y); \node [inner sep=5pt,label=above:\textcolor{black}{GET request}] at ($ (X)!.5!(Y) $) {}; \draw[red, ->, line width = 2mm] (X1) -- (Y1); \node [inner sep=5pt,label=above:\textcolor{black}{webpage}] at ($ (X1)!.5!(Y1) $) {}; \draw[red, <-, line width = 2mm] (X2) -- (Y2); \node [inner sep=7pt,label=above:\textcolor{black}{POST data}] at ($ (X2)!.5!(Y2) $) {}; \end{tikzpicture}\end{textblock}\begin{textblock}{1}(9,5.5)\begin{tabular}{c}\includegraphics[scale=0.15]{pics/laptop.png}\\[-2mm]\small Browser\end{tabular}\end{textblock}\end{frame}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\begin{frame}[c]\frametitle{Scala}\small A simple Scala function for reading webpages:\smallskip\footnotesize\lstinputlisting{../progs/app0.scala}\medskip\pause\lstinline{get_page("""http://www.inf.kcl.ac.uk/staff/urbanc/""")}\bigskip\medskip\pause\small A slightly more complicated version for handling errors properly:\smallskip\footnotesize\lstinputlisting{../progs/app1.scala}\end{frame}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\begin{frame}[c]\frametitle{Why Scala?}\begin{textblock}{6}(1,3)\begin{tabular}{l}\mbox{}\hspace{-1mm}\includegraphics[scale=0.36]{pics/twitter.png}\\[-1mm]\includegraphics[scale=0.30]{pics/linked.png}\\\includegraphics[scale=0.30]{pics/guardian.jpg}\\[-3mm]\mbox{}\hspace{-2mm}\includegraphics[scale=0.38]{pics/morgan.png}\\[-3mm]\includegraphics[scale=0.30]{pics/suisse.png}\\\includegraphics[scale=0.20]{pics/edf.png}\\[-1mm]\includegraphics[scale=0.08]{pics/novell.png}\\[-1mm]\includegraphics[scale=0.30]{pics/foursquare.png}\\\includegraphics[scale=0.30]{pics/hsbc.png}\\{\large\bf ...}\end{tabular}\end{textblock}\only<2->{ \begin{textblock}{6}(6,3)\includegraphics[scale=0.35]{pics/jobgraph.png}\\\end{textblock}} \only<3->{ \begin{textblock}{6}(7.3,9.2)\begin{tabular}{l}\footnotesize 2013: 1$\%$\\[-2mm]\footnotesize 2014: 3$\%$\\[-2mm]\footnotesize 2015: 9$\%$\\[-2mm]\footnotesize 2016: 27$\%$\\[-2mm]\footnotesize 2017: 81$\%$\\[-2mm]\footnotesize 2018: 243$\%$ \raisebox{-1mm}{\includegraphics[scale=0.02]{pics/smiley.jpg}}\end{tabular}\end{textblock}} \only<3->{ \begin{textblock}{6}(6,9.5)\footnotesize 5 yrs $\begin{cases}\mbox{}\\[1.4cm]\end{cases}$\end{textblock}}\only<4->{ \begin{textblock}{11}(5,14.1)\textcolor{gray}{\footnotesize {\bf in London today:} 1 Scala job for every 30 Java jobs;\\[-2mm]Scala programmers seem to get up to 20\% better salary}\end{textblock}}\only<5->{\begin{textblock}{1}(3,6)\begin{bubble}[8.5cm]\normalsizeScala is a functional and object-oriented programminglanguage; compiles to the JVM; does not need null-pointerexceptions; a course on Coursera\\\mbox{}\hfill\url{http://www.scala-lang.org}\end{bubble}\end{textblock}}\end{frame}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\begin{frame}[t]\frametitle{A Regular Expression}\begin{itemize}\item \ldots{} is a pattern or template for specifying strings\end{itemize}\bigskip\begin{center} \only<1>{\scode{"https?://[^"]*"}}%\only<2>{\scode{""""https?://[^"]*"""".r}}\end{center}\bigskip\bigskipmatches for example\smallskip\\ \hspace{2mm}\code{"http://www.foobar.com"}\\\hspace{2mm}\code{"https://www.tls.org"}\\\end{frame}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\begin{frame}[t]\frametitle{Finding Operations}{\bf\code{rexp.findAllIn(string)}}\medskipreturns a list of all (sub)strings that match the regular expression\bigskip\bigskip {\bf\code{rexp.findFirstIn(string)}}\medskipreturns either \begin{itemize}\item \code{None} if no (sub)string matches or \item \code{Some(s)} with the first (sub)string\end{itemize}\end{frame}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\begin{frame}[c]\footnotesize\lstinputlisting{../progs/app2.scala}\end{frame}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\begin{frame}[c]\smallA version that only crawls links in ``my'' domain:\footnotesize\lstinputlisting{../progs/app3.scala}\end{frame}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\begin{frame}[c]\lstset{xleftmargin=-4mm}\smallA little email harvester:\footnotesize\lstinputlisting{../progs/app4.scala}\bigskip\tiny\url{http://net.tutsplus.com/tutorials/other/8-regular-expressions-you-should-know/}\end{frame}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\begin{frame}[t]\frametitle{\begin{tabular}{c}Regular Expressions\end{tabular}}Their inductive definition:\medskip\begin{textblock}{6}(2,5) \begin{tabular}{rrl@ {\hspace{13mm}}l} \bl{$r$} & \bl{$::=$} & \bl{$\varnothing$} & null\\ & \bl{$\mid$} & \bl{$\epsilon$} & empty string / \pcode{""} / \pcode{[]}\\ & \bl{$\mid$} & \bl{$c$} & character\\ & \bl{$\mid$} & \bl{$r_1 \cdot r_2$} & sequence\\ & \bl{$\mid$} & \bl{$r_1 + r_2$} & alternative / choice\\ & \bl{$\mid$} & \bl{$r^*$} & star (zero or more)\\ \end{tabular} \end{textblock}\end{frame}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\begin{frame}[t]\frametitle{Regular Expressions}\smallIn Scala:\bigskip\footnotesize\lstinputlisting{../progs/app51.scala}\end{frame}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\begin{frame}[t]\frametitle{Strings}\ldots are lists of characters. For example \code{"hello"}\begin{center}\bl{$[h, e, l, l, o]$}\end{center}the empty string: $[]$ or \pcode{""}\bigskip\\the concatenation of two strings:\begin{center}\bl{$s_1 \,@\, s_2$}\end{center}\textit{foo $@$ bar = foobar}, \textit{baz $@\, []$ = baz}\end{frame}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\mode<presentation>{\begin{frame}[c]\frametitle{\begin{tabular}{c}The Meaning of a\\[-2mm] Regular Expression\end{tabular}}\begin{textblock}{15}(1,4) \begin{tabular}{rcl} \bl{$L(\varnothing)$} & \bl{$\dn$} & \bl{$\varnothing$}\\ \bl{$L(\epsilon)$} & \bl{$\dn$} & \bl{$\{[]\}$}\\ \bl{$L(c)$} & \bl{$\dn$} & \bl{$\{[c]\}$}\\ \bl{$L(r_1 + r_2)$} & \bl{$\dn$} & \bl{$L(r_1) \cup L(r_2)$}\\ \bl{$L(r_1 \cdot r_2)$} & \bl{$\dn$} & \bl{$\{ s_1 \,@\, s_2 \;|\; s_1 \in L(r_1) \wedge s_2 \in L(r_2) \}$}\\ \bl{$L(r^*)$} & \bl{$\dn$} & \onslide<4->{\bl{$\bigcup_{n \ge 0} L(r)^n$}}\\ \end{tabular}\bigskip\onslide<2->{\hspace{5mm}\bl{$L(r)^0 \;\dn\; \{[]\}$}\\\bl{$L(r)^{n+1} \;\dn\; L(r) \,@\, L(r)^n$}\hspace{9mm}\onslide<3->{\small\textcolor{gray}{(append on sets)}\\\small\hspace{5cm}\textcolor{gray}{$\{ s_1 @ s_2 \;|\; s_1\in L(r) \wedge s_2 \in L(r)^n \}$}}} \end{textblock}\end{frame}}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\begin{frame}[c]\frametitle{The Meaning of Matching}\begin{bubble}[10cm]\largeA regular expression \bl{$r$} matches a string \bl{$s$} provided\begin{center}\bl{$s \in L(r)$}\\ \end{center}\end{bubble}\end{frame}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\begin{frame}[c]\frametitle{Written Exam}\begin{itemize}\item Accounts for 75\%.\bigskip\item You will understand the question ``Is this relevant for the exam?'' is very demotivating for the lecturer!\bigskip\\\item Deal: Whatever is in the homework (and is not marked ``optional'') is relevant for the exam.\end{itemize}\end{frame}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\begin{frame}[t]\frametitle{Coursework}\begin{itemize}\item Accounts for 25\%. Two strands. Choose \alert{\bf one}!\bigskip\end{itemize}\begin{columns}[t]\begin{column}{.5\textwidth}\underline{\bf Strand 1}\medskip\begin{itemize}\item four programming subtasks:\begin{itemize}\item matcher (5\%, 13.10.) \item lexer (5\%, 03.11.)\item parser (5\%, 27.11.)\item compiler (10\%, 12.12.)\end{itemize}\end{itemize}\end{column}\hspace{-45pt}\vrule{}\hspace{10pt}\begin{column}{.5\textwidth}\underline{\bf Strand 2}\smallskip\begin{itemize}\item one task: prove the correctness of a regular expression matcher in the Isabelle theorem prover\item 25\%, submission 12.12.\end{itemize}\end{column}\end{columns}\medskip\small\begin{itemize}\item Solving more than one strand will {\bf not} give you more marks.\\[-2mm]\item The exam will contain in much, much smaller form elements from both (but will also be in lectures and HW).\end{itemize}\end{frame}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\begin{frame}[c]\frametitle{\begin{tabular}{c}\\[3cm]\alert{Questions?}\end{tabular}}\mbox{}\end{frame}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \end{document}%%% Local Variables: %%% mode: latex%%% TeX-master: t%%% End: