| 876 |      1 | % !TEX program = xelatex
 | 
| 913 |      2 | \documentclass[dvipsnames,14pt,t,xelatex,xcolor={table}]{beamer}
 | 
| 876 |      3 | \usepackage{../slides}
 | 
|  |      4 | \usepackage{../graphicss}
 | 
|  |      5 | \usepackage{../langs}
 | 
|  |      6 | \usepackage{../data}
 | 
|  |      7 | \usetikzlibrary{cd}
 | 
|  |      8 | 
 | 
|  |      9 | 
 | 
|  |     10 | \usepackage{tcolorbox}
 | 
|  |     11 | \newtcolorbox{mybox}{colback=red!5!white,colframe=red!75!black}
 | 
|  |     12 | \newtcolorbox{mybox2}[1]{colback=red!5!white,colframe=red!75!black,fonttitle=\bfseries,title=#1}
 | 
|  |     13 | \newtcolorbox{mybox3}[1]{colback=Cyan!5!white,colframe=Cyan!75!black,fonttitle=\bfseries,title=#1}
 | 
|  |     14 | 
 | 
|  |     15 | 
 | 
|  |     16 | 
 | 
|  |     17 | \hfuzz=220pt 
 | 
|  |     18 | 
 | 
|  |     19 | \lstset{language=Scala,
 | 
|  |     20 |         style=mystyle,
 | 
|  |     21 |         numbersep=0pt,
 | 
|  |     22 |         numbers=none,
 | 
|  |     23 |         xleftmargin=0mm}
 | 
|  |     24 | 
 | 
| 913 |     25 | \pgfplotsset{compat=1.17}      
 | 
|  |     26 | 
 | 
| 876 |     27 | \newcommand{\bl}[1]{\textcolor{blue}{#1}}     
 | 
|  |     28 |  
 | 
|  |     29 | % beamer stuff 
 | 
| 913 |     30 | \renewcommand{\slidecaption}{SSY, King's College London}
 | 
| 876 |     31 | 
 | 
|  |     32 | 
 | 
|  |     33 | 
 | 
| 913 |     34 | \begin{document}
 | 
| 876 |     35 | 
 | 
|  |     36 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
|  |     37 | \begin{frame}[t]
 | 
|  |     38 | \frametitle{%  
 | 
|  |     39 |   \begin{tabular}{@ {}c@ {}}
 | 
| 913 |     40 |     \\[8mm]
 | 
|  |     41 |     \LARGE Derivative-Based\\
 | 
|  |     42 |     \LARGE Regular Expression Matching\\[5mm]
 | 
|  |     43 |     \normalsize\textcolor{gray}{Christian Urban, SSY Group}
 | 
| 876 |     44 |   \end{tabular}}
 | 
|  |     45 | 
 | 
|  |     46 | \end{frame}
 | 
|  |     47 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
|  |     48 | 
 | 
| 913 |     49 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%      
 | 
|  |     50 | \begin{frame}[c]
 | 
|  |     51 | \frametitle{A Bit of Background}
 | 
| 876 |     52 | 
 | 
| 913 |     53 | \begin{textblock}{10}(2,2.5)
 | 
|  |     54 | \includegraphics[scale=0.4]{../pics/phd-1.jpg}
 | 
|  |     55 | \end{textblock}
 | 
| 876 |     56 | 
 | 
| 913 |     57 | \begin{textblock}{11}(1.7,10)
 | 
|  |     58 | \begin{bubble}[9.6cm]
 | 
|  |     59 |   PhD thesis on a particular term-rewriting system:\medskip\\
 | 
|  |     60 |   Proved that all rewriting sequences are strongly normalising (terminate). 
 | 
| 876 |     61 | \end{bubble}
 | 
| 913 |     62 | \end{textblock}
 | 
| 876 |     63 | 
 | 
| 913 |     64 | \only<2->{%
 | 
|  |     65 | \begin{textblock}{3}(10,2.5)
 | 
|  |     66 | \begin{bubble}[3cm]
 | 
|  |     67 | \begin{tabular}{rcl}
 | 
|  |     68 |   \bl{$t$} & \bl{::=} & \bl{$x$}\\
 | 
|  |     69 |          & \bl{|} & \bl{$\lambda x.\,t$}\\
 | 
|  |     70 |          & \bl{|} & \bl{$t_1\;t_2$}\\
 | 
|  |     71 |          & \bl{|} & \bl{...}
 | 
|  |     72 | \end{tabular}  
 | 
|  |     73 | \end{bubble}  
 | 
| 876 |     74 | \end{textblock}}
 | 
|  |     75 | 
 | 
|  |     76 | \end{frame}
 | 
| 879 |     77 | 
 | 
|  |     78 | 
 | 
|  |     79 | 
 | 
| 876 |     80 | 
 | 
| 913 |     81 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 | 
|  |     82 | 
 | 
|  |     83 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%      
 | 
|  |     84 | \begin{frame}[t]
 | 
|  |     85 | \frametitle{Quiz 1}
 | 
|  |     86 | \begin{bubble}[10cm]\it
 | 
|  |     87 |   There are many, many regular expression libraries.\bigskip\\
 | 
| 876 |     88 |   
 | 
| 913 |     89 |   \textbf{Given a regular expression \bl{r} and a string \bl{s}, what is the
 | 
|  |     90 |   difficulty / complexity of the problem deciding whether \bl{r} matches \bl{s}?}
 | 
|  |     91 | \end{bubble}
 | 
|  |     92 | 
 | 
|  |     93 | \begin{textblock}{12}(2,9)
 | 
|  |     94 | \begin{tikzpicture}
 | 
|  |     95 |   \draw(0,0)  node[rotate=20]{linear};
 | 
|  |     96 |   \draw(3,0)  node[rotate=-20]{\bl{$O(n \log n)$}};
 | 
|  |     97 |   \draw(3,-2) node[rotate=10]{quadratic};
 | 
|  |     98 |   \draw(6,0) node[rotate=20]{P};
 | 
|  |     99 |   \draw(7,0) node[rotate=-20]{NP};
 | 
|  |    100 |   \draw(7,-1) node[rotate=0]{\bl{$O(2^n)$}};
 | 
|  |    101 | \end{tikzpicture}
 | 
|  |    102 | \end{textblock}
 | 
|  |    103 | 
 | 
|  |    104 | \end{frame}
 | 
|  |    105 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 | 
|  |    106 | 
 | 
|  |    107 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%      
 | 
|  |    108 | \begin{frame}[t]
 | 
|  |    109 | \frametitle{Quiz 2}
 | 
|  |    110 | 
 | 
|  |    111 | \begin{textblock}{12}(2,2.5)
 | 
|  |    112 | A regular expression for (some) email addresses:
 | 
|  |    113 | \begin{center}
 | 
|  |    114 |   ($\underbrace{\bl{[a\mbox{-}z0\mbox{-}9\_\!\!\_\,.-]^+}}_{\textrm{name}}$)\bl{$\,@\,$}
 | 
|  |    115 |   ($\underbrace{\bl{[a\mbox{-}z0\mbox{-}9\,-]^+}}_{\textrm{domain}}$) \bl{$\,.\,$}
 | 
|  |    116 |   ($\underbrace{\bl{[a\mbox{-}z\,.]^{\{2..5\}}}}_{\textrm{top-level domain}}$)
 | 
|  |    117 | \end{center}  
 | 
|  |    118 | \end{textblock}
 | 
|  |    119 | 
 | 
|  |    120 | \only<2>{
 | 
|  |    121 | \begin{textblock}{10}(4,8)
 | 
|  |    122 | bounded regular expressions:\medskip\\
 | 
|  |    123 | \begin{tabular}{ll}    
 | 
|  |    124 |   \bl{$r^{\{n\}}$}     & exactly n-times \bl{$r$}\\
 | 
|  |    125 |   \bl{$r^{\{n..m\}}$}  & between n and m-times\\
 | 
|  |    126 |   \bl{$r^{\{n..\}}$}   & from n-times\\
 | 
|  |    127 |   \bl{$r^{\{..m\}}$}   & upto m-times\\
 | 
|  |    128 | \end{tabular}\smallskip\\
 | 
|  |    129 | \footnotesize\hfill ${}^*$ in some applications the counters can be in the millions
 | 
|  |    130 | \end{textblock}}
 | 
|  |    131 |  
 | 
|  |    132 | \end{frame}
 | 
|  |    133 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 | 
|  |    134 | 
 | 
|  |    135 | 
 | 
|  |    136 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%      
 | 
|  |    137 | \begin{frame}[t]
 | 
|  |    138 | \frametitle{Quiz 2}
 | 
|  |    139 | 
 | 
|  |    140 | 
 | 
|  |    141 | \begin{textblock}{12}(2,2.5)
 | 
|  |    142 |   \onslide<1->{Thompson construction: By recursion we are given two NFAs for $r_1$ and $r_2$.\medskip\\
 | 
|  |    143 |     \onslide<2->{For $r_1\cdot r_2$:}\bigskip}
 | 
|  |    144 | \end{textblock}
 | 
|  |    145 | 
 | 
|  |    146 | \begin{textblock}{12}(2,6)
 | 
|  |    147 | \onslide<1>{
 | 
|  |    148 | \begin{tikzpicture}[node distance=3mm,
 | 
|  |    149 |     >=stealth',very thick,
 | 
|  |    150 |     every state/.style={minimum size=3pt,draw=blue!50,very thick,fill=blue!20}]
 | 
|  |    151 | \node[state, initial]  (Q_0)  {$\mbox{}$};
 | 
|  |    152 | \node[state, initial]  (Q_01) [below=1mm of Q_0] {$\mbox{}$};  
 | 
|  |    153 | \node[state, initial]  (Q_02) [above=1mm of Q_0] {$\mbox{}$};  
 | 
|  |    154 | \node (R_1)  [right=of Q_0] {$\ldots$};
 | 
|  |    155 | \node[state, accepting]  (T_1)  [right=of R_1] {$\mbox{}$};
 | 
|  |    156 | \node[state, accepting]  (T_2)  [above=of T_1] {$\mbox{}$};
 | 
|  |    157 | \node[state, accepting]  (T_3)  [below=of T_1] {$\mbox{}$};
 | 
|  |    158 | 
 | 
|  |    159 | \node (A_0)  [right=2.5cm of T_1] {$\mbox{}$};
 | 
|  |    160 | \node[state, initial]  (A_01)  [above=1mm of A_0] {$\mbox{}$};
 | 
|  |    161 | \node[state, initial]  (A_02)  [below=1mm of A_0] {$\mbox{}$};
 | 
|  |    162 | 
 | 
|  |    163 | \node (b_1)  [right=of A_0] {$\ldots$};
 | 
|  |    164 | \node[state, accepting]  (c_1)  [right=of b_1] {$\mbox{}$};
 | 
|  |    165 | \node[state, accepting]  (c_2)  [above=of c_1] {$\mbox{}$};
 | 
|  |    166 | \node[state, accepting]  (c_3)  [below=of c_1] {$\mbox{}$};
 | 
|  |    167 | \begin{pgfonlayer}{background}
 | 
|  |    168 |   \node (1) [rounded corners, inner sep=1mm, thick,
 | 
|  |    169 |     draw=black!60, fill=black!20, fit= (Q_0) (R_1) (T_1) (T_2) (T_3)] {};
 | 
|  |    170 |   \node (2) [rounded corners, inner sep=1mm, thick,
 | 
|  |    171 |     draw=black!60, fill=black!20, fit= (A_0) (b_1) (c_1) (c_2) (c_3)] {};
 | 
|  |    172 | \node [yshift=2mm] at (1.north) {$r_1$};
 | 
|  |    173 | \node [yshift=2mm] at (2.north) {$r_2$};
 | 
|  |    174 | \end{pgfonlayer}
 | 
|  |    175 | \end{tikzpicture}}
 | 
|  |    176 | \end{textblock}
 | 
|  |    177 | 
 | 
|  |    178 | \begin{textblock}{12}(2,6)
 | 
|  |    179 | \onslide<2>{
 | 
|  |    180 | \begin{tikzpicture}[node distance=3mm,
 | 
|  |    181 |     >=stealth',very thick,
 | 
|  |    182 |     every state/.style={minimum size=3pt,draw=blue!50,very thick,fill=blue!20},]
 | 
|  |    183 | \node[state, initial]  (Q_0)  {$\mbox{}$};
 | 
|  |    184 | \node[state, initial]  (Q_01) [below=1mm of Q_0] {$\mbox{}$};  
 | 
|  |    185 | \node[state, initial]  (Q_02) [above=1mm of Q_0] {$\mbox{}$};  
 | 
|  |    186 | \node (r_1)  [right=of Q_0] {$\ldots$};
 | 
|  |    187 | \node[state]  (t_1)  [right=of r_1] {$\mbox{}$};
 | 
|  |    188 | \node[state]  (t_2)  [above=of t_1] {$\mbox{}$};
 | 
|  |    189 | \node[state]  (t_3)  [below=of t_1] {$\mbox{}$};
 | 
|  |    190 | 
 | 
|  |    191 | \node  (A_0)  [right=2.5cm of t_1] {$\mbox{}$};
 | 
|  |    192 | \node[state]  (A_01)  [above=1mm of A_0] {$\mbox{}$};
 | 
|  |    193 | \node[state]  (A_02)  [below=1mm of A_0] {$\mbox{}$};
 | 
|  |    194 | 
 | 
|  |    195 | \node (b_1)  [right=of A_0] {$\ldots$};
 | 
|  |    196 | \node[state, accepting]  (c_1)  [right=of b_1] {$\mbox{}$};
 | 
|  |    197 | \node[state, accepting]  (c_2)  [above=of c_1] {$\mbox{}$};
 | 
|  |    198 | \node[state, accepting]  (c_3)  [below=of c_1] {$\mbox{}$};
 | 
|  |    199 | \path[->] (t_1) edge (A_01);
 | 
|  |    200 | \path[->] (t_2) edge node [above]  {$\varepsilon$\footnotesize{}s} (A_01);
 | 
|  |    201 | \path[->] (t_3) edge (A_01);
 | 
|  |    202 | \path[->] (t_1) edge (A_02);
 | 
|  |    203 | \path[->] (t_2) edge (A_02);
 | 
|  |    204 | \path[->] (t_3) edge node [below]  {$\varepsilon$\footnotesize{}s} (A_02);
 | 
|  |    205 |  
 | 
|  |    206 | \begin{pgfonlayer}{background}
 | 
|  |    207 |   \node (3) [rounded corners, inner sep=1mm, thick,
 | 
|  |    208 |     draw=black!60, fill=black!20, fit= (Q_0) (c_1) (c_2) (c_3)] {};
 | 
|  |    209 | \node [yshift=2mm] at (3.north) {$r_1\cdot r_2$};
 | 
|  |    210 | \end{pgfonlayer}
 | 
|  |    211 | \end{tikzpicture}}
 | 
|  |    212 | \end{textblock}
 | 
|  |    213 | 
 | 
|  |    214 | 
 | 
|  |    215 | \end{frame}
 | 
|  |    216 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
 | 
|  |    217 | 
 | 
|  |    218 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%      
 | 
|  |    219 | \begin{frame}[t]
 | 
|  |    220 | \frametitle{Quiz 2}
 | 
|  |    221 | 
 | 
|  |    222 | \begin{textblock}{12}(2,2.5)
 | 
|  |    223 |   \onslide<1->{Thompson construction: By recursion we have a NFA for $r$.\medskip\\
 | 
|  |    224 |   \onslide<2->{For $r^*$:\bigskip}}
 | 
|  |    225 | \end{textblock}
 | 
|  |    226 | 
 | 
|  |    227 | \begin{textblock}{12}(4,6)
 | 
|  |    228 | \onslide<1>{  
 | 
|  |    229 | \begin{tikzpicture}[node distance=3mm,
 | 
|  |    230 |     >=stealth',very thick,
 | 
|  |    231 |     every state/.style={minimum size=3pt,draw=blue!50,very thick,fill=blue!20},
 | 
|  |    232 |     baseline=(current bounding box.north)]
 | 
|  |    233 | \node (2)  {$\mbox{}$};
 | 
|  |    234 | \node[state, initial]  (4)  [above=1mm of 2] {$\mbox{}$};
 | 
|  |    235 | \node[state, initial]  (5)  [below=1mm of 2] {$\mbox{}$};  
 | 
|  |    236 | \node (a)  [right=of 2] {$\ldots$};
 | 
|  |    237 | \node[state, accepting]  (a1)  [right=of a] {$\mbox{}$};
 | 
|  |    238 | \node[state, accepting]  (a2)  [above=of a1] {$\mbox{}$};
 | 
|  |    239 | \node[state, accepting]  (a3)  [below=of a1] {$\mbox{}$};
 | 
|  |    240 | \begin{pgfonlayer}{background}
 | 
|  |    241 | \node (1) [rounded corners, inner sep=1mm, thick, draw=black!60, fill=black!20, fit= (2) (a1) (a2) (a3)] {};
 | 
|  |    242 | \node [yshift=3mm] at (1.north) {$r$};
 | 
|  |    243 | \end{pgfonlayer}
 | 
|  |    244 | \end{tikzpicture}}
 | 
|  |    245 | \end{textblock}
 | 
| 876 |    246 | 
 | 
| 913 |    247 | \begin{textblock}{12}(2,6)
 | 
|  |    248 | \onslide<2->{  
 | 
|  |    249 | \begin{tikzpicture}[node distance=3mm,
 | 
|  |    250 |     >=stealth',very thick,
 | 
|  |    251 |     every state/.style={minimum size=3pt,draw=blue!50,very thick,fill=blue!20},
 | 
|  |    252 |     baseline=(current bounding box.north)]
 | 
|  |    253 | \node at (0,0) [state, initial,accepting]  (1)  {$\mbox{}$};
 | 
|  |    254 | \node (2)  [right=16mm of 1] {$\mbox{}$};
 | 
|  |    255 | \node[state]  (4)  [above=1mm of 2] {$\mbox{}$};
 | 
|  |    256 | \node[state]  (5)  [below=1mm of 2] {$\mbox{}$};  
 | 
|  |    257 | \node (a)  [right=of 2] {$\ldots$};
 | 
|  |    258 | \node[state]  (a1)  [right=of a] {$\mbox{}$};
 | 
|  |    259 | \node[state]  (a2)  [above=of a1] {$\mbox{}$};
 | 
|  |    260 | \node[state]  (a3)  [below=of a1] {$\mbox{}$};
 | 
|  |    261 | \path[->] (1) edge node [below]  {$\varepsilon$} (4);
 | 
|  |    262 | \path[->] (1) edge node [below]  {$\varepsilon$} (5);
 | 
|  |    263 | \path[->] (a1) edge [bend left=45] node [below]  {$\varepsilon$} (1);
 | 
|  |    264 | \path[->] (a2) edge [bend right] node [below]  {$\varepsilon$} (1);
 | 
|  |    265 | \path[->] (a3) edge [bend left=45] node [below]  {$\varepsilon$} (1);
 | 
|  |    266 | \begin{pgfonlayer}{background}
 | 
|  |    267 | \node (2) [rounded corners, inner sep=1mm, thick, draw=black!60, fill=black!20, fit= (1) (a2) (a3)] {};
 | 
|  |    268 | \node [yshift=3mm] at (2.north) {$r^*$};
 | 
|  |    269 | \end{pgfonlayer}
 | 
|  |    270 | \end{tikzpicture}}
 | 
|  |    271 | \end{textblock}
 | 
|  |    272 | 
 | 
|  |    273 | \begin{textblock}{12}(2,12)
 | 
|  |    274 | \onslide<3->{ 
 | 
|  |    275 |   \begin{bubble}[9.5cm]\it
 | 
|  |    276 |   Quiz:\smallskip\\  
 | 
|  |    277 |   \textbf{What is the Thompson Construction for \bl{$r^{\{n\}}$} ?}
 | 
|  |    278 | \end{bubble}}
 | 
|  |    279 | \end{textblock}
 | 
|  |    280 | 
 | 
|  |    281 | \end{frame}
 | 
|  |    282 | 
 | 
|  |    283 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 | 
|  |    284 | 
 | 
|  |    285 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%      
 | 
|  |    286 | \begin{frame}[t]
 | 
|  |    287 |   \frametitle{Quiz 3}
 | 
|  |    288 | 
 | 
|  |    289 | Hierarchy of Languages:  
 | 
|  |    290 | 
 | 
|  |    291 | \begin{center}
 | 
|  |    292 | \begin{tikzpicture}
 | 
|  |    293 | [rect/.style={draw=black!50, 
 | 
|  |    294 |               top color=white,
 | 
|  |    295 |               bottom color=black!20, 
 | 
|  |    296 |               rectangle, 
 | 
|  |    297 |               very thick, 
 | 
|  |    298 |               rounded corners}, scale=1.2]
 | 
|  |    299 | 
 | 
|  |    300 | \draw (0,0) node [rect, text depth=39mm, text width=68mm] {all languages};
 | 
|  |    301 | \draw (0,-0.4) node [rect, text depth=28.5mm, text width=64mm] {decidable languages};
 | 
|  |    302 | \draw (0,-0.85) node [rect, text depth=17mm] {\;\;context sensitive languages\;\;};
 | 
|  |    303 | \draw (0,-1.14) node [rect, text depth=9mm, text width=50mm] {context-free languages};
 | 
|  |    304 | \draw (0,-1.4) node [rect] {regular languages};
 | 
|  |    305 | \end{tikzpicture}
 | 
|  |    306 | \end{center}  
 | 
|  |    307 | 
 | 
|  |    308 | \begin{textblock}{12}(2,11.5)
 | 
|  |    309 | \onslide<2->{ 
 | 
|  |    310 |   \begin{bubble}[9.5cm]\it
 | 
|  |    311 |     Quiz:\smallskip\\
 | 
|  |    312 |     
 | 
|  |    313 |     \textbf{Can we use standard parsing algorithms for matching / lexing\,?}
 | 
|  |    314 |     Say CYK, LL, LR(k), PEG, \ldots
 | 
|  |    315 | \end{bubble}}
 | 
|  |    316 | \end{textblock}
 | 
|  |    317 | 
 | 
|  |    318 | \end{frame}
 | 
|  |    319 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 | 
|  |    320 | 
 | 
|  |    321 | \defverbatim{\foo}{\footnotesize%
 | 
|  |    322 | \begin{verbatim}
 | 
|  |    323 | (?:(?:\"|'|\]|\}|\\|\d|(?:nan|infinity|true|false|
 | 
|  |    324 | null|undefined|symbol|math)|\`|\-|\+)+[)]*;?((?:\s
 | 
|  |    325 | | -|~|!|{}|\|\||\+)*.*(?:.*=.*)))  
 | 
|  |    326 | \end{verbatim}
 | 
|  |    327 | }
 | 
|  |    328 | 
 | 
|  |    329 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%      
 | 
|  |    330 | \begin{frame}[t,fragile]
 | 
|  |    331 | \frametitle{Quiz 4}
 | 
|  |    332 | 
 | 
|  |    333 | \begin{textblock}{12}(2,2.5)
 | 
|  |    334 | \begin{bubble}[9.5cm]\it
 | 
|  |    335 |   Quiz:\smallskip\\    
 | 
|  |    336 |   Do regular expressions have any security relevance\,?
 | 
|  |    337 | \end{bubble}
 | 
|  |    338 | \end{textblock}
 | 
|  |    339 | 
 | 
|  |    340 | \only<2->{
 | 
|  |    341 | \begin{textblock}{2}(1,6)
 | 
|  |    342 | \includegraphics[scale=0.8]{../pics/zeek.png}
 | 
|  |    343 | \includegraphics[scale=0.17]{../pics/snort.png}
 | 
|  |    344 | \end{textblock}}
 | 
|  |    345 | 
 | 
|  |    346 | \only<3->{
 | 
|  |    347 | \begin{textblock}{7}(7,5.6)
 | 
|  |    348 |   \includegraphics[scale=0.14]{../pics/cloudflare.png}\\
 | 
|  |    349 |     \footnotesize
 | 
|  |    350 |     It serves more web traffic than Twitter, Amazon, Apple,
 | 
|  |    351 |     Instagram, Bing \& Wikipedia combined.\medskip\\
 | 
|  |    352 |     Web Application Firewall filters out
 | 
|  |    353 |     SQL injection attacks, XSS attacks etc
 | 
|  |    354 | \end{textblock}}
 | 
|  |    355 | 
 | 
|  |    356 | \only<3->{
 | 
|  |    357 |   \begin{textblock}{13}(4,12.3)
 | 
|  |    358 |   \footnotesize
 | 
|  |    359 |   \hspace{1.5cm}a global outage on 2 July 2019 (first one for six years)
 | 
|  |    360 |   \color{blue}\foo\color{black}
 | 
|  |    361 |    \end{textblock}
 | 
|  |    362 | }
 | 
|  |    363 | 
 | 
|  |    364 |     
 | 
|  |    365 | \end{frame}
 | 
|  |    366 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
|  |    367 | 
 | 
|  |    368 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%      
 | 
|  |    369 | \begin{frame}[t]
 | 
|  |    370 |   \frametitle{Quiz 3}
 | 
|  |    371 | 
 | 
|  |    372 | \begin{textblock}{12}(2,2) 
 | 
|  |    373 |   \begin{bubble}[9.5cm]\it
 | 
|  |    374 |     Quiz:\smallskip\\
 | 
|  |    375 |     
 | 
|  |    376 |     \textbf{Can we use standard parsing algorithms for matching / lexing\,?}
 | 
|  |    377 |     Say CYK, LL, LR(k), PEG, \ldots
 | 
|  |    378 | \end{bubble}
 | 
|  |    379 | \end{textblock}
 | 
|  |    380 | 
 | 
|  |    381 | 
 | 
|  |    382 | \begin{textblock}{12}(1,7)
 | 
|  |    383 | \textbf{POSIX lexing}
 | 
|  |    384 | 
 | 
|  |    385 | \begin{tabular}{@ {}ll}
 | 
|  |    386 |   Assume you have: & \bl{$r_{key} \dn \texttt{if} + \texttt{then} + \texttt{while} \ldots$}\\
 | 
|  |    387 |                    & \bl{$r_{id\;} \,\dn \texttt{[a-z]} \cdot \texttt{[a-z0-9\_]}^*$}\medskip\\
 | 
|  |    388 | 
 | 
|  |    389 |   Lexing a string with  & \bl{$(r_{key} + r_{id})^*$}\medskip\\
 | 
|  |    390 | 
 | 
|  |    391 |   What should be & \\
 | 
|  |    392 |   the result for:  & \bl{\texttt{"iffoo"}} \;\;\; \bl{\texttt{"if"}}\\
 | 
|  |    393 | \end{tabular}  
 | 
|  |    394 | \end{textblock}
 | 
|  |    395 | 
 | 
|  |    396 | \only<2->{
 | 
|  |    397 | \begin{textblock}{13.5}(1.5,4) 
 | 
|  |    398 |   \begin{mybox3}{POSIX rules}
 | 
|  |    399 |     \begin{itemize}
 | 
|  |    400 |     \item \textbf{The Longest Match Rule:} The longest initial
 | 
|  |    401 |       substring matched by any regular expression is taken as next token.
 | 
|  |    402 |     \item \textbf{Priority Rule:}  For a particular longest initial
 | 
|  |    403 |       substring, the first (leftmost) regular expression that can match
 | 
|  |    404 |       determines the token.
 | 
|  |    405 |     \item \ldots  
 | 
|  |    406 |     \end{itemize}
 | 
|  |    407 |     \begin{center}
 | 
|  |    408 |     \bl{$(a + ab) \cdot (bc + c)$} \;\;and\;\; \bl{\texttt{"}$abc$\texttt{"}}
 | 
|  |    409 |     \end{center}  
 | 
|  |    410 |   \end{mybox3}
 | 
| 876 |    411 | \end{textblock}}
 | 
|  |    412 | 
 | 
|  |    413 | \end{frame}
 | 
|  |    414 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
|  |    415 | 
 | 
| 913 |    416 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%      
 | 
|  |    417 | \begin{frame}[t]
 | 
|  |    418 | \frametitle{Quiz 1}
 | 
|  |    419 | \begin{bubble}[10cm]\it
 | 
|  |    420 |   There are many, many regular expression libraries.\bigskip\\
 | 
|  |    421 |   
 | 
|  |    422 |   \textbf{Given a regular expression \bl{r} and a string \bl{s}, what is the
 | 
|  |    423 |   difficulty / complexity of the problem deciding whether \bl{r} matches \bl{s}?}
 | 
|  |    424 | \end{bubble}
 | 
|  |    425 | 
 | 
|  |    426 | \begin{textblock}{12}(1,9)
 | 
|  |    427 |   \begin{tabular}{p{4cm}|p{4cm}|p{2cm}}
 | 
|  |    428 |     atrociously slow (s't) & pretty lazy (s't) & \textcolor{gray}{OTBT}\medskip\\
 | 
|  |    429 |     Python, Ruby, Swift, Dart, JavaScript & Rust, Go, RE2 & \textcolor{gray}{Snort, .Net7}\\
 | 
|  |    430 |   \end{tabular}
 | 
|  |    431 | \end{textblock}
 | 
|  |    432 | 
 | 
|  |    433 | \end{frame}
 | 
|  |    434 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 | 
|  |    435 | 
 | 
|  |    436 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%      
 | 
|  |    437 | \begin{frame}[t]
 | 
|  |    438 | 
 | 
|  |    439 | \mbox{}\\[10mm]  
 | 
|  |    440 | 
 | 
|  |    441 | \begin{columns}[t,onlytextwidth]  
 | 
|  |    442 | \begin{column}{.2\textwidth}
 | 
|  |    443 | \raisebox{-10mm}{    
 | 
|  |    444 | \begin{tikzpicture}
 | 
|  |    445 |   \begin{axis}[
 | 
|  |    446 |     xlabel={\bl{$n$} \pcode{a}s},
 | 
|  |    447 |     %%x label style={at={(1.05,0.0)}},
 | 
|  |    448 |     ylabel={time in secs},
 | 
|  |    449 |     enlargelimits=false,
 | 
|  |    450 |     xtick={0,10,...,30},
 | 
|  |    451 |     xmax=35,
 | 
|  |    452 |     ymax=35,
 | 
|  |    453 |     ytick={0,5,...,30},
 | 
|  |    454 |     scaled ticks=false,
 | 
|  |    455 |     axis lines=left,
 | 
|  |    456 |     width=5cm,
 | 
|  |    457 |     height=5cm, 
 | 
|  |    458 |     legend entries={Python,JavaScript,Swift,Dart},
 | 
|  |    459 |     legend style={font=\small,at={(0.5,-0.39)},anchor=north},
 | 
|  |    460 |     legend cell align=left]
 | 
|  |    461 | \addplot[blue,mark=*, mark options={fill=white}] table {re-python2.data};
 | 
|  |    462 | \addplot[red,mark=*, mark options={fill=white}] table {re-js.data};
 | 
|  |    463 | \addplot[magenta,mark=*, mark options={fill=white}] table {re-swift.data};
 | 
|  |    464 | \addplot[brown,mark=*, mark options={fill=white}] table {re-dart.data};
 | 
|  |    465 | \end{axis}
 | 
|  |    466 | \end{tikzpicture}}
 | 
|  |    467 | \end{column}
 | 
|  |    468 | 
 | 
|  |    469 | \begin{column}{.2\textwidth}
 | 
|  |    470 | \begin{tikzpicture}
 | 
|  |    471 |   \begin{axis}[
 | 
|  |    472 |     xlabel={\bl{$n$} \pcode{a}s},
 | 
|  |    473 |     %ylabel={time in secs},
 | 
|  |    474 |     enlargelimits=false,
 | 
|  |    475 |     xtick={0,10,...,30},
 | 
|  |    476 |     xmax=35,
 | 
|  |    477 |     ymax=35,
 | 
|  |    478 |     ytick={0,5,...,30},
 | 
|  |    479 |     scaled ticks=false,
 | 
|  |    480 |     axis lines=left,
 | 
|  |    481 |     width=5cm,
 | 
|  |    482 |     height=5cm, 
 | 
|  |    483 |     legend entries={Python,Ruby},
 | 
|  |    484 |     legend style={font=\small,at={(0.5,-0.39)},anchor=north},
 | 
|  |    485 |     legend cell align=left]
 | 
|  |    486 | \addplot[blue,mark=*, mark options={fill=white}] table {re-python.data};
 | 
|  |    487 | \addplot[brown,mark=pentagon*, mark options={fill=white}] table {re-ruby.data};  
 | 
|  |    488 | \end{axis}
 | 
|  |    489 | \end{tikzpicture}  
 | 
|  |    490 | \end{column}  
 | 
|  |    491 | \end{columns}
 | 
|  |    492 | 
 | 
|  |    493 | \begin{textblock}{4}(9,1.7)
 | 
|  |    494 | \textbf{\bl{\texttt{(a?)\boldmath$^{\{n\}}\cdot$(a)\boldmath$^{\{n\}}$}}}
 | 
|  |    495 | \end{textblock}
 | 
|  |    496 | 
 | 
|  |    497 | \begin{textblock}{4}(4,1.7)  
 | 
|  |    498 | \textbf{\bl{\texttt{(a*)*$\cdot$b}}}
 | 
|  |    499 | \end{textblock}
 | 
|  |    500 | 
 | 
|  |    501 | \begin{textblock}{3.4}(0.3,10)
 | 
|  |    502 | \small{}\textbf{matching with strings}
 | 
|  |    503 | \textbf{\bl{$\underbrace{\texttt{a}...\texttt{a}}_n$}}  
 | 
|  |    504 | \end{textblock}
 | 
|  |    505 | 
 | 
|  |    506 | \end{frame}
 | 
|  |    507 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
|  |    508 | 
 | 
|  |    509 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%      
 | 
|  |    510 | \begin{frame}[t]
 | 
|  |    511 | \frametitle{Quiz 1}
 | 
|  |    512 | \begin{bubble}[10cm]\it
 | 
|  |    513 |   \textbf{Given a regular expression \bl{r} and a string \bl{s}, what is the
 | 
|  |    514 |   difficulty / complexity of the problem deciding whether \bl{r} matches \bl{s}?}
 | 
|  |    515 | \end{bubble}
 | 
|  |    516 | 
 | 
|  |    517 | \begin{textblock}{12}(1.7,7)
 | 
|  |    518 | For \textbf{Perl-style} regular expression matchers (say Python, JavaScript, etc), the
 | 
|  |    519 | answer is:
 | 
|  |    520 | \only<2->{\begin{center}
 | 
|  |    521 | \fontspec{Hoefler Text Black}\textcolor{ProcessBlue}{\huge{}NP}
 | 
|  |    522 | \end{center}}  
 | 
|  |    523 | \end{textblock}
 | 
|  |    524 | 
 | 
|  |    525 | \begin{textblock}{12}(1.7,12)
 | 
|  |    526 | \only<3->{Backreferences: \bl{(\ldots)$\,\ldots{}\backslash{}n$}}
 | 
|  |    527 | \end{textblock}  
 | 
|  |    528 | \end{frame}
 | 
|  |    529 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 | 
|  |    530 | 
 | 
|  |    531 | 
 | 
|  |    532 | 
 | 
|  |    533 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 | 
|  |    534 | \begin{frame}
 | 
|  |    535 | \frametitle{Quiz 2}
 | 
|  |    536 | 
 | 
|  |    537 | \begin{textblock}{12}(2,2)
 | 
|  |    538 | \onslide<1->{ 
 | 
|  |    539 |   \begin{bubble}[9.5cm]\it
 | 
|  |    540 |   Quiz:\smallskip\\  
 | 
|  |    541 |   \textbf{What is the Thompson Construction for \bl{$r^{\{n\}}$} ?}
 | 
|  |    542 | \end{bubble}}
 | 
|  |    543 | \end{textblock}
 | 
|  |    544 | 
 | 
|  |    545 | \only<2->{
 | 
|  |    546 | \begin{textblock}{12}(1,6)
 | 
|  |    547 | \begin{tabular}{ll}
 | 
|  |    548 |   Google's RE2 lib & $\Rightarrow$ \bl{$a^{\{1001\}}$} is too big\\
 | 
|  |    549 |   \onslide<3->{Rust Regex lib}    & \onslide<5->{$\Rightarrow$ \bl{$a^{\{1000\}\{100\}\{5\}}$} too big}\\
 | 
|  |    550 |                     & \onslide<6->{$\Rightarrow$ \bl{$a^{\{0\}\{4294967295\}}$} ?}
 | 
|  |    551 | \end{tabular}
 | 
|  |    552 | \end{textblock}}
 | 
|  |    553 | 
 | 
|  |    554 | \only<4>{
 | 
|  |    555 | \begin{textblock}{13.5}(1.5,4) 
 | 
|  |    556 |   \begin{mybox3}{From Rust's Regex Description}\it 
 | 
|  |    557 |     ``\ldots [the] syntax is similar to Perl-style regular expressions, but lacks a few features like look
 | 
|  |    558 |     around and backreferences. In exchange, all searches execute in linear time with respect
 | 
|  |    559 |     to the size of the regular expression and search text. \ldots''
 | 
|  |    560 |   \end{mybox3}
 | 
|  |    561 | \end{textblock}}
 | 
|  |    562 | 
 | 
|  |    563 | 
 | 
|  |    564 | \end{frame}  
 | 
| 876 |    565 | 
 | 
|  |    566 | 
 | 
|  |    567 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
| 913 |    568 | \begin{frame}[t]
 | 
|  |    569 | \frametitle{Regular Expressions}
 | 
| 876 |    570 | 
 | 
| 913 |    571 | \begin{textblock}{6}(2,5)
 | 
|  |    572 |   \begin{tabular}{@ {}rrl@ {\hspace{13mm}}l}
 | 
|  |    573 |   \bl{$r$} & \bl{$::=$}  & \bl{$\ZERO$}  & nothing\\
 | 
|  |    574 |          & \bl{$\mid$} & \bl{$\ONE$}       & empty string / \pcode{""} \\
 | 
|  |    575 |          & \bl{$\mid$} & \bl{$c, d, \ldots$}                         & characters\\
 | 
|  |    576 |          & \bl{$\mid$} & \bl{$r_1 + r_2$}  & alternative / choice\\
 | 
|  |    577 |          & \bl{$\mid$} & \bl{$r_1 \cdot r_2$} & sequence\\
 | 
|  |    578 |          & \bl{$\mid$} & \bl{$r^*$}            & star (zero or more)\\
 | 
|  |    579 |   \end{tabular}
 | 
|  |    580 |   \end{textblock}
 | 
|  |    581 |   
 | 
| 876 |    582 | \end{frame}
 | 
|  |    583 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
 | 
|  |    584 | 
 | 
|  |    585 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
|  |    586 | \begin{frame}[c]
 | 
| 913 |    587 | \frametitle{\begin{tabular}{l}The Derivative of a Rexp\end{tabular}}
 | 
|  |    588 | 
 | 
|  |    589 | \large
 | 
|  |    590 | If \bl{$r$} matches the string \bl{$c\!::\!s$}, what is a regular 
 | 
|  |    591 | expression that matches just \bl{$s$}?\bigskip\bigskip\bigskip\bigskip
 | 
|  |    592 | 
 | 
|  |    593 | \small
 | 
|  |    594 | \bl{$\der\,c\,r$} gives the answer, Brzozowski 1964\medskip\\
 | 
|  |    595 | (lost in the sands of time, re-appeared in 2009)
 | 
| 876 |    596 | \end{frame}
 | 
|  |    597 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
|  |    598 | 
 | 
|  |    599 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
|  |    600 | \begin{frame}[c]
 | 
| 913 |    601 | \frametitle{\begin{tabular}{l}The Derivative of a Rexp\end{tabular}}
 | 
| 876 |    602 | 
 | 
| 913 |    603 | \begin{center}
 | 
|  |    604 | \begin{tabular}{@ {}l@ {\hspace{2mm}}c@ {\hspace{2mm}}l@ {\hspace{-10mm}}l@ {}}
 | 
|  |    605 |   \bl{$\der\, c\, (\ZERO)$}      & \bl{$\dn$} & \bl{$\ZERO$} & \\
 | 
|  |    606 |   \bl{$\der\, c\, (\ONE)$}           & \bl{$\dn$} & \bl{$\ZERO$} & \\
 | 
|  |    607 |   \bl{$\der\, c\, (d)$}                     & \bl{$\dn$} & \bl{if $c = d$ then $\ONE$ else $\ZERO$} & \\
 | 
|  |    608 |   \bl{$\der\, c\, (r_1 + r_2)$}        & \bl{$\dn$} & \bl{$\der\, c\, r_1 + \der\, c\, r_2$} & \\
 | 
|  |    609 |   \bl{$\der\, c\, (r_1 \cdot r_2)$}  & \bl{$\dn$}  & \bl{if $nullable (r_1)$}\\
 | 
|  |    610 |   & & \bl{then $(\der\,c\,r_1) \cdot r_2 + \der\, c\, r_2$}\\ 
 | 
|  |    611 |   & & \bl{else $(\der\, c\, r_1) \cdot r_2$}\\
 | 
|  |    612 |   \bl{$\der\, c\, (r^*)$}  & \bl{$\dn$} & \bl{$(\der\,c\,r) \cdot (r^*)$} &\medskip\bigskip\\
 | 
|  |    613 |   \end{tabular}
 | 
|  |    614 | \end{center}
 | 
| 876 |    615 | 
 | 
|  |    616 | \end{frame}
 | 
|  |    617 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
 | 
|  |    618 | 
 | 
|  |    619 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
| 913 |    620 | \begin{frame}[t]
 | 
|  |    621 | \frametitle{\begin{tabular}{l}Brzozowski matcher\end{tabular}}
 | 
| 876 |    622 | 
 | 
| 913 |    623 | Does \bl{$r_1$} match \bl{"$abc$"}?
 | 
|  |    624 | \begin{center}
 | 
|  |    625 | \begin{tabular}{@{}rl@{}l@{}}
 | 
|  |    626 | Step 1: & build derivative of \bl{$a$} and \bl{$r_1$} & \bl{$(r_2 = \der\,a\,r_1)$}\smallskip\\
 | 
|  |    627 | Step 2: & build derivative of \bl{$b$} and \bl{$r_2$} & \bl{$(r_3 = \der\,b\,r_2)$}\smallskip\\
 | 
|  |    628 | Step 3: & build derivative of \bl{$c$} and \bl{$r_3$} & \bl{$(r_4 = \der\,c\,r_3)$}\smallskip\\
 | 
|  |    629 | Step 4: & the string is exhausted: & \bl{($nullable(r_4))$}\\
 | 
|  |    630 |         & test whether \bl{$r_4$} can recognise\\
 | 
|  |    631 |         & the empty string\medskip\\
 | 
|  |    632 | Output: & result of the test\\
 | 
|  |    633 |         & $\Rightarrow \bl{\textit{true}} \,\text{or}\, 
 | 
|  |    634 |                        \bl{\textit{false}}$\\        
 | 
|  |    635 | \end{tabular}
 | 
|  |    636 | \end{center}
 | 
| 876 |    637 | 
 | 
| 913 |    638 | 
 | 
|  |    639 | \end{frame}
 | 
|  |    640 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 | 
|  |    641 | 
 | 
|  |    642 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
|  |    643 | \begin{frame}[c]
 | 
|  |    644 | \frametitle{\mbox{Nullable}}
 | 
|  |    645 | 
 | 
| 876 |    646 | 
 | 
| 913 |    647 | \ldots{}whether a regular expression can match the empty string:
 | 
|  |    648 | \begin{center}
 | 
|  |    649 | \begin{tabular}{@ {}l@ {\hspace{2mm}}c@ {\hspace{2mm}}l@ {}}
 | 
|  |    650 | \bl{$nullable(\ZERO)$}    & \bl{$\dn$} & \bl{\textit{false}}\\
 | 
|  |    651 | \bl{$nullable(\ONE)$}       & \bl{$\dn$} & \bl{\textit{true}}\\
 | 
|  |    652 | \bl{$nullable (c)$}             & \bl{$\dn$} & \bl{\textit{false}}\\
 | 
|  |    653 | \bl{$nullable (r_1 + r_2)$}     & \bl{$\dn$} & \bl{$nullable(r_1) \vee nullable(r_2)$} \\ 
 | 
|  |    654 | \bl{$nullable (r_1 \cdot r_2)$} & \bl{$\dn$} & \bl{$nullable(r_1) \wedge nullable(r_2)$} \\
 | 
|  |    655 | \bl{$nullable (r^*)$}           & \bl{$\dn$} & \bl{\textit{true}}\\
 | 
|  |    656 | \end{tabular}
 | 
|  |    657 | \end{center}
 | 
|  |    658 | 
 | 
|  |    659 | \end{frame}
 | 
|  |    660 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
 | 
|  |    661 | 
 | 
|  |    662 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
|  |    663 | \begin{frame}[t]
 | 
|  |    664 | \frametitle{\begin{tabular}{l}Extensions\end{tabular}}
 | 
| 876 |    665 | 
 | 
| 913 |    666 | \begin{center}
 | 
|  |    667 | \begin{tabular}{@ {\hspace{-4mm}}l@ {\hspace{2mm}}c@ {\hspace{2mm}}l@ {\hspace{-10mm}}l@ {}}
 | 
|  |    668 |   \bl{$\der\, c\, (r^{\{n\}})$}      & \bl{$\dn$} & \bl{$if\;n=0\;then\;\ZERO\;else\; (der\,c\,r)\cdot r^{\{n-1\}}$} & \\
 | 
|  |    669 |   \bl{$\der\, c\, (r^{\{..n\}})$}    & \bl{$\dn$} & \bl{$if\;n=0\;then\;\ZERO\;else\; (der\,c\,r)\cdot r^{\{n-1\}}$} & \\
 | 
|  |    670 |   \bl{$\der\, c\, (r^{\{n..\}})$}    & \bl{$\dn$} & \bl{$if\;n=0\;then\;(der\,c\,r)\cdot r^*$} \\
 | 
|  |    671 |                                     &            & \bl{$else\; (der\,c\,r)\cdot r^{\{n-1\}}$} & \\
 | 
|  |    672 |   \bl{$\der\, c\, (r^{\{n..m\}})$}   & \bl{$\dn$} & \bl{$if\;n=0 \wedge m=0\;then\;\ZERO\;else$} & \\
 | 
|  |    673 |                                      &           & \bl{$if \;n=0 \wedge 0<m\; then\;(der\,c\,r)\cdot r^{\{..m-1\}}$} & \\
 | 
|  |    674 |                                      &           & \bl{$else\; (der\,c\,r)\cdot r^{\{n-1..m-1\}}$} & \\
 | 
|  |    675 |   \bl{$\der\, c\, (\neg{}r)$}            & \bl{$\dn$}  & \bl{$\neg(der\,c\,r)$}\\
 | 
|  |    676 |   \end{tabular}
 | 
|  |    677 | \end{center}
 | 
|  |    678 | 
 | 
|  |    679 | also works for lookarounds, various anchors, etc, but \textbf{not} for backreferences
 | 
|  |    680 | 
 | 
|  |    681 | \begin{textblock}{3}(11,13)
 | 
|  |    682 | \onslide<2>{ 
 | 
|  |    683 |   \begin{bubble}[3cm]
 | 
|  |    684 |   \bl{$a^{\{0\}\{4294967295\}}$}
 | 
|  |    685 | \end{bubble}}
 | 
| 876 |    686 | \end{textblock}
 | 
|  |    687 | 
 | 
|  |    688 | \end{frame}
 | 
|  |    689 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
 | 
|  |    690 | 
 | 
|  |    691 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
| 913 |    692 | \begin{frame}[t]
 | 
|  |    693 | \frametitle{\mbox{Problems with Ders}}
 | 
| 876 |    694 | 
 | 
| 913 |    695 | \textcolor{blue}{
 | 
| 876 |    696 | \small
 | 
| 913 |    697 | \def\ll{\stackrel{der\,a}{\longrightarrow}}
 | 
| 876 |    698 | \begin{center}
 | 
| 913 |    699 | \begin{tabular}{@{\hspace{-5mm}}rll}
 | 
|  |    700 | $(a + aa)^*$ & $\ll$ & $(\ONE + \ONE{}a) \cdot (a + aa)^*$\\
 | 
|  |    701 | & $\ll$ & $(\ZERO + \ZERO{}a + \ONE) \cdot (a + aa)^* \;+\; (\ONE + \ONE{}a) \cdot (a + aa)^*$\\
 | 
|  |    702 | & $\ll$ & $(\ZERO + \ZERO{}a + \ZERO) \cdot (a + aa)^* + (\ONE + \ONE{}a) \cdot (a + aa)^* \;+\; $\\
 | 
|  |    703 | & & $\qquad(\ZERO + \ZERO{}a + \ONE) \cdot (a + aa)^* + (\ONE + \ONE{}a) \cdot (a + aa)^*$\\
 | 
|  |    704 | & $\ll$ & \ldots\\ \hspace{15mm}
 | 
| 876 |    705 | \end{tabular}
 | 
| 913 |    706 | \end{center}}
 | 
|  |    707 | 
 | 
|  |    708 | \begin{textblock}{13.5}(1.5,12) 
 | 
|  |    709 | (regular expressions of sizes 98, 169, 283, 468, 767, \ldots)
 | 
|  |    710 | \end{textblock}
 | 
| 876 |    711 | 
 | 
|  |    712 | \end{frame}
 | 
| 913 |    713 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 | 
| 876 |    714 | 
 | 
|  |    715 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
|  |    716 | \begin{frame}[c]
 | 
| 913 |    717 | \frametitle{\mbox{Conclusion}}
 | 
| 876 |    718 | 
 | 
|  |    719 | \begin{itemize}
 | 
| 913 |    720 | \item The beauty is that this only involves functional programs that can be conveniently reasoned about in theorem provers 
 | 
|  |    721 | \item POSIX lexing can be done via an extension by Sulzmann and Lu, 2014 (our current work)\medskip\pause
 | 
|  |    722 | \item How surprising that one can still do new work on regular expressions.  
 | 
|  |    723 | \end{itemize} 
 | 
| 876 |    724 | 
 | 
|  |    725 | \end{frame}
 | 
|  |    726 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
 | 
|  |    727 | 
 | 
|  |    728 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 | 
|  |    729 | 
 | 
| 913 |    730 | \begin{frame}<1-10>
 | 
|  |    731 | \end{frame}  
 | 
| 876 |    732 | 
 | 
|  |    733 | 
 | 
|  |    734 | 
 | 
|  |    735 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
 | 
|  |    736 | \end{document}
 | 
|  |    737 | 
 | 
|  |    738 | %%% Local Variables:  
 | 
|  |    739 | %%% mode: latex
 | 
|  |    740 | %%% TeX-master: t
 | 
|  |    741 | %%% End: 
 | 
|  |    742 | 
 |