42   | 
    42   | 
    43 \end{frame} | 
    43 \end{frame} | 
    44 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%       | 
    44 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%       | 
    45   | 
    45   | 
    46 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
    46 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
    47 \begin{frame}[c] | 
    47 \begin{frame}[t] | 
    48 \frametitle{\begin{tabular}{@ {}c@ {}} | 
    48   \frametitle{\Large | 
    49     An Efficient Regular\\[-1mm]   | 
    49     Lets Implement an Efficient\\[-2mm]   | 
    50     Expression Matcher\end{tabular}} | 
    50     Regular Expression Matcher}  | 
    51   | 
    51   | 
    52 \footnotesize  | 
    52 \footnotesize  | 
    53 \begin{center} | 
    53 \begin{center} | 
    54   {\normalsize Graphs: \bl{$a^{?\{n\}} \cdot a^{\{n\}}$} and strings \bl{$\underbrace{\,a\ldots a\,}_{n}$}}\smallskip\\ | 
    54   {\normalsize Graphs: \bl{$a^{?\{n\}} \cdot a^{\{n\}}$} and strings \bl{$\underbrace{\,a\ldots a\,}_{n}$}}\medskip\\ | 
    55 \begin{tabular}{@{}cc@{}} | 
    55 \begin{tabular}{@{}cc@{}} | 
    56 \begin{tikzpicture} | 
    56 \begin{tikzpicture} | 
    57 \begin{axis}[ | 
    57 \begin{axis}[ | 
    58     xlabel={$n$}, | 
    58     xlabel={$n$}, | 
    59     x label style={at={(1.05,0.0)}}, | 
    59     x label style={at={(1.05,0.0)}}, | 
    88     scaled ticks=false,  | 
    88     scaled ticks=false,  | 
    89     axis lines=left,  | 
    89     axis lines=left,  | 
    90     width=5cm,  | 
    90     width=5cm,  | 
    91     height=4.5cm,  | 
    91     height=4.5cm,  | 
    92     legend entries={Scala V2,Scala V3}, | 
    92     legend entries={Scala V2,Scala V3}, | 
    93     legend pos=north west,  | 
    93     legend pos=north east,  | 
    94     legend cell align=left]  | 
    94     legend cell align=left]  | 
    95 \addplot[green,mark=square*,mark options={fill=white}] table {re2.data}; | 
    95 \addplot[green,mark=square*,mark options={fill=white}] table {re2.data}; | 
    96 \addplot[black,mark=square*,mark options={fill=white}] table {re3.data}; | 
    96 \addplot[black,mark=square*,mark options={fill=white}] table {re3.data}; | 
    97 \end{axis} | 
    97 \end{axis} | 
    98 \end{tikzpicture} | 
    98 \end{tikzpicture} | 
    99 \end{tabular} | 
    99 \end{tabular} | 
   100 \end{center} | 
   100 \end{center} | 
   101   | 
   101   | 
   102 \small  | 
   102 \small  | 
   103 In the handouts is a similar graph for \bl{$(a^*)^* \cdot b$} and Java. | 
   103 In the handouts is a similar graph for \bl{$(a^*)^* \cdot b$} and Java 8. | 
   104   | 
   104   | 
   105 \end{frame} | 
   105 \end{frame} | 
   106 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     | 
   106 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     | 
   107   | 
   107   | 
   108 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
   108 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
   266   | 
   269   | 
   267 \end{frame} | 
   270 \end{frame} | 
   268 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
   271 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
   269   | 
   272   | 
   270 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
   273 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
   271 \begin{frame}[c] | 
   274 \begin{frame}[t] | 
   272 \frametitle{Semantic Derivative} | 
   275 \frametitle{Semantic Derivative\\[5mm]} | 
         | 
   276   | 
         | 
   277     | 
   273   | 
   278   | 
   274 \begin{itemize} | 
   279 \begin{itemize} | 
   275 \item The \alert{\bf Semantic Derivative} of a  | 
   280 \item The \alert{\bf Semantic Derivative} of a  | 
   276 \underline{language}\\ wrt to a character \bl{$c$}: | 
   281 \underline{language}\\ w.r.t.~to a character \bl{$c$}: | 
   277 \bigskip  | 
   282 \bigskip  | 
   278   | 
   283   | 
   279 \begin{center} | 
   284 \begin{center} | 
   280 \bl{$\Der\,c\,A \dn \{ s \;|\;  c\!::\!s \in A\}$ }  | 
   285 \bl{$\Der\,c\,A \dn \{ s \;|\;  c\!::\!s \in A\}$ }  | 
   281 \end{center}\bigskip\bigskip\bigskip | 
   286 \end{center}\bigskip | 
   282   | 
   287   | 
   283 For \bl{$A = \{\textit{foo}, \textit{bar}, \textit{frak}\}$} then | 
   288 For \bl{$A = \{\textit{foo}, \textit{bar}, \textit{frak}\}$} then | 
   284   | 
   289   | 
   285 \begin{center} | 
   290 \begin{center} | 
   286 \bl{\begin{tabular}{l@{\hspace{2mm}}c@{\hspace{2mm}}l} | 
   291 \bl{\begin{tabular}{l@{\hspace{2mm}}c@{\hspace{2mm}}l} | 
   287 $\Der\,f\,A$ & $=$ & $\{\textit{oo}, \textit{rak}\}$\\ | 
   292 $\Der\,f\,A$ & $=$ & $\{\textit{oo}, \textit{rak}\}$\\ | 
   288 $\Der\,b\,A$ & $=$ &  $\{\textit{ar}\}$\\   | 
   293 $\Der\,b\,A$ & $=$ &  $\{\textit{ar}\}$\\   | 
   289 $\Der\,a\,A$ & $=$ & $\{\}$\\\pause | 
   294 $\Der\,a\,A$ & $=$ & $\{\}$\pause | 
   290 \end{tabular}} | 
   295 \end{tabular}} | 
   291 \end{center} | 
   296 \end{center} | 
   292   | 
   297   | 
   293 \small  | 
   298 \small  | 
   294 We can extend this definition to strings  | 
   299 We can extend this definition to strings  | 
   495 \end{frame} | 
   501 \end{frame} | 
   496 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     | 
   502 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     | 
   497   | 
   503   | 
   498 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
   504 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
   499 \begin{frame}[c] | 
   505 \begin{frame}[c] | 
   500 \frametitle{The Algorithm} | 
   506 \frametitle{\mbox{The Brzozowski Algorithm}} | 
   501   | 
   507   | 
   502 \begin{center} | 
   508 \begin{center} | 
   503 \begin{tabular}{l}  | 
   509 \begin{tabular}{l}  | 
   504 \bl{$\textit{matches}\,r\,s \dn \textit{nullable}(\ders\,r\,s)$}   | 
   510 \bl{$\textit{matches}\,r\,s \dn \textit{nullable}(\ders\;s\;r)$}   | 
   505 \end{tabular} | 
   511 \end{tabular} | 
   506 \end{center} | 
   512 \end{center} | 
   507   | 
   513   | 
   508   | 
   514   | 
   509 \end{frame} | 
   515 \end{frame} | 
   510 %%%%%%%%%%%%%%%%%  | 
   516 %%%%%%%%%%%%%%%%%  | 
   511   | 
   517   | 
   512 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
   518 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
   513 \begin{frame}[t] | 
   519 \begin{frame}[t] | 
   514 \frametitle{An Example} | 
   520 \frametitle{Brzozowski: An Example} | 
   515   | 
   521   | 
   516 Does \bl{$r_1$} match \bl{$abc$}? | 
   522 Does \bl{$r_1$} match \bl{$abc$}? | 
   517 \begin{center} | 
   523 \begin{center} | 
   518 \begin{tabular}{@{}rl@{}l@{}} | 
   524 \begin{tabular}{@{}rl@{}l@{}} | 
   519 Step 1: & build derivative of \bl{$a$} and \bl{$r_1$} & \bl{$(r_2 = \der\,a\,r_1)$}\smallskip\\ | 
   525 Step 1: & build derivative of \bl{$a$} and \bl{$r_1$} & \bl{$(r_2 = \der\,a\,r_1)$}\smallskip\\ | 
   520 Step 2: & build derivative of \bl{$b$} and \bl{$r_2$} & \bl{$(r_3 = \der\,b\,r_2)$}\smallskip\\ | 
   526 Step 2: & build derivative of \bl{$b$} and \bl{$r_2$} & \bl{$(r_3 = \der\,b\,r_2)$}\smallskip\\ | 
   521 Step 3: & build derivative of \bl{$c$} and \bl{$r_3$} & \bl{$(r_4 = \der\,c\,r_3)$}\smallskip\\ | 
   527 Step 3: & build derivative of \bl{$c$} and \bl{$r_3$} & \bl{$(r_4 = \der\,c\,r_3)$}\smallskip\\ | 
   522 Step 4: & the string is exhausted: & \bl{($nullable(r_4))$}\\ | 
   528 Step 4: & the string is exhausted: & \bl{($nullable(r_4))$}\\ | 
   523         & test whether \bl{$r_4$} can recognise\\ | 
   529         & test whether \bl{$r_4$} can recognise\\ | 
   524         & the empty string\smallskip\\  | 
   530         & the empty string\medskip\\  | 
   525 Output: & result of the test\\  | 
   531 Output: & result of the test\\  | 
   526         & $\Rightarrow \bl{\textit{true}} \,\text{or}\,  | 
   532         & $\Rightarrow \bl{\textit{true}} \,\text{or}\,  | 
   527                        \bl{\textit{false}}$\\         | 
   533                        \bl{\textit{false}}$\\         | 
   528 \end{tabular} | 
   534 \end{tabular} | 
   529 \end{center} | 
   535 \end{center} | 
   745 \end{center} | 
   751 \end{center} | 
   746   | 
   752   | 
   747 \end{frame} | 
   753 \end{frame} | 
   748 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     | 
   754 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     | 
   749   | 
   755   | 
   750 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
   756   | 
   751 %\begin{frame}[c] | 
   757 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
   752 %\frametitle{\bl{$(a^*)^* \cdot b$}} | 
   758 \begin{frame}[c] | 
   753 %  | 
   759   \frametitle{ | 
   754 %\begin{center} | 
   760     Another Example\\[-1mm]  | 
   755 %\begin{tikzpicture} | 
   761     in Java \liningnums{8} and Python} | 
   756 %  \begin{axis}[ | 
   762   | 
   757 %    xlabel={$n$}, | 
   763 \begin{center} | 
   758 %    x label style={at={(1.09,0.0)}}, | 
   764 \begin{tikzpicture} | 
   759 %    ylabel={time in secs}, | 
   765   \begin{axis}[ | 
   760 %    enlargelimits=false,  | 
   766     xlabel={$n$}, | 
   761 %    xmax=27,  | 
   767     x label style={at={(1.05,0.0)}}, | 
   762 %    xtick={0,5,...,20}, | 
   768     ylabel={time in secs}, | 
   763 %    ytick={0,5,...,25}, | 
   769     enlargelimits=false,  | 
   764 %    ymax=13,  | 
   770     xtick={0,5,...,30}, | 
   765 %    scaled ticks=false,  | 
   771     xmax=33,  | 
   766 %    axis lines=left,  | 
   772     ymax=35,  | 
   767 %    width=9cm,  | 
   773     ytick={0,10,...,30}, | 
   768 %    height=5cm,   | 
   774     scaled ticks=false,  | 
   769 %    legend entries={Scala V2}, | 
   775     axis lines=left,  | 
   770 %    legend pos=north west,  | 
   776     width=9cm,  | 
   771 %    legend cell align=left]  | 
   777     height=5cm,   | 
   772 %\addplot[green,mark=square*,mark options={fill=white}] table {re2a.data}; | 
   778     legend entries={Java 8, Python},   | 
   773 %% still needs to be done  | 
   779     legend pos=north west,  | 
   774 %%\addplot[black,mark=square*,mark options={fill=white}] table {re3a.data}; | 
   780     legend cell align=left]  | 
   775 %\end{axis} | 
   781 \addplot[blue,mark=*, mark options={fill=white}] table {re-python2.data}; | 
   776 %\end{tikzpicture} | 
   782 \addplot[cyan,mark=*, mark options={fill=white}] table {re-java.data}; | 
   777 %\end{center} | 
   783 \end{axis} | 
   778 %  | 
   784 \end{tikzpicture} | 
   779 %\end{frame} | 
   785 \end{center} | 
   780 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     | 
   786   | 
   781   | 
   787 Regex: \bl{$(a^*)^* \cdot b$} | 
   782 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
   788   | 
   783 \begin{frame}[c] | 
   789 Strings of the form \bl{$\underbrace{\,a\ldots a\,}_{n}$} | 
   784 \frametitle{\bl{$(a^*)^* \cdot b$}} | 
   790   | 
         | 
   791 \end{frame} | 
         | 
   792 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
         | 
   793   | 
         | 
   794 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
         | 
   795 \begin{frame}[c] | 
         | 
   796 \frametitle{Same Example in Java \liningnums{9}+} | 
         | 
   797   | 
         | 
   798 \begin{center} | 
         | 
   799 \begin{tikzpicture} | 
         | 
   800   \begin{axis}[ | 
         | 
   801     xlabel={$n$}, | 
         | 
   802     x label style={at={(1.09,-0.15)}}, | 
         | 
   803     ylabel={time in secs}, | 
         | 
   804     scaled x ticks=false,  | 
         | 
   805     enlargelimits=false,  | 
         | 
   806     xtick distance=10000,  | 
         | 
   807     xmax=44000,   | 
         | 
   808     ytick={0,10,...,30},  | 
         | 
   809     ymax=35,   | 
         | 
   810     axis lines=left,  | 
         | 
   811     width=9cm,  | 
         | 
   812     height=5cm,   | 
         | 
   813     legend entries={Java \liningnums{9}+}, | 
         | 
   814     legend pos=north west,  | 
         | 
   815     legend cell align=left]  | 
         | 
   816 \addplot[blue,mark=square*,mark options={fill=white}] table {re-java9.data}; | 
         | 
   817 \end{axis} | 
         | 
   818 \end{tikzpicture} | 
         | 
   819 \end{center} | 
         | 
   820   | 
         | 
   821 Regex: \bl{$(a^*)^* \cdot b$} | 
         | 
   822   | 
         | 
   823 Strings of the form \bl{$\underbrace{\,a\ldots a\,}_{n}$} | 
         | 
   824   | 
         | 
   825 \end{frame} | 
         | 
   826 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
         | 
   827   | 
         | 
   828 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
         | 
   829 \begin{frame}[c] | 
         | 
   830 \frametitle{and with Brzozowski} | 
   785   | 
   831   | 
   786 \begin{center} | 
   832 \begin{center} | 
   787 \begin{tikzpicture} | 
   833 \begin{tikzpicture} | 
   788   \begin{axis}[ | 
   834   \begin{axis}[ | 
   789     xlabel={$n$}, | 
   835     xlabel={$n$}, | 
   790     x label style={at={(1.09,0.0)}}, | 
   836     x label style={at={(1.09,0.0)}}, | 
   791     ylabel={time in secs}, | 
   837     ylabel={time in secs}, | 
         | 
   838     scaled x ticks=false,  | 
         | 
   839     xtick distance=2000000,  | 
   792     enlargelimits=false,  | 
   840     enlargelimits=false,  | 
         | 
   841     xmax=6400000,   | 
   793     ytick={0,10,...,30}, | 
   842     ytick={0,10,...,30}, | 
   794     ymax=35,  | 
   843     ymax=35,  | 
   795     axis lines=left,  | 
   844     axis lines=left,  | 
   796     width=9cm,  | 
   845     width=9cm,  | 
   797     height=5cm,   | 
   846     height=5cm,   | 
   798     legend entries={Scala V3}, | 
   847     legend entries={Scala V3}, | 
   799     legend pos=north east,  | 
   848     legend pos=north west,  | 
   800     legend cell align=left]  | 
   849     legend cell align=left]  | 
   801 %\addplot[green,mark=square*,mark options={fill=white}] table {re2a.data}; | 
   850 %\addplot[green,mark=square*,mark options={fill=white}] table {re2a.data}; | 
   802 \addplot[black,mark=square*,mark options={fill=white}] table {re3a.data}; | 
   851 \addplot[black,mark=square*,mark options={fill=white}] table {re3a.data}; | 
   803 \end{axis} | 
   852 \end{axis} | 
   804 \end{tikzpicture} | 
   853 \end{tikzpicture} | 
   805 \end{center} | 
   854 \end{center} | 
   806   | 
   855   | 
   807 \end{frame} | 
   856 Regex: \bl{$(a^*)^* \cdot b$} | 
   808 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     | 
   857   | 
   809   | 
   858 Strings of the form \bl{$\underbrace{\,a\ldots a\,}_{n}$} | 
   810   | 
   859   | 
         | 
   860 \end{frame} | 
         | 
   861 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     | 
   811   | 
   862   | 
   812 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
   863 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
   813 \begin{frame}[t] | 
   864 \begin{frame}[t] | 
   814 \frametitle{What is good about this Alg.} | 
   865 \frametitle{What is good about this Alg.} | 
   815   | 
   866   |