ninems/ninems.tex
author Christian Urban <urbanc@in.tum.de>
Sat, 06 Jul 2019 23:34:27 +0100
changeset 63 d3c22f809dde
parent 62 5b10d83b0834
child 64 afd0d702a4fe
permissions -rw-r--r--
more proof-reading
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45
60cb82639691 spell check
Christian Urban <urbanc@in.tum.de>
parents: 44
diff changeset
     1
\documentclass[a4paper,UKenglish]{lipics}
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
     2
\usepackage{graphic}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
     3
\usepackage{data}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
     4
\usepackage{tikz-cd}
63
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
     5
%\usepackage{algorithm}
35
f70e9ab4e680 psuedocode added
Chengsong
parents: 34
diff changeset
     6
\usepackage{amsmath}
f70e9ab4e680 psuedocode added
Chengsong
parents: 34
diff changeset
     7
\usepackage[noend]{algpseudocode}
42
Chengsong
parents: 41
diff changeset
     8
\usepackage{enumitem}
63
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
     9
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
    10
\definecolor{darkblue}{rgb}{0,0,0.6}
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
    11
\hypersetup{colorlinks=true,allcolors=darkblue}
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    12
% \documentclass{article}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    13
%\usepackage[utf8]{inputenc}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    14
%\usepackage[english]{babel}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    15
%\usepackage{listings}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    16
% \usepackage{amsthm}
63
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
    17
%\usepackage{hyperref}
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    18
% \usepackage[margin=0.5in]{geometry}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    19
%\usepackage{pmboxdraw}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    20
 
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    21
\title{POSIX Regular Expression Matching and Lexing}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    22
\author{Chengsong Tan}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    23
\affil{King's College London\\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    24
London, UK\\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    25
\texttt{chengsong.tan@kcl.ac.uk}}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    26
\authorrunning{Chengsong Tan}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    27
\Copyright{Chengsong Tan}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    28
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    29
\newcommand{\dn}{\stackrel{\mbox{\scriptsize def}}{=}}%
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    30
\newcommand{\ZERO}{\mbox{\bf 0}}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    31
\newcommand{\ONE}{\mbox{\bf 1}}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    32
\def\lexer{\mathit{lexer}}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    33
\def\mkeps{\mathit{mkeps}}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    34
\def\inj{\mathit{inj}}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    35
\def\Empty{\mathit{Empty}}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    36
\def\Left{\mathit{Left}}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    37
\def\Right{\mathit{Right}}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    38
\def\Stars{\mathit{Stars}}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    39
\def\Char{\mathit{Char}}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    40
\def\Seq{\mathit{Seq}}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    41
\def\Der{\mathit{Der}}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    42
\def\nullable{\mathit{nullable}}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    43
\def\Z{\mathit{Z}}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    44
\def\S{\mathit{S}}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    45
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    46
%\theoremstyle{theorem}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    47
%\newtheorem{theorem}{Theorem}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    48
%\theoremstyle{lemma}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    49
%\newtheorem{lemma}{Lemma}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    50
%\newcommand{\lemmaautorefname}{Lemma}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    51
%\theoremstyle{definition}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    52
%\newtheorem{definition}{Definition}
35
f70e9ab4e680 psuedocode added
Chengsong
parents: 34
diff changeset
    53
\algnewcommand\algorithmicswitch{\textbf{switch}}
f70e9ab4e680 psuedocode added
Chengsong
parents: 34
diff changeset
    54
\algnewcommand\algorithmiccase{\textbf{case}}
f70e9ab4e680 psuedocode added
Chengsong
parents: 34
diff changeset
    55
\algnewcommand\algorithmicassert{\texttt{assert}}
f70e9ab4e680 psuedocode added
Chengsong
parents: 34
diff changeset
    56
\algnewcommand\Assert[1]{\State \algorithmicassert(#1)}%
f70e9ab4e680 psuedocode added
Chengsong
parents: 34
diff changeset
    57
% New "environments"
f70e9ab4e680 psuedocode added
Chengsong
parents: 34
diff changeset
    58
\algdef{SE}[SWITCH]{Switch}{EndSwitch}[1]{\algorithmicswitch\ #1\ \algorithmicdo}{\algorithmicend\ \algorithmicswitch}%
f70e9ab4e680 psuedocode added
Chengsong
parents: 34
diff changeset
    59
\algdef{SE}[CASE]{Case}{EndCase}[1]{\algorithmiccase\ #1}{\algorithmicend\ \algorithmiccase}%
f70e9ab4e680 psuedocode added
Chengsong
parents: 34
diff changeset
    60
\algtext*{EndSwitch}%
f70e9ab4e680 psuedocode added
Chengsong
parents: 34
diff changeset
    61
\algtext*{EndCase}%
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    62
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    63
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    64
\begin{document}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    65
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    66
\maketitle
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    67
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    68
\begin{abstract}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    69
  Brzozowski introduced in 1964 a beautifully simple algorithm for
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    70
  regular expression matching based on the notion of derivatives of
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    71
  regular expressions. In 2014, Sulzmann and Lu extended this
40
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
    72
  algorithm to not just give a YES/NO answer for whether or not a
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
    73
  regular expression matches a string, but in case it matches also
58
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
    74
  answers with \emph{how} it matches the string.  This is important for
40
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
    75
  applications such as lexing (tokenising a string). The problem is to
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
    76
  make the algorithm by Sulzmann and Lu fast on all inputs without
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
    77
  breaking its correctness. We have already developed some
59
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
    78
  simplification rules for this, but have not yet proved that they
40
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
    79
  preserve the correctness of the algorithm. We also have not yet
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
    80
  looked at extended regular expressions, such as bounded repetitions,
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
    81
  negation and back-references.
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    82
\end{abstract}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    83
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    84
\section{Introduction}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    85
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    86
This PhD-project is about regular expression matching and
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    87
lexing. Given the maturity of this topic, the reader might wonder:
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    88
Surely, regular expressions must have already been studied to death?
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    89
What could possibly be \emph{not} known in this area? And surely all
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    90
implemented algorithms for regular expression matching are blindingly
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    91
fast?
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    92
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    93
Unfortunately these preconceptions are not supported by evidence: Take
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    94
for example the regular expression $(a^*)^*\,b$ and ask whether
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    95
strings of the form $aa..a$ match this regular
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    96
expression. Obviously they do not match---the expected $b$ in the last
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    97
position is missing. One would expect that modern regular expression
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    98
matching engines can find this out very quickly. Alas, if one tries
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
    99
this example in JavaScript, Python or Java 8 with strings like 28
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   100
$a$'s, one discovers that this decision takes around 30 seconds and
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   101
takes considerably longer when adding a few more $a$'s, as the graphs
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   102
below show:
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   103
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   104
\begin{center}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   105
\begin{tabular}{@{}c@{\hspace{0mm}}c@{\hspace{0mm}}c@{}}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   106
\begin{tikzpicture}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   107
\begin{axis}[
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   108
    xlabel={$n$},
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   109
    x label style={at={(1.05,-0.05)}},
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   110
    ylabel={time in secs},
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   111
    enlargelimits=false,
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   112
    xtick={0,5,...,30},
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   113
    xmax=33,
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   114
    ymax=35,
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   115
    ytick={0,5,...,30},
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   116
    scaled ticks=false,
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   117
    axis lines=left,
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   118
    width=5cm,
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   119
    height=4cm, 
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   120
    legend entries={JavaScript},  
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   121
    legend pos=north west,
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   122
    legend cell align=left]
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   123
\addplot[red,mark=*, mark options={fill=white}] table {re-js.data};
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   124
\end{axis}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   125
\end{tikzpicture}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   126
  &
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   127
\begin{tikzpicture}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   128
\begin{axis}[
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   129
    xlabel={$n$},
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   130
    x label style={at={(1.05,-0.05)}},
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   131
    %ylabel={time in secs},
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   132
    enlargelimits=false,
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   133
    xtick={0,5,...,30},
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   134
    xmax=33,
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   135
    ymax=35,
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   136
    ytick={0,5,...,30},
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   137
    scaled ticks=false,
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   138
    axis lines=left,
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   139
    width=5cm,
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   140
    height=4cm, 
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   141
    legend entries={Python},  
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   142
    legend pos=north west,
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   143
    legend cell align=left]
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   144
\addplot[blue,mark=*, mark options={fill=white}] table {re-python2.data};
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   145
\end{axis}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   146
\end{tikzpicture}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   147
  &
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   148
\begin{tikzpicture}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   149
\begin{axis}[
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   150
    xlabel={$n$},
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   151
    x label style={at={(1.05,-0.05)}},
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   152
    %ylabel={time in secs},
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   153
    enlargelimits=false,
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   154
    xtick={0,5,...,30},
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   155
    xmax=33,
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   156
    ymax=35,
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   157
    ytick={0,5,...,30},
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   158
    scaled ticks=false,
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   159
    axis lines=left,
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   160
    width=5cm,
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   161
    height=4cm, 
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   162
    legend entries={Java 8},  
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   163
    legend pos=north west,
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   164
    legend cell align=left]
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   165
\addplot[cyan,mark=*, mark options={fill=white}] table {re-java.data};
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   166
\end{axis}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   167
\end{tikzpicture}\\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   168
\multicolumn{3}{c}{Graphs: Runtime for matching $(a^*)^*\,b$ with strings 
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   169
           of the form $\underbrace{aa..a}_{n}$.}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   170
\end{tabular}    
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   171
\end{center}  
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   172
58
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   173
\noindent These are clearly abysmal and possibly surprising results. One
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   174
would expect these systems doing much better than that---after all,
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   175
given a DFA and a string, deciding whether a string is matched by this
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   176
DFA should be linear.
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   177
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   178
Admittedly, the regular expression $(a^*)^*\,b$ is carefully chosen to
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   179
exhibit this ``exponential behaviour''.  Unfortunately, such regular
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   180
expressions are not just a few ``outliers'', but actually they are
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   181
frequent enough that a separate name has been created for
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   182
them---\emph{evil regular expressions}. In empiric work, Davis et al
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   183
report that they have found thousands of such evil regular expressions
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   184
in the JavaScript and Python ecosystems \cite{Davis18}.
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   185
58
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   186
This exponential blowup in matching algorithms sometimes causes
63
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   187
considerable grief in real life: for example on 20 July 2016 one evil
58
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   188
regular expression brought the webpage
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   189
\href{http://stackexchange.com}{Stack Exchange} to its
63
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   190
knees.\footnote{\url{https://stackstatus.net/post/147710624694/outage-postmortem-july-20-2016}}
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   191
In this instance, a regular expression intended to just trim white
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   192
spaces from the beginning and the end of a line actually consumed
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   193
massive amounts of CPU-resources and because of this the web servers
58
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   194
ground to a halt. This happened when a post with 20,000 white spaces was
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   195
submitted, but importantly the white spaces were neither at the
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   196
beginning nor at the end. As a result, the regular expression matching
58
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   197
engine needed to backtrack over many choices. The underlying problem is
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   198
that many ``real life'' regular expression matching engines do not use
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   199
DFAs for matching. This is because they support regular expressions that
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   200
are not covered by the classical automata theory, and in this more
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   201
general setting there are quite a few research questions still
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   202
unanswered and fast algorithms still need to be developed (for example
63
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   203
how to treat bounded repetitions, negation and  back-references
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   204
efficiently).
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   205
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   206
There is also another under-researched problem to do with regular
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   207
expressions and lexing, i.e.~the process of breaking up strings into
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   208
sequences of tokens according to some regular expressions. In this
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   209
setting one is not just interested in whether or not a regular
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   210
expression matches a string, but if it matches also in \emph{how} it
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   211
matches the string.  Consider for example a regular expression
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   212
$r_{key}$ for recognising keywords such as \textit{if}, \textit{then}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   213
and so on; and a regular expression $r_{id}$ for recognising
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   214
identifiers (say, a single character followed by characters or
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   215
numbers). One can then form the compound regular expression
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   216
$(r_{key} + r_{id})^*$ and use it to tokenise strings.  But then how
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   217
should the string \textit{iffoo} be tokenised?  It could be tokenised
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   218
as a keyword followed by an identifier, or the entire string as a
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   219
single identifier.  Similarly, how should the string \textit{if} be
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   220
tokenised? Both regular expressions, $r_{key}$ and $r_{id}$, would
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   221
``fire''---so is it an identifier or a keyword?  While in applications
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   222
there is a well-known strategy to decide these questions, called POSIX
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   223
matching, only relatively recently precise definitions of what POSIX
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   224
matching actually means have been formalised
46
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   225
\cite{AusafDyckhoffUrban2016,OkuiSuzuki2010,Vansummeren2006}. 
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   226
Such a definition has also been given by Sulzmann and  Lu \cite{Sulzmann2014}, but the
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   227
corresponding correctness proof turned out to be  faulty \cite{AusafDyckhoffUrban2016}.
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   228
Roughly, POSIX matching means matching the longest initial substring.
37
17d8e7599a01 new changes
Chengsong
parents: 36
diff changeset
   229
In the case of a tie, the initial submatch is chosen according to some priorities attached to the
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   230
regular expressions (e.g.~keywords have a higher priority than
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   231
identifiers). This sounds rather simple, but according to Grathwohl et
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   232
al \cite[Page 36]{CrashCourse2014} this is not the case. They wrote:
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   233
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   234
\begin{quote}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   235
\it{}``The POSIX strategy is more complicated than the greedy because of 
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   236
the dependence on information about the length of matched strings in the 
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   237
various subexpressions.''
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   238
\end{quote}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   239
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   240
\noindent
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   241
This is also supported by evidence collected by Kuklewicz
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   242
\cite{Kuklewicz} who noticed that a number of POSIX regular expression
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   243
matchers calculate incorrect results.
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   244
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   245
Our focus is on an algorithm introduced by Sulzmann and Lu in 2014 for
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   246
regular expression matching according to the POSIX strategy
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   247
\cite{Sulzmann2014}. Their algorithm is based on an older algorithm by
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   248
Brzozowski from 1964 where he introduced the notion of derivatives of
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   249
regular expressions \cite{Brzozowski1964}. We shall briefly explain
58
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   250
this algorithm next.
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   251
46
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   252
\section{The Algorithm by Brzozowski based on Derivatives of Regular
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   253
Expressions}
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   254
40
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   255
Suppose (basic) regular expressions are given by the following grammar:
38
b5363c0dcd99 half easy changes
Chengsong
parents: 37
diff changeset
   256
\[			r ::=   \ZERO \mid  \ONE
b5363c0dcd99 half easy changes
Chengsong
parents: 37
diff changeset
   257
			 \mid  c  
b5363c0dcd99 half easy changes
Chengsong
parents: 37
diff changeset
   258
			 \mid  r_1 \cdot r_2
b5363c0dcd99 half easy changes
Chengsong
parents: 37
diff changeset
   259
			 \mid  r_1 + r_2   
b5363c0dcd99 half easy changes
Chengsong
parents: 37
diff changeset
   260
			 \mid r^*         
b5363c0dcd99 half easy changes
Chengsong
parents: 37
diff changeset
   261
\]
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   262
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   263
\noindent
46
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   264
The intended meaning of the constructors is as follows: $\ZERO$
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   265
cannot match any string, $\ONE$ can match the empty string, the
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   266
character regular expression $c$ can match the character $c$, and so
40
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   267
on.
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   268
58
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   269
The ingenious contribution by Brzozowski is the notion of
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   270
\emph{derivatives} of regular expressions.  The idea behind this
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   271
notion is as follows: suppose a regular expression $r$ can match a
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   272
string of the form $c\!::\! s$ (that is a list of characters starting
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   273
with $c$), what does the regular expression look like that can match
40
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   274
just $s$? Brzozowski gave a neat answer to this question. He started
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   275
with the definition of $nullable$:
36
Chengsong
parents: 35
diff changeset
   276
\begin{center}
Chengsong
parents: 35
diff changeset
   277
		\begin{tabular}{lcl}
Chengsong
parents: 35
diff changeset
   278
			$\nullable(\ZERO)$     & $\dn$ & $\mathit{false}$ \\  
Chengsong
parents: 35
diff changeset
   279
			$\nullable(\ONE)$      & $\dn$ & $\mathit{true}$ \\
Chengsong
parents: 35
diff changeset
   280
			$\nullable(c)$ 	       & $\dn$ & $\mathit{false}$ \\
Chengsong
parents: 35
diff changeset
   281
			$\nullable(r_1 + r_2)$ & $\dn$ & $\nullable(r_1) \vee \nullable(r_2)$ \\
Chengsong
parents: 35
diff changeset
   282
			$\nullable(r_1\cdot r_2)$  & $\dn$ & $\nullable(r_1) \wedge \nullable(r_2)$ \\
Chengsong
parents: 35
diff changeset
   283
			$\nullable(r^*)$       & $\dn$ & $\mathit{true}$ \\
Chengsong
parents: 35
diff changeset
   284
		\end{tabular}
Chengsong
parents: 35
diff changeset
   285
	\end{center}
38
b5363c0dcd99 half easy changes
Chengsong
parents: 37
diff changeset
   286
This function simply tests whether the empty string is in $L(r)$.
36
Chengsong
parents: 35
diff changeset
   287
He then defined
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   288
the following operation on regular expressions, written
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   289
$r\backslash c$ (the derivative of $r$ w.r.t.~the character $c$):
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   290
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   291
\begin{center}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   292
\begin{tabular}{lcl}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   293
		$\ZERO \backslash c$ & $\dn$ & $\ZERO$\\  
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   294
		$\ONE \backslash c$  & $\dn$ & $\ZERO$\\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   295
		$d \backslash c$     & $\dn$ & 
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   296
		$\mathit{if} \;c = d\;\mathit{then}\;\ONE\;\mathit{else}\;\ZERO$\\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   297
$(r_1 + r_2)\backslash c$     & $\dn$ & $r_1 \backslash c \,+\, r_2 \backslash c$\\
36
Chengsong
parents: 35
diff changeset
   298
$(r_1 \cdot r_2)\backslash c$ & $\dn$ & $\mathit{if} \, nullable(r_1)$\\
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   299
	&   & $\mathit{then}\;(r_1\backslash c) \cdot r_2 \,+\, r_2\backslash c$\\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   300
	&   & $\mathit{else}\;(r_1\backslash c) \cdot r_2$\\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   301
	$(r^*)\backslash c$           & $\dn$ & $(r\backslash c) \cdot r^*$\\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   302
\end{tabular}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   303
\end{center}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   304
46
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   305
%Assuming the classic notion of a
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   306
%\emph{language} of a regular expression, written $L(\_)$, t
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   307
40
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   308
\noindent
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   309
The main property of the derivative operation is that
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   310
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   311
\begin{center}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   312
$c\!::\!s \in L(r)$ holds
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   313
if and only if $s \in L(r\backslash c)$.
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   314
\end{center}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   315
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   316
\noindent
46
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   317
For us the main advantage is that derivatives can be
38
b5363c0dcd99 half easy changes
Chengsong
parents: 37
diff changeset
   318
straightforwardly implemented in any functional programming language,
b5363c0dcd99 half easy changes
Chengsong
parents: 37
diff changeset
   319
and are easily definable and reasoned about in theorem provers---the
b5363c0dcd99 half easy changes
Chengsong
parents: 37
diff changeset
   320
definitions just consist of inductive datatypes and simple recursive
b5363c0dcd99 half easy changes
Chengsong
parents: 37
diff changeset
   321
functions. Moreover, the notion of derivatives can be easily
b5363c0dcd99 half easy changes
Chengsong
parents: 37
diff changeset
   322
generalised to cover extended regular expression constructors such as
b5363c0dcd99 half easy changes
Chengsong
parents: 37
diff changeset
   323
the not-regular expression, written $\neg\,r$, or bounded repetitions
b5363c0dcd99 half easy changes
Chengsong
parents: 37
diff changeset
   324
(for example $r^{\{n\}}$ and $r^{\{n..m\}}$), which cannot be so
b5363c0dcd99 half easy changes
Chengsong
parents: 37
diff changeset
   325
straightforwardly realised within the classic automata approach.
b5363c0dcd99 half easy changes
Chengsong
parents: 37
diff changeset
   326
For the moment however, we focus only on the usual basic regular expressions.
b5363c0dcd99 half easy changes
Chengsong
parents: 37
diff changeset
   327
b5363c0dcd99 half easy changes
Chengsong
parents: 37
diff changeset
   328
40
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   329
Now if we want to find out whether a string $s$ matches with a regular
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   330
expression $r$, build the derivatives of $r$ w.r.t.\ (in succession)
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   331
all the characters of the string $s$. Finally, test whether the
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   332
resulting regular expression can match the empty string.  If yes, then
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   333
$r$ matches $s$, and no in the negative case. To implement this idea
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   334
we can generalise the derivative operation to strings like this:
46
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   335
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   336
\begin{center}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   337
\begin{tabular}{lcl}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   338
$r \backslash (c\!::\!s) $ & $\dn$ & $(r \backslash c) \backslash s$ \\
40
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   339
$r \backslash [\,] $ & $\dn$ & $r$
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   340
\end{tabular}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   341
\end{center}
40
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   342
37
17d8e7599a01 new changes
Chengsong
parents: 36
diff changeset
   343
\noindent
46
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   344
and then define as  regular-expression matching algorithm: 
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   345
\[
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   346
match\;s\;r \;\dn\; nullable(r\backslash s)
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   347
\]
40
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   348
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   349
\noindent
58
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   350
This algorithm can be illustrated graphically as follows
46
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   351
\begin{equation}\label{graph:*}
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   352
\begin{tikzcd}
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   353
r_0 \arrow[r, "\backslash c_0"]  & r_1 \arrow[r, "\backslash c_1"] & r_2 \arrow[r, dashed]  & r_n  \arrow[r,"\textit{nullable}?"] & \;\textrm{YES}/\textrm{NO}
38
b5363c0dcd99 half easy changes
Chengsong
parents: 37
diff changeset
   354
\end{tikzcd}
46
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   355
\end{equation}
40
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   356
8063792920ef proof reading
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   357
\noindent
46
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   358
where we start with  a regular expression  $r_0$, build successive
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   359
derivatives until we exhaust the string and then use \textit{nullable}
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   360
to test whether the result can match the empty string. It can  be
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   361
relatively  easily shown that this matcher is correct  (that is given
58
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   362
an $s$ and a $r$, it generates YES if and only if $s \in L(r)$).
46
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   363
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   364
 
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   365
\section{Values and the Algorithm by Sulzmann and Lu}
38
b5363c0dcd99 half easy changes
Chengsong
parents: 37
diff changeset
   366
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   367
One limitation, however, of Brzozowski's algorithm is that it only
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   368
produces a YES/NO answer for whether a string is being matched by a
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   369
regular expression.  Sulzmann and Lu~\cite{Sulzmann2014} extended this
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   370
algorithm to allow generation of an actual matching, called a
46
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   371
\emph{value}. Values and regular expressions correspond to each 
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   372
other as illustrated in the following table:
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   373
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   374
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   375
\begin{center}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   376
	\begin{tabular}{c@{\hspace{20mm}}c}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   377
		\begin{tabular}{@{}rrl@{}}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   378
			\multicolumn{3}{@{}l}{\textbf{Regular Expressions}}\medskip\\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   379
			$r$ & $::=$  & $\ZERO$\\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   380
			& $\mid$ & $\ONE$   \\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   381
			& $\mid$ & $c$          \\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   382
			& $\mid$ & $r_1 \cdot r_2$\\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   383
			& $\mid$ & $r_1 + r_2$   \\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   384
			\\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   385
			& $\mid$ & $r^*$         \\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   386
		\end{tabular}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   387
		&
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   388
		\begin{tabular}{@{\hspace{0mm}}rrl@{}}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   389
			\multicolumn{3}{@{}l}{\textbf{Values}}\medskip\\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   390
			$v$ & $::=$  & \\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   391
			&        & $\Empty$   \\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   392
			& $\mid$ & $\Char(c)$          \\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   393
			& $\mid$ & $\Seq\,v_1\, v_2$\\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   394
			& $\mid$ & $\Left(v)$   \\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   395
			& $\mid$ & $\Right(v)$  \\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   396
			& $\mid$ & $\Stars\,[v_1,\ldots\,v_n]$ \\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   397
		\end{tabular}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   398
	\end{tabular}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   399
\end{center}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   400
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   401
\noindent
58
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   402
There is no value  corresponding to $\ZERO$; $\Empty$ corresponds to
63
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   403
$\ONE$; $\Char$ to the character regular expression; $\Seq$ to the
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   404
sequence regular expression and so on. The idea of values is to encode
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   405
parse trees. To see this, suppose a \emph{flatten} operation, written
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   406
$|v|$. We use this function to extract the underlying string of a value
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   407
$v$. For example, $|\mathit{Seq} \, (\textit{Char x}) \, (\textit{Char
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   408
y})|$ is the string $xy$.  Using flatten, we can describe how values
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   409
encode parse trees: $\Seq\,v_1\, v_2$ encodes how the string $|v_1| @
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   410
|v_2|$ matches the regex $r_1 \cdot r_2$ whereby $r_1$ matches the
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   411
substring $|v_1|$ and, respectively, $r_2$ matches the substring
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   412
$|v_2|$. Exactly how these two are matched is contained in the
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   413
sub-structure of $v_1$ and $v_2$. 
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   414
59
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   415
 To give a concrete example of how value works, consider the string $xy$
46
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   416
and the regular expression $(x + (y + xy))^*$. We can view this regular
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   417
expression as a tree and if the string $xy$ is matched by two Star
46
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   418
``iterations'', then the $x$ is matched by the left-most alternative in
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   419
this tree and the $y$ by the right-left alternative. This suggests to
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   420
record this matching as
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   421
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   422
\begin{center}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   423
$\Stars\,[\Left\,(\Char\,x), \Right(\Left(\Char\,y))]$
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   424
\end{center}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   425
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   426
\noindent
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   427
where $\Stars$ records how many
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   428
iterations were used; and $\Left$, respectively $\Right$, which
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   429
alternative is used. The value for
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   430
matching $xy$ in a single ``iteration'', i.e.~the POSIX value,
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   431
would look as follows
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   432
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   433
\begin{center}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   434
$\Stars\,[\Seq\,(\Char\,x)\,(\Char\,y)]$
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   435
\end{center}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   436
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   437
\noindent
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   438
where $\Stars$ has only a single-element list for the single iteration
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   439
and $\Seq$ indicates that $xy$ is matched by a sequence regular
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   440
expression.
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   441
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   442
The contribution of Sulzmann and Lu is an extension of Brzozowski's
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   443
algorithm by a second phase (the first phase being building successive
46
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   444
derivatives---see \eqref{graph:*}). In this second phase, a POSIX value 
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   445
is generated assuming the regular expression matches  the string. 
54
4bfd28722884 minor changes
Chengsong
parents: 53
diff changeset
   446
Pictorially, the algorithm is as follows:
46
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   447
59
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   448
\begin{equation}\label{graph:2}
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   449
\begin{tikzcd}
36
Chengsong
parents: 35
diff changeset
   450
r_0 \arrow[r, "\backslash c_0"]  \arrow[d] & r_1 \arrow[r, "\backslash c_1"] \arrow[d] & r_2 \arrow[r, dashed] \arrow[d] & r_n \arrow[d, "mkeps" description] \\
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   451
v_0           & v_1 \arrow[l,"inj_{r_0} c_0"]                & v_2 \arrow[l, "inj_{r_1} c_1"]              & v_n \arrow[l, dashed]         
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   452
\end{tikzcd}
59
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   453
\end{equation}
37
17d8e7599a01 new changes
Chengsong
parents: 36
diff changeset
   454
46
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   455
\noindent
59
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   456
For convenience, we shall employ the following notations: the regular expression we
58
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   457
start with is $r_0$, and the given string $s$ is composed of characters $c_0 c_1
63
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   458
\ldots c_n$. In  the first phase, we build the derivatives $r_1$, $r_2$, \ldots  according to
46
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   459
the characters $c_0$, $c_1$,\ldots  until we exhaust the string and
58
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   460
obtain at the derivative $r_n$. We test whether this derivative is
46
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   461
$\textit{nullable}$ or not. If not, we know the string does not match
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   462
$r$ and no value needs to be generated. If yes, we start building the
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   463
parse tree incrementally by \emph{injecting} back the characters into
58
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   464
the values $v_n, \ldots, v_0$. For this we first call the function
46
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   465
$\textit{mkeps}$, which builds the parse tree for how the empty string
58
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   466
has matched the (nullable) regular expression $r_n$. This function is defined
46
9b48724ec609 proofread
Christian Urban <urbanc@in.tum.de>
parents: 45
diff changeset
   467
as
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   468
51
5df7faf69238 added mkeps and pder, still have not proof read it
Chengsong
parents: 50
diff changeset
   469
	\begin{center}
5df7faf69238 added mkeps and pder, still have not proof read it
Chengsong
parents: 50
diff changeset
   470
		\begin{tabular}{lcl}
5df7faf69238 added mkeps and pder, still have not proof read it
Chengsong
parents: 50
diff changeset
   471
			$\mkeps(\ONE)$ 		& $\dn$ & $\Empty$ \\
5df7faf69238 added mkeps and pder, still have not proof read it
Chengsong
parents: 50
diff changeset
   472
			$\mkeps(r_{1}+r_{2})$	& $\dn$ 
5df7faf69238 added mkeps and pder, still have not proof read it
Chengsong
parents: 50
diff changeset
   473
			& \textit{if} $\nullable(r_{1})$\\ 
5df7faf69238 added mkeps and pder, still have not proof read it
Chengsong
parents: 50
diff changeset
   474
			& & \textit{then} $\Left(\mkeps(r_{1}))$\\ 
5df7faf69238 added mkeps and pder, still have not proof read it
Chengsong
parents: 50
diff changeset
   475
			& & \textit{else} $\Right(\mkeps(r_{2}))$\\
5df7faf69238 added mkeps and pder, still have not proof read it
Chengsong
parents: 50
diff changeset
   476
			$\mkeps(r_1\cdot r_2)$ 	& $\dn$ & $\Seq\,(\mkeps\,r_1)\,(\mkeps\,r_2)$\\
5df7faf69238 added mkeps and pder, still have not proof read it
Chengsong
parents: 50
diff changeset
   477
			$mkeps(r^*)$	        & $\dn$ & $\Stars\,[]$
5df7faf69238 added mkeps and pder, still have not proof read it
Chengsong
parents: 50
diff changeset
   478
		\end{tabular}
5df7faf69238 added mkeps and pder, still have not proof read it
Chengsong
parents: 50
diff changeset
   479
	\end{center}
41
a1f90febbc7f example
Chengsong
parents: 40
diff changeset
   480
59
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   481
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   482
\noindent There are no cases for $\ZERO$ and $c$, since
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   483
these regular expression cannot match the empty string. Note
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   484
also that in case of alternatives we give preference to the
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   485
regular expression on the left-hand side. This will become
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   486
important later on.
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   487
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   488
After this, we inject back the characters one by one in order to build
63
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   489
the parse tree $v_i$ for how the regex $r_i$ matches the string $s_i$
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   490
($s_i = c_i \ldots c_n$ ) from the previous parse tree $v_{i+1}$. After
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   491
injecting back $n$ characters, we get the parse tree for how $r_0$
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   492
matches $s$. For this Sulzmann and Lu defined a function that reverses
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   493
the ``chopping off'' of characters during the derivative phase. The
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   494
corresponding function is called $\textit{inj}$; it takes three
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   495
arguments: the first one is a regular expression ${r_{i-1}}$, before the
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   496
character is chopped off, the second is a character ${c_{i-1}}$, the
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   497
character we want to inject and the third argument is the value
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   498
$textit{v_i}$, into which one wants to inject the character (it
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   499
corresponds to the regular expression after the character has been
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   500
chopped off). The result of this function is a new value. The definition
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   501
of $\textit{inj}$ is as follows: 
59
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   502
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   503
\begin{center}
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   504
\begin{tabular}{l@{\hspace{1mm}}c@{\hspace{1mm}}l}
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   505
  $\textit{inj}\,(c)\,c\,Empty$            & $\dn$ & $Char\,c$\\
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   506
  $\textit{inj}\,(r_1 + r_2)\,c\,\Left(v)$ & $\dn$ & $\Left(\textit{inj}\,r_1\,c\,v)$\\
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   507
  $\textit{inj}\,(r_1 + r_2)\,c\,Right(v)$ & $\dn$ & $Right(\textit{inj}\,r_2\,c\,v)$\\
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   508
  $\textit{inj}\,(r_1 \cdot r_2)\,c\,Seq(v_1,v_2)$ & $\dn$  & $Seq(\textit{inj}\,r_1\,c\,v_1,v_2)$\\
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   509
  $\textit{inj}\,(r_1 \cdot r_2)\,c\,\Left(Seq(v_1,v_2))$ & $\dn$  & $Seq(\textit{inj}\,r_1\,c\,v_1,v_2)$\\
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   510
  $\textit{inj}\,(r_1 \cdot r_2)\,c\,Right(v)$ & $\dn$  & $Seq(\textit{mkeps}(r_1),\textit{inj}\,r_2\,c\,v)$\\
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   511
  $\textit{inj}\,(r^*)\,c\,Seq(v,Stars\,vs)$         & $\dn$  & $Stars((\textit{inj}\,r\,c\,v)\,::\,vs)$\\
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   512
\end{tabular}
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   513
\end{center}
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   514
63
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   515
\noindent This definition is by recursion on the ``shape'' of regular
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   516
expressions and values. To understands this definition better consider
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   517
the situation when we build the derivative on regular expression $r_{i-1}$.
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   518
For this we chop off a character from $r_{i-1}$ to form $r_i$. This leaves a
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   519
``hole'' in $r_i$. In order to calculate a value for $r_{i-1}$, we need to
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   520
locate where that hole is. We can find this location information by
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   521
comparing $r_{i-1}$ and $v_i$. For instance, if $r_{i-1}$ is of shape
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   522
$r_a \cdot r_b$, and $v_i$ is of shape $\textit{Left}(\textit{Seq}(v_a,
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   523
v_b))$, we know immediately that 
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   524
%
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   525
\[ (r_a \cdot r_b)\backslash c = (r_a\backslash c) \cdot r_b \,+\, r_b\backslash c,\]
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   526
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   527
\noindent
59
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   528
otherwise if $r_a$ is not nullable,
63
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   529
\[ (r_a \cdot r_b)\backslash c = (r_a\backslash c) \cdot r_b,\]
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   530
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   531
\noindent
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   532
the value $v_i$ should be of shape $\Seq(\ldots)$, contradicting the fact that
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   533
$v_i$ is actually $\Left(\ldots)$. Furthermore, since $v_i$ is of shape
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   534
$\Left(\ldots)$ instead of $\Right(\ldots)$, we know that the left
59
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   535
branch is taken instead of the right one. We have therefore found out 
63
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   536
that the hole will be on $r_a$. So we recursively call $\inj\, 
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   537
r_a\,c\,v_a$ in order to fill that hole in $v_a$. After injection, the value 
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   538
$v_i$ for $r_i = r_a \cdot r_b$ should be $\Seq\,(\inj\,r_a\,c\,v_a)\,v_b$.
60
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   539
Other clauses can be understood in a similar way.
59
8ff7b7508824 changes1
Chengsong
parents: 58
diff changeset
   540
63
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   541
Let us do some further examples involving $\inj$: Suppose we have the
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   542
regular expression $((((a+b)+ab)+c)+abc)^*$ and want to match it against
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   543
the string $abc$ (when $abc$ is written as a regular expression, the most
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   544
standard way of expressing it should be $a \cdot (b \cdot c)$. We omit
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   545
the parentheses and dots here for readability). By POSIX rules the lexer
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   546
should go for the longest matching, i.e. it should match the string
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   547
$abc$ in one star iteration, using the longest string $abc$ in the
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   548
sub-expression $a+b+ab+c+abc$ (we use $r$ to denote this sub-expression
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   549
for conciseness). Here is how the lexer achieves a parse tree for this
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   550
matching. First, build successive derivatives until we exhaust the
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   551
string, as illustrated here (we simplified some regular expressions like
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   552
$0 \cdot b$ to $0$ for conciseness; we also omit some parentheses if
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   553
they are clear from the context):
60
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   554
%Similarly, we allow
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   555
%$\textit{ALT}$ to take a list of regular expressions as an argument
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   556
%instead of just 2 operands to reduce the nested depth of
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   557
%$\textit{ALT}$
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   558
\begin{center}
63
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   559
\begin{tabular}{lcl}
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   560
$r^*$ & $\xrightarrow{\backslash a}$ & $r_1 = (1+0+1 \cdot b + 0 + 1 \cdot b \cdot c) \cdot r^*$\\
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   561
      & $\xrightarrow{\backslash b}$ & $r_2 = (0+0+1 \cdot 1 + 0 + 1 \cdot 1 \cdot c) \cdot r^* +(0+1+0  + 0 + 0) \cdot r^*$\\
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   562
      & $\xrightarrow{\backslash c}$ & $r_3 = ((0+0+0 + 0 + 1 \cdot 1 \cdot 1) \cdot r^* + (0+0+0  + 1 + 0) \cdot r^*) + $\\ 
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   563
      &                              & $\phantom{r_3 = (} ((0+1+0  + 0 + 0) \cdot r^* + (0+0+0  + 1 + 0) \cdot r^* )$
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   564
\end{tabular}
60
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   565
\end{center}
63
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   566
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   567
\noindent
60
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   568
Now instead when $nullable$ gives a $yes$ on $r_3$, we  call $mkeps$ 
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   569
to construct a parse tree for how $r_3$ matched the string $abc$. 
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   570
$mkeps$ gives the following value $v_3$: 
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   571
\[$Left(Left(Seq(Right(Seq(Empty, Seq(Empty, Empty))), Stars [])))$\]
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   572
The outer 2 $Left$ tells us the first nullable part  hides in the term
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   573
\[((0+0+0 + 0 + 1 \cdot 1 \cdot 1) \cdot r^* \]
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   574
 in \[r_3 = ( \underline{(0+0+0 + 0 + 1 \cdot 1 \cdot 1) \cdot r^*} + (0+0+0  + 1 + 0)
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   575
  \cdot r^*) +((0+1+0  + 0 + 0) \cdot r^*+(0+0+0  + 1 + 0) \cdot r^* )
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   576
 \](underlined). Note that the leftmost location of term \[((0+0+0 + 0 + 1 \cdot 1 \cdot 1) \cdot r^* \]
62
5b10d83b0834 spellcheck
Christian Urban <urbanc@in.tum.de>
parents: 61
diff changeset
   577
 (which corresponds to the initial sub-match $abc$)
60
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   578
  allows $mkeps$ to choose  it as the first candidate that meets the requirement of being $nullable$
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   579
  because $mkeps$ is defined to always choose the left one when nullable.
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   580
  In the case of this example, $abc$ is preferred over $a$ or $ab$.
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   581
   This location is naturally generated by the splitting clause\[
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   582
     (r_1 \cdot r_2)\backslash c  (when \; r_1 \; nullable)) \, = (r_1\backslash c) \cdot r_2 \,+\, r_2\backslash c\].
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   583
       By this clause, we put
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   584
$r_1 \backslash c \cdot r_2 $ at the $\textit{front}$ and $r_2 \backslash c$ at the $\textit{back}$. 
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   585
This allows $mkeps$ to always pick up among two matches the one with a longer initial sub-match.
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   586
 The inside subvalue 
c737a0259194 sorry not all done, need a few more mins for last few changes
Chengsong
parents: 59
diff changeset
   587
 \[$Seq(Right(Seq(Empty, Seq(Empty, Empty))), Stars [])$\]
61
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   588
tells us how about the empty string matches 
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   589
\[(0+0+0 + 0 + 1 \cdot 1 \cdot 1) \cdot r^*  \],
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   590
a sequence of 2 empty regular expressions, the first one is an alternative, we take the rightmost alternative 
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   591
to get that empty regular expression. The second one is a star, which iterates 0 times to form the second
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   592
empty regular expression.
41
a1f90febbc7f example
Chengsong
parents: 40
diff changeset
   593
61
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   594
Using the value $v_3$, the character c, and the regular expression $r_2$, 
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   595
we can recover how $r_2$ matched the string $[c]$ : 
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   596
 $\textit{inj} r_2 c v_3$ gives us\[ v_2 = Left(Seq(Right(Seq(Empty, Seq(Empty, c))), Stars []))\],
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   597
which tells us how $r_2$ matched $c$. After this we inject back the character $b$, and get
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   598
\[ v_1 = Seq(Right(Seq(Empty, Seq(b, c))), Stars [])\]
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   599
 for how 
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   600
 \[r_1= (1+0+1 \cdot b + 0 + 1 \cdot b \cdot c) \cdot r*\]
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   601
  matched  the string $bc$ before it split into 2 pieces. 
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   602
  Finally, after injecting character $a$ back to $v_1$, 
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   603
  we get  the parse tree $v_0= Stars [Right(Seq(a, Seq(b, c)))]$ for how $r$ matched $abc$.
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   604
%We omit the details of injection function, which is provided by Sulzmann and Lu's paper \cite{Sulzmann2014}. 
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   605
Readers might have noticed that the parse tree information 
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   606
is actually already available when doing derivatives. 
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   607
For example, immediately after the operation $\backslash a$ we know that if we want to match a string that starts with $a$,
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   608
 we can either take the initial match to be 
42
Chengsong
parents: 41
diff changeset
   609
\begin{enumerate}
Chengsong
parents: 41
diff changeset
   610
    \item[1)] just $a$ or
Chengsong
parents: 41
diff changeset
   611
    \item[2)] string $ab$ or 
Chengsong
parents: 41
diff changeset
   612
    \item[3)] string $abc$.
Chengsong
parents: 41
diff changeset
   613
\end{enumerate}
61
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   614
In order to differentiate between these choices, 
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   615
we just need to remember their positions--$a$ is on the left, $ab$ is in the middle , and $abc$ is on the right. 
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   616
Which one of these alternatives is chosen later does not affect their relative position because our algorithm 
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   617
does not change this order. If this parsing information can be determined and does
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   618
not change because of later derivatives,
580c7b84f900 hi finished
Chengsong
parents: 60
diff changeset
   619
there is no point in traversing this information twice. This leads to a new approach of lexing-- if we store the information for parse trees  in the corresponding regular expression pieces, update this information when we do derivative operation on them, and collect the information when finished with derivatives and calling $mkeps$ for deciding which branch is POSIX, we can generate the parse tree in one pass, instead of doing an n-step backward transformation.This leads to Sulzmann and Lu's novel idea of using bit-codes on derivatives.
42
Chengsong
parents: 41
diff changeset
   620
63
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   621
In the next section, we shall focus on the bit-coded algorithm and the
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   622
process of simplification of regular expressions. This is needed in
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   623
order to obtain \emph{fast} versions of the Brzozowski's, and Sulzmann
63
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   624
and Lu's algorithms.  This is where the PhD-project aims to advance the
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   625
state-of-the-art.
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   626
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   627
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   628
\section{Simplification of Regular Expressions}
63
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   629
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   630
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   631
Using bit-codes to guide  parsing is not a novel idea. It was applied to
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   632
context free grammars and then adapted by Henglein and Nielson for
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   633
efficient regular expression parsing \cite{nielson11bcre}. Sulzmann and
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   634
Lu took a step further by integrating bitcodes into derivatives.
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   635
63
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   636
The argument for complicating the data structures from basic regular
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   637
expressions to those with bitcodes is that we can introduce
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   638
simplification without making the algorithm crash or overly complex to
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   639
reason about. The reason why we need simplification is due to the
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   640
shortcoming of the previous algorithm. The main drawback of building
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   641
successive derivatives according to Brzozowski's definition is that they
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   642
can grow very quickly in size. This is mainly due to the fact that the
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   643
derivative operation generates often ``useless'' $\ZERO$s and $\ONE$s in
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   644
derivatives.  As a result, if implemented naively both algorithms by
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   645
Brzozowski and by Sulzmann and Lu are excruciatingly slow. For example
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   646
when starting with the regular expression $(a + aa)^*$ and building 12
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   647
successive derivatives w.r.t.~the character $a$, one obtains a
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   648
derivative regular expression with more than 8000 nodes (when viewed as
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   649
a tree). Operations like derivative and $\nullable$ need to traverse
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   650
such trees and consequently the bigger the size of the derivative the
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   651
slower the algorithm. Fortunately, one can simplify regular expressions
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   652
after each derivative step. Various simplifications of regular
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   653
expressions are possible, such as the simplifications of $\ZERO + r$, $r
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   654
+ \ZERO$, $\ONE\cdot r$, $r \cdot \ONE$, and $r + r$ to just $r$. These
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   655
simplifications do not affect the answer for whether a regular
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   656
expression matches a string or not, but fortunately also do not affect
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   657
the POSIX strategy of how regular expressions match strings---although
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   658
the latter is much harder to establish. Some initial results in this
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   659
regard have been obtained in \cite{AusafDyckhoffUrban2016}. However,
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   660
what has not been achieved yet is a very tight bound for the size. Such
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   661
a tight bound is suggested by work of Antimirov who proved that
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   662
(partial) derivatives can be bound by the number of characters contained
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   663
in the initial regular expression \cite{Antimirov95}.
35
f70e9ab4e680 psuedocode added
Chengsong
parents: 34
diff changeset
   664
63
d3c22f809dde more proof-reading
Christian Urban <urbanc@in.tum.de>
parents: 62
diff changeset
   665
Antimirov defined the \emph{partial derivatives} of regular expressions to be this:
35
f70e9ab4e680 psuedocode added
Chengsong
parents: 34
diff changeset
   666
%TODO definition of partial derivatives
52
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   667
\begin{center}
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   668
\begin{tabular}{lcl}
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   669
 $\textit{pder} \; c \; 0$ & $\dn$ & $\emptyset$\\
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   670
 $\textit{pder} \; c \; 1$ & $\dn$ & $\emptyset$ \\
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   671
 $\textit{pder} \; c \; d$ & $\dn$ & $\textit{if} \; c \,=\, d \; \{  1   \}  \; \textit{else} \; \emptyset$ \\ 
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   672
  $\textit{pder} \; c \; r_1+r_2$ & $\dn$ & $pder \; c \; r_1 \cup pder \; c \;  r_2$ \\
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   673
   $\textit{pder} \; c \; r_1 \cdot r_2$ & $\dn$ & $\textit{if} \; nullable \; r_1 \; \{  r \cdot r_2 \mid r \in pder \; c \; r_1   \}  \cup pder \; c \; r_2 \; \textit{else} \; \{  r \cdot r_2 \mid r \in pder \; c \; r_1   \} $ \\ 
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   674
     $\textit{pder} \; c \; r^*$ & $\dn$ & $ \{  r' \cdot r^* \mid r' \in pder \; c \; r   \}  $ \\  
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   675
 \end{tabular}
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   676
 \end{center}
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   677
35
f70e9ab4e680 psuedocode added
Chengsong
parents: 34
diff changeset
   678
f70e9ab4e680 psuedocode added
Chengsong
parents: 34
diff changeset
   679
it is essentially a set of regular expressions that come from the sub-structure of the original regular expression. 
f70e9ab4e680 psuedocode added
Chengsong
parents: 34
diff changeset
   680
Antimirov has proved a nice size bound of the size of partial derivatives. Roughly speaking the size will not exceed the fourth power of the number of nodes in that regular expression.  Interestingly, we observed from experiment that after the simplification step, our regular expression has the same size or is smaller than the partial derivatives. This allows us to prove a tight bound on the size of regular expression during the running time of the algorithm if we can establish the connection between our simplification rules and partial derivatives.
f70e9ab4e680 psuedocode added
Chengsong
parents: 34
diff changeset
   681
f70e9ab4e680 psuedocode added
Chengsong
parents: 34
diff changeset
   682
 %We believe, and have generated test
f70e9ab4e680 psuedocode added
Chengsong
parents: 34
diff changeset
   683
%data, that a similar bound can be obtained for the derivatives in
f70e9ab4e680 psuedocode added
Chengsong
parents: 34
diff changeset
   684
%Sulzmann and Lu's algorithm. Let us give some details about this next.
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   685
43
Chengsong
parents: 42
diff changeset
   686
Bit-codes look like this:
Chengsong
parents: 42
diff changeset
   687
\[			b ::=   S \mid  Z \; \;\;
Chengsong
parents: 42
diff changeset
   688
bs ::= [] \mid b:bs    
Chengsong
parents: 42
diff changeset
   689
\]
Chengsong
parents: 42
diff changeset
   690
They are just a string of bits, the names "S" and "Z"  here are kind of arbitrary, we can use 0 and 1 or binary symbol to substitute them. They are a compact form of parse trees.
Chengsong
parents: 42
diff changeset
   691
Here is how values and bit-codes are related:
Chengsong
parents: 42
diff changeset
   692
Bitcodes are essentially incomplete values.
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   693
This can be straightforwardly seen in the following transformation: 
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   694
\begin{center}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   695
\begin{tabular}{lcl}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   696
  $\textit{code}(\Empty)$ & $\dn$ & $[]$\\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   697
  $\textit{code}(\Char\,c)$ & $\dn$ & $[]$\\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   698
  $\textit{code}(\Left\,v)$ & $\dn$ & $\Z :: code(v)$\\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   699
  $\textit{code}(\Right\,v)$ & $\dn$ & $\S :: code(v)$\\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   700
  $\textit{code}(\Seq\,v_1\,v_2)$ & $\dn$ & $code(v_1) \,@\, code(v_2)$\\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   701
  $\textit{code}(\Stars\,[])$ & $\dn$ & $[\S]$\\
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   702
  $\textit{code}(\Stars\,(v\!::\!vs))$ & $\dn$ & $\Z :: code(v) \;@\;
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   703
                                                 code(\Stars\,vs)$
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   704
\end{tabular}    
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   705
\end{center} 
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   706
where $\Z$ and $\S$ are arbitrary names for the bits in the
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   707
bitsequences. 
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   708
Here code encodes a value into a bitsequence by converting Left into $\Z$, Right into $\S$, the start point of a non-empty star iteration into $\S$, and the border where a local star terminates into $\Z$. This conversion is apparently lossy, as it throws away the character information, and does not decode the boundary between the two operands of the sequence constructor. Moreover, with only the bitcode we cannot even tell whether the $\S$s and $\Z$s are for $Left/Right$ or $Stars$. The reason for choosing this compact way of storing information is that the relatively small size of bits can be easily moved around during the lexing process. In order to recover the bitcode back into values, we will need the regular expression as the extra information and decode them back into value:\\
37
17d8e7599a01 new changes
Chengsong
parents: 36
diff changeset
   709
%\begin{definition}[Bitdecoding of Values]\mbox{}
36
Chengsong
parents: 35
diff changeset
   710
\begin{center}
Chengsong
parents: 35
diff changeset
   711
\begin{tabular}{@{}l@{\hspace{1mm}}c@{\hspace{1mm}}l@{}}
Chengsong
parents: 35
diff changeset
   712
  $\textit{decode}'\,bs\,(\ONE)$ & $\dn$ & $(\Empty, bs)$\\
Chengsong
parents: 35
diff changeset
   713
  $\textit{decode}'\,bs\,(c)$ & $\dn$ & $(\Char\,c, bs)$\\
Chengsong
parents: 35
diff changeset
   714
  $\textit{decode}'\,(\Z\!::\!bs)\;(r_1 + r_2)$ & $\dn$ &
Chengsong
parents: 35
diff changeset
   715
     $\textit{let}\,(v, bs_1) = \textit{decode}'\,bs\,r_1\;\textit{in}\;
Chengsong
parents: 35
diff changeset
   716
       (\Left\,v, bs_1)$\\
Chengsong
parents: 35
diff changeset
   717
  $\textit{decode}'\,(\S\!::\!bs)\;(r_1 + r_2)$ & $\dn$ &
Chengsong
parents: 35
diff changeset
   718
     $\textit{let}\,(v, bs_1) = \textit{decode}'\,bs\,r_2\;\textit{in}\;
Chengsong
parents: 35
diff changeset
   719
       (\Right\,v, bs_1)$\\                           
Chengsong
parents: 35
diff changeset
   720
  $\textit{decode}'\,bs\;(r_1\cdot r_2)$ & $\dn$ &
Chengsong
parents: 35
diff changeset
   721
        $\textit{let}\,(v_1, bs_1) = \textit{decode}'\,bs\,r_1\;\textit{in}$\\
Chengsong
parents: 35
diff changeset
   722
  & &   $\textit{let}\,(v_2, bs_2) = \textit{decode}'\,bs_1\,r_2$\\
Chengsong
parents: 35
diff changeset
   723
  & &   \hspace{35mm}$\textit{in}\;(\Seq\,v_1\,v_2, bs_2)$\\
Chengsong
parents: 35
diff changeset
   724
  $\textit{decode}'\,(\Z\!::\!bs)\,(r^*)$ & $\dn$ & $(\Stars\,[], bs)$\\
Chengsong
parents: 35
diff changeset
   725
  $\textit{decode}'\,(\S\!::\!bs)\,(r^*)$ & $\dn$ & 
Chengsong
parents: 35
diff changeset
   726
         $\textit{let}\,(v, bs_1) = \textit{decode}'\,bs\,r\;\textit{in}$\\
Chengsong
parents: 35
diff changeset
   727
  & &   $\textit{let}\,(\Stars\,vs, bs_2) = \textit{decode}'\,bs_1\,r^*$\\
Chengsong
parents: 35
diff changeset
   728
  & &   \hspace{35mm}$\textit{in}\;(\Stars\,v\!::\!vs, bs_2)$\bigskip\\
Chengsong
parents: 35
diff changeset
   729
  
Chengsong
parents: 35
diff changeset
   730
  $\textit{decode}\,bs\,r$ & $\dn$ &
Chengsong
parents: 35
diff changeset
   731
     $\textit{let}\,(v, bs') = \textit{decode}'\,bs\,r\;\textit{in}$\\
Chengsong
parents: 35
diff changeset
   732
  & & $\textit{if}\;bs' = []\;\textit{then}\;\textit{Some}\,v\;
Chengsong
parents: 35
diff changeset
   733
       \textit{else}\;\textit{None}$                       
Chengsong
parents: 35
diff changeset
   734
\end{tabular}    
Chengsong
parents: 35
diff changeset
   735
\end{center}    
37
17d8e7599a01 new changes
Chengsong
parents: 36
diff changeset
   736
%\end{definition}
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   737
43
Chengsong
parents: 42
diff changeset
   738
53
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   739
Sulzmann and Lu's integrated the bitcodes into annotated regular expressions by attaching them to the head of every substructure of a regular expression\cite{Sulzmann2014}. They are
43
Chengsong
parents: 42
diff changeset
   740
defined by the following grammar:
Chengsong
parents: 42
diff changeset
   741
Chengsong
parents: 42
diff changeset
   742
\begin{center}
Chengsong
parents: 42
diff changeset
   743
\begin{tabular}{lcl}
Chengsong
parents: 42
diff changeset
   744
  $\textit{a}$ & $::=$  & $\textit{ZERO}$\\
Chengsong
parents: 42
diff changeset
   745
                  & $\mid$ & $\textit{ONE}\;\;bs$\\
Chengsong
parents: 42
diff changeset
   746
                  & $\mid$ & $\textit{CHAR}\;\;bs\,c$\\
Chengsong
parents: 42
diff changeset
   747
                  & $\mid$ & $\textit{ALTS}\;\;bs\,as$\\
Chengsong
parents: 42
diff changeset
   748
                  & $\mid$ & $\textit{SEQ}\;\;bs\,a_1\,a_2$\\
Chengsong
parents: 42
diff changeset
   749
                  & $\mid$ & $\textit{STAR}\;\;bs\,a$
Chengsong
parents: 42
diff changeset
   750
\end{tabular}    
Chengsong
parents: 42
diff changeset
   751
\end{center}  
Chengsong
parents: 42
diff changeset
   752
Chengsong
parents: 42
diff changeset
   753
\noindent
Chengsong
parents: 42
diff changeset
   754
where $bs$ stands for bitsequences, and $as$ (in \textit{ALTS}) for a
Chengsong
parents: 42
diff changeset
   755
list of annotated regular expressions. These bitsequences encode
Chengsong
parents: 42
diff changeset
   756
information about the (POSIX) value that should be generated by the
Chengsong
parents: 42
diff changeset
   757
Sulzmann and Lu algorithm. 
Chengsong
parents: 42
diff changeset
   758
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   759
To do lexing using annotated regular expressions, we shall first transform the
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   760
usual (un-annotated) regular expressions into annotated regular
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   761
expressions:\\
37
17d8e7599a01 new changes
Chengsong
parents: 36
diff changeset
   762
%\begin{definition}
36
Chengsong
parents: 35
diff changeset
   763
\begin{center}
Chengsong
parents: 35
diff changeset
   764
\begin{tabular}{lcl}
Chengsong
parents: 35
diff changeset
   765
  $(\ZERO)^\uparrow$ & $\dn$ & $\textit{ZERO}$\\
Chengsong
parents: 35
diff changeset
   766
  $(\ONE)^\uparrow$ & $\dn$ & $\textit{ONE}\,[]$\\
Chengsong
parents: 35
diff changeset
   767
  $(c)^\uparrow$ & $\dn$ & $\textit{CHAR}\,[]\,c$\\
Chengsong
parents: 35
diff changeset
   768
  $(r_1 + r_2)^\uparrow$ & $\dn$ &
Chengsong
parents: 35
diff changeset
   769
         $\textit{ALT}\;[]\,(\textit{fuse}\,[\Z]\,r_1^\uparrow)\,
Chengsong
parents: 35
diff changeset
   770
                            (\textit{fuse}\,[\S]\,r_2^\uparrow)$\\
Chengsong
parents: 35
diff changeset
   771
  $(r_1\cdot r_2)^\uparrow$ & $\dn$ &
Chengsong
parents: 35
diff changeset
   772
         $\textit{SEQ}\;[]\,r_1^\uparrow\,r_2^\uparrow$\\
Chengsong
parents: 35
diff changeset
   773
  $(r^*)^\uparrow$ & $\dn$ &
Chengsong
parents: 35
diff changeset
   774
         $\textit{STAR}\;[]\,r^\uparrow$\\
Chengsong
parents: 35
diff changeset
   775
\end{tabular}    
Chengsong
parents: 35
diff changeset
   776
\end{center}    
37
17d8e7599a01 new changes
Chengsong
parents: 36
diff changeset
   777
%\end{definition}
44
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   778
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   779
Here $fuse$ is an auxiliary  function that helps to attach bits to the front of an annotated regular expression. Its definition goes as follows:
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   780
\begin{center}
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   781
\begin{tabular}{lcl}
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   782
  $\textit{fuse}\,bs\,(\textit{ZERO})$ & $\dn$ & $\textit{ZERO}$\\
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   783
  $\textit{fuse}\,bs\,(\textit{ONE}\,bs')$ & $\dn$ &
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   784
     $\textit{ONE}\,(bs\,@\,bs')$\\
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   785
  $\textit{fuse}\,bs\,(\textit{CHAR}\,bs'\,c)$ & $\dn$ &
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   786
     $\textit{CHAR}\,(bs\,@\,bs')\,c$\\
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   787
  $\textit{fuse}\,bs\,(\textit{ALT}\,bs'\,a_1\,a_2)$ & $\dn$ &
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   788
     $\textit{ALT}\,(bs\,@\,bs')\,a_1\,a_2$\\
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   789
  $\textit{fuse}\,bs\,(\textit{SEQ}\,bs'\,a_1\,a_2)$ & $\dn$ &
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   790
     $\textit{SEQ}\,(bs\,@\,bs')\,a_1\,a_2$\\
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   791
  $\textit{fuse}\,bs\,(\textit{STAR}\,bs'\,a)$ & $\dn$ &
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   792
     $\textit{STAR}\,(bs\,@\,bs')\,a$
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   793
\end{tabular}    
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   794
\end{center}  
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   795
43
Chengsong
parents: 42
diff changeset
   796
After internalise we do successive derivative operations on the annotated regular expression.
44
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   797
 This derivative operation is the same as what we previously have for the simple regular expressions, except that we take special care of the bits :\\
37
17d8e7599a01 new changes
Chengsong
parents: 36
diff changeset
   798
%\begin{definition}{bder}
36
Chengsong
parents: 35
diff changeset
   799
\begin{center}
Chengsong
parents: 35
diff changeset
   800
  \begin{tabular}{@{}lcl@{}}
Chengsong
parents: 35
diff changeset
   801
  $(\textit{ZERO})\backslash c$ & $\dn$ & $\textit{ZERO}$\\  
Chengsong
parents: 35
diff changeset
   802
  $(\textit{ONE}\;bs)\backslash c$ & $\dn$ & $\textit{ZERO}$\\  
Chengsong
parents: 35
diff changeset
   803
  $(\textit{CHAR}\;bs\,d)\backslash c$ & $\dn$ &
Chengsong
parents: 35
diff changeset
   804
        $\textit{if}\;c=d\; \;\textit{then}\;
Chengsong
parents: 35
diff changeset
   805
         \textit{ONE}\;bs\;\textit{else}\;\textit{ZERO}$\\  
Chengsong
parents: 35
diff changeset
   806
  $(\textit{ALT}\;bs\,a_1\,a_2)\backslash c$ & $\dn$ &
Chengsong
parents: 35
diff changeset
   807
        $\textit{ALT}\,bs\,(a_1\backslash c)\,(a_2\backslash c)$\\
Chengsong
parents: 35
diff changeset
   808
  $(\textit{SEQ}\;bs\,a_1\,a_2)\backslash c$ & $\dn$ &
Chengsong
parents: 35
diff changeset
   809
     $\textit{if}\;\textit{bnullable}\,a_1$\\
Chengsong
parents: 35
diff changeset
   810
  & &$\textit{then}\;\textit{ALT}\,bs\,(\textit{SEQ}\,[]\,(a_1\backslash c)\,a_2)$\\
Chengsong
parents: 35
diff changeset
   811
  & &$\phantom{\textit{then}\;\textit{ALT}\,bs\,}(\textit{fuse}\,(\textit{bmkeps}\,a_1)\,(a_2\backslash c))$\\
Chengsong
parents: 35
diff changeset
   812
  & &$\textit{else}\;\textit{SEQ}\,bs\,(a_1\backslash c)\,a_2$\\
Chengsong
parents: 35
diff changeset
   813
  $(\textit{STAR}\,bs\,a)\backslash c$ & $\dn$ &
Chengsong
parents: 35
diff changeset
   814
      $\textit{SEQ}\;bs\,(\textit{fuse}\, [\Z] (r\backslash c))\,
Chengsong
parents: 35
diff changeset
   815
       (\textit{STAR}\,[]\,r)$
Chengsong
parents: 35
diff changeset
   816
\end{tabular}    
Chengsong
parents: 35
diff changeset
   817
\end{center}    
37
17d8e7599a01 new changes
Chengsong
parents: 36
diff changeset
   818
%\end{definition}
44
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   819
For instance, when we unfold $STAR \; bs \; a$ into a sequence, we attach an additional bit Z to the front of $r \backslash c$ to indicate that there is one more star iteration. 
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   820
The other example, the $SEQ$ clause is more subtle-- when $a_1$ is $bnullable$(here bnullable is exactly the same as nullable, except that it is for annotated regular expressions, therefore we omit the definition).
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   821
Assume that $bmkeps$ correctly extracts the bitcode for how $a_1$ matches the string prior to character c(more on this later), then the right branch of $ALTS$, which is $fuse \; bmkeps \;  a_1 (a_2 \backslash c)$ will collapse the regular expression $a_1$(as it has already been fully matched) and store the parsing information at the head of the regular expression $a_2 \backslash c$ by fusing to it. The bitsequence $bs$, which was initially attached to the head of $SEQ$, has now been elevated to the top-level of ALT,
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   822
as this information will be needed whichever way the $SEQ$ is matched--no matter whether c belongs to $a_1$ or $ a_2$.
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   823
After carefully doing these derivatives and maintaining all the parsing information, we complete the parsing by collecting the bits using a special $mkeps$ function for annotated regular expressions--$bmkeps$:
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   824
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   825
37
17d8e7599a01 new changes
Chengsong
parents: 36
diff changeset
   826
%\begin{definition}[\textit{bmkeps}]\mbox{}
36
Chengsong
parents: 35
diff changeset
   827
\begin{center}
Chengsong
parents: 35
diff changeset
   828
\begin{tabular}{lcl}
Chengsong
parents: 35
diff changeset
   829
  $\textit{bmkeps}\,(\textit{ONE}\,bs)$ & $\dn$ & $bs$\\
Chengsong
parents: 35
diff changeset
   830
  $\textit{bmkeps}\,(\textit{ALT}\,bs\,a_1\,a_2)$ & $\dn$ &
Chengsong
parents: 35
diff changeset
   831
     $\textit{if}\;\textit{bnullable}\,a_1$\\
Chengsong
parents: 35
diff changeset
   832
  & &$\textit{then}\;bs\,@\,\textit{bmkeps}\,a_1$\\
Chengsong
parents: 35
diff changeset
   833
  & &$\textit{else}\;bs\,@\,\textit{bmkeps}\,a_2$\\
Chengsong
parents: 35
diff changeset
   834
  $\textit{bmkeps}\,(\textit{SEQ}\,bs\,a_1\,a_2)$ & $\dn$ &
Chengsong
parents: 35
diff changeset
   835
     $bs \,@\,\textit{bmkeps}\,a_1\,@\, \textit{bmkeps}\,a_2$\\
Chengsong
parents: 35
diff changeset
   836
  $\textit{bmkeps}\,(\textit{STAR}\,bs\,a)$ & $\dn$ &
Chengsong
parents: 35
diff changeset
   837
     $bs \,@\, [\S]$
Chengsong
parents: 35
diff changeset
   838
\end{tabular}    
Chengsong
parents: 35
diff changeset
   839
\end{center}    
37
17d8e7599a01 new changes
Chengsong
parents: 36
diff changeset
   840
%\end{definition}
44
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   841
This function completes the parse tree information by 
45
60cb82639691 spell check
Christian Urban <urbanc@in.tum.de>
parents: 44
diff changeset
   842
travelling along the path on the regular expression that corresponds to a POSIX value snd collect all the bits, and
44
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   843
using S to indicate the end of star iterations. If we take the bitsproduced by $bmkeps$ and decode it, 
4d674a971852 another changes. have written more. but havent typed them. tomorrow will continue.
Chengsong
parents: 43
diff changeset
   844
we get the parse tree we need, the working flow looks like this:\\
37
17d8e7599a01 new changes
Chengsong
parents: 36
diff changeset
   845
\begin{center}
17d8e7599a01 new changes
Chengsong
parents: 36
diff changeset
   846
\begin{tabular}{lcl}
17d8e7599a01 new changes
Chengsong
parents: 36
diff changeset
   847
  $\textit{blexer}\;r\,s$ & $\dn$ &
17d8e7599a01 new changes
Chengsong
parents: 36
diff changeset
   848
      $\textit{let}\;a = (r^\uparrow)\backslash s\;\textit{in}$\\                
17d8e7599a01 new changes
Chengsong
parents: 36
diff changeset
   849
  & & $\;\;\textit{if}\; \textit{bnullable}(a)$\\
17d8e7599a01 new changes
Chengsong
parents: 36
diff changeset
   850
  & & $\;\;\textit{then}\;\textit{decode}\,(\textit{bmkeps}\,a)\,r$\\
17d8e7599a01 new changes
Chengsong
parents: 36
diff changeset
   851
  & & $\;\;\textit{else}\;\textit{None}$
17d8e7599a01 new changes
Chengsong
parents: 36
diff changeset
   852
\end{tabular}
17d8e7599a01 new changes
Chengsong
parents: 36
diff changeset
   853
\end{center}
53
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   854
Here $(r^\uparrow)\backslash s$ is similar to what we have previously defined for 
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   855
$r\backslash s$.
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   856
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   857
The main point of the bitsequences and annotated regular expressions
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   858
is that we can apply rather aggressive (in terms of size)
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   859
simplification rules in order to keep derivatives small.  
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   860
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   861
We have
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   862
developed such ``aggressive'' simplification rules and generated test
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   863
data that show that the expected bound can be achieved. Obviously we
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   864
could only partially cover  the search space as there are infinitely
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   865
many regular expressions and strings. One modification we introduced
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   866
is to allow a list of annotated regular expressions in the
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   867
\textit{ALTS} constructor. This allows us to not just delete
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   868
unnecessary $\ZERO$s and $\ONE$s from regular expressions, but also
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   869
unnecessary ``copies'' of regular expressions (very similar to
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   870
simplifying $r + r$ to just $r$, but in a more general
35
f70e9ab4e680 psuedocode added
Chengsong
parents: 34
diff changeset
   871
setting). 
49
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   872
Another modification is that we use simplification rules
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   873
inspired by Antimirov's work on partial derivatives. They maintain the
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   874
idea that only the first ``copy'' of a regular expression in an
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   875
alternative contributes to the calculation of a POSIX value. All
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   876
subsequent copies can be pruned from the regular expression.
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   877
52
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   878
A recursive definition of simplification function that looks similar to scala code is given below:\\
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   879
\begin{center}
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   880
  \begin{tabular}{@{}lcl@{}}
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   881
  $\textit{simp} \; a$ & $\dn$ & $\textit{a} \; \textit{if} \; a  =  (\textit{ONE} \; bs) \; or\; (\textit{CHAR} \, bs \; c) \; or\; (\textit{STAR}\; bs\; a_1)$\\  
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   882
  
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   883
  $\textit{simp} \; \textit{SEQ}\;bs\,a_1\,a_2$ & $\dn$ & $ (\textit{simp} \; a_1, \textit{simp}  \; a_2) \; \textit{match} $ \\
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   884
  &&$\textit{case} \; (0, \_) \Rightarrow  0$ \\
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   885
   &&$ \textit{case} \; (\_, 0) \Rightarrow  0$ \\
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   886
   &&$ \textit{case} \;  (1, a_2') \Rightarrow  \textit{fuse} \; bs \;  a_2'$ \\
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   887
   &&$ \textit{case} \; (a_1', 1) \Rightarrow  \textit{fuse} \; bs \;  a_1'$ \\
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   888
   &&$ \textit{case} \; (a_1', a_2') \Rightarrow  \textit{SEQ} \; bs \; a_1' \;  a_2'$ \\
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   889
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   890
  $\textit{simp} \; \textit{ALT}\;bs\,as$ & $\dn$ & $\textit{ distinct}( \textit{flatten} ( \textit{map simp as})) \; \textit{match} $ \\
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   891
  &&$\textit{case} \; [] \Rightarrow  0$ \\
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   892
   &&$ \textit{case} \; a :: [] \Rightarrow  \textit{fuse bs a}$ \\
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   893
   &&$ \textit{case} \;  as' \Rightarrow  \textit{ALT bs as'}$ 
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   894
\end{tabular}    
25bbbb8b0e90 just in case of some accidents from erasing my work
Chengsong
parents: 51
diff changeset
   895
\end{center}    
47
d2a7e87ea6e1 will not compile, just text
Chengsong
parents: 46
diff changeset
   896
d2a7e87ea6e1 will not compile, just text
Chengsong
parents: 46
diff changeset
   897
The simplification does a pattern matching on the regular expression. When it detected that
d2a7e87ea6e1 will not compile, just text
Chengsong
parents: 46
diff changeset
   898
the regular expression is an alternative or sequence, it will try to simplify its children regular expressions
d2a7e87ea6e1 will not compile, just text
Chengsong
parents: 46
diff changeset
   899
recursively and then see if one of the children turn into 0 or 1, which might trigger further simplification
d2a7e87ea6e1 will not compile, just text
Chengsong
parents: 46
diff changeset
   900
 at the current level. The most involved part is the ALTS clause, where we use two auxiliary functions 
d2a7e87ea6e1 will not compile, just text
Chengsong
parents: 46
diff changeset
   901
 flatten and distinct to open up nested ALT and reduce as many duplicates as possible.
48
bbefcf7351f2 still will not compile
Chengsong
parents: 47
diff changeset
   902
 Function distinct  keeps the first occurring copy only and remove all later ones when detected duplicates.
bbefcf7351f2 still will not compile
Chengsong
parents: 47
diff changeset
   903
 Function flatten opens up nested ALT. Its recursive definition is given below:
53
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   904
 \begin{center}
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   905
  \begin{tabular}{@{}lcl@{}}
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   906
  $\textit{flatten} \; (\textit{ALT}\;bs\,as) :: as'$ & $\dn$ & $(\textit{ map fuse}( \textit{bs, \_} )  \textit{ as}) \; +\!+ \; \textit{flatten} \; as' $ \\
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   907
  $\textit{flatten} \; \textit{ZERO} :: as'$ & $\dn$ & $ \textit{flatten} \;  as' $ \\
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   908
    $\textit{flatten} \; a :: as'$ & $\dn$ & $a :: \textit{flatten} \; as' $ 
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   909
\end{tabular}    
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   910
\end{center}  
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   911
48
bbefcf7351f2 still will not compile
Chengsong
parents: 47
diff changeset
   912
 Here flatten behaves like the traditional functional programming flatten function,
bbefcf7351f2 still will not compile
Chengsong
parents: 47
diff changeset
   913
 what it does is basically removing parentheses like changing $a+(b+c)$ into $a+b+c$.
47
d2a7e87ea6e1 will not compile, just text
Chengsong
parents: 46
diff changeset
   914
53
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   915
Suppose we apply simplification after each derivative step,
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   916
and view these two operations as an atomic one: $a \backslash_{simp} c \dn \textit{simp}(a \backslash c)$.
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   917
Then we can use the previous natural extension from derivative w.r.t   character to derivative w.r.t string:
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   918
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   919
\begin{center}
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   920
\begin{tabular}{lcl}
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   921
$r \backslash_{simp} (c\!::\!s) $ & $\dn$ & $(r \backslash_{simp} c) \backslash_{simp} s$ \\
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   922
$r \backslash [\,] $ & $\dn$ & $r$
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   923
\end{tabular}
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   924
\end{center}
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   925
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   926
 we get an optimized version of the algorithm:
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   927
\begin{center}
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   928
\begin{tabular}{lcl}
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   929
  $\textit{blexer\_simp}\;r\,s$ & $\dn$ &
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   930
      $\textit{let}\;a = (r^\uparrow)\backslash_{simp} s\;\textit{in}$\\                
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   931
  & & $\;\;\textit{if}\; \textit{bnullable}(a)$\\
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   932
  & & $\;\;\textit{then}\;\textit{decode}\,(\textit{bmkeps}\,a)\,r$\\
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   933
  & & $\;\;\textit{else}\;\textit{None}$
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   934
\end{tabular}
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   935
\end{center}
48
bbefcf7351f2 still will not compile
Chengsong
parents: 47
diff changeset
   936
bbefcf7351f2 still will not compile
Chengsong
parents: 47
diff changeset
   937
This algorithm effectively keeps the regular expression size small, for example,
bbefcf7351f2 still will not compile
Chengsong
parents: 47
diff changeset
   938
with this simplification our previous $(a + aa)^*$ example's 8000 nodes will be reduced to only 6 and stay constant, however long the input string is.
35
f70e9ab4e680 psuedocode added
Chengsong
parents: 34
diff changeset
   939
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   940
35
f70e9ab4e680 psuedocode added
Chengsong
parents: 34
diff changeset
   941
49
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   942
We are currently engaged in 2 tasks related to this algorithm. 
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   943
The first one is proving that our simplification rules
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   944
actually do not affect the POSIX value that should be generated by the
49
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   945
algorithm according to the specification of a POSIX value
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   946
 and furthermore obtain a much
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   947
tighter bound on the sizes of derivatives. The result is that our
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   948
algorithm should be correct and faster on all inputs.  The original
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   949
blow-up, as observed in JavaScript, Python and Java, would be excluded
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   950
from happening in our algorithm.For
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   951
this proof we use the theorem prover Isabelle. Once completed, this
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   952
result will advance the state-of-the-art: Sulzmann and Lu wrote in
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   953
their paper \cite{Sulzmann2014} about the bitcoded ``incremental
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   954
parsing method'' (that is the matching algorithm outlined in this
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   955
section):
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   956
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   957
\begin{quote}\it
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   958
  ``Correctness Claim: We further claim that the incremental parsing
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   959
  method in Figure~5 in combination with the simplification steps in
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   960
  Figure 6 yields POSIX parse trees. We have tested this claim
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   961
  extensively by using the method in Figure~3 as a reference but yet
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   962
  have to work out all proof details.''
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   963
\end{quote}  
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   964
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   965
\noindent
49
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   966
We would settle the correctness claim.
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   967
It is relatively straightforward to establish that after 1 simplification step, the part of derivative that corresponds to a POSIX value remains intact and can still be collected, in other words,
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   968
bmkeps r = bmkeps simp r
58
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   969
as this basically comes down to proving actions like removing the additional $r$ in $r+r$  does not delete important POSIX information in a regular expression.
49
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   970
The hardcore of this problem is to prove that
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   971
bmkeps bders r = bmkeps bders simp r
62
5b10d83b0834 spellcheck
Christian Urban <urbanc@in.tum.de>
parents: 61
diff changeset
   972
That is, if we do derivative on regular expression r and the simplified version for, they can still prove the same POSIX value if there is one . This is not as straightforward as the previous proposition, as the two regular expression r and simp r  might become very different regular expressions after repeated application ofd simp and derivative.
49
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   973
The crucial point is to find the "gene" of a regular expression and how it is kept intact during simplification.
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   974
To aid this, we are utilizing the helping function retrieve described by Sulzmann and Lu:
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   975
\\definition of retrieve\\
58
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   976
 This function assembled the bitcode that corresponds to a parse tree for how the current derivative matches the suffix of the string(the characters that have not yet appeared, but is stored in the value).
49
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   977
 Sulzmann and Lu used this to connect the bit-coded algorithm to the older algorithm by the following equation:\\
53
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   978
 $inj \;a\; c \; v = \textit{decode} \; (\textit{retrieve}\; ((\textit{internalise}\; r)\backslash_{simp} c) v)$\\
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   979
 A little fact that needs to be stated to help comprehension:\\
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   980
 $r^\uparrow = a$($a$ stands for $annotated$).\\
58
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   981
 Fahad and Christian also used this fact to prove  the correctness of bit-coded algorithm without simplification.
50
866eda9ba66a now will compile
Chengsong
parents: 49
diff changeset
   982
 Our purpose of using this, however, is try to establish \\
53
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   983
$ \textit{retrieve} \; a \; v \;=\; \textit{retrieve}  \; \textit{simp}(a) \; v'.$\\
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   984
 The idea is that using $v'$,
58
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   985
  a simplified version of $v$ that possibly had gone through the same simplification step as $\textit{simp}(a)$ we are still  able to extract the bitsequence that gives the same parsing information as the unsimplified one.
53
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   986
 After establishing this, we might be able to finally bridge the gap of proving\\
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   987
 $\textit{retrieve} \; r   \backslash  s \; v = \;\textit{retrieve} \; \textit{simp}(r)  \backslash  s \; v'$\\
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   988
 and subsequently\\
3ec403f650a8 readable version
Chengsong
parents: 52
diff changeset
   989
 $\textit{retrieve} \; r \backslash  s \; v\; = \; \textit{retrieve} \; r  \backslash_{simp}   s \; v'$.\\
58
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   990
 This proves that our simplified version of regular expression still contains all the bitcodes needed.
49
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   991
58
f0360e17080e proofread
Christian Urban <urbanc@in.tum.de>
parents: 57
diff changeset
   992
The second task is to speed up the more aggressive simplification. Currently it is slower than a naive simplification(the naive version as implemented in ADU of course can explode in some cases).
49
d256aabe88f3 still wont comiple hhh
Chengsong
parents: 48
diff changeset
   993
So it needs to be explored how to make it faster. Our possibility would be to explore again the connection to DFAs. This is very much work in progress.
30
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   994
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   995
\section{Conclusion}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   996
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   997
In this PhD-project we are interested in fast algorithms for regular
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   998
expression matching. While this seems to be a ``settled'' area, in
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
   999
fact interesting research questions are popping up as soon as one steps
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
  1000
outside the classic automata theory (for example in terms of what kind
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
  1001
of regular expressions are supported). The reason why it is
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
  1002
interesting for us to look at the derivative approach introduced by
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
  1003
Brzozowski for regular expression matching, and then much further
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
  1004
developed by Sulzmann and Lu, is that derivatives can elegantly deal
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
  1005
with some of the regular expressions that are of interest in ``real
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
  1006
life''. This includes the not-regular expression, written $\neg\,r$
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
  1007
(that is all strings that are not recognised by $r$), but also bounded
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
  1008
regular expressions such as $r^{\{n\}}$ and $r^{\{n..m\}}$). There is
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
  1009
also hope that the derivatives can provide another angle for how to
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
  1010
deal more efficiently with back-references, which are one of the
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
  1011
reasons why regular expression engines in JavaScript, Python and Java
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
  1012
choose to not implement the classic automata approach of transforming
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
  1013
regular expressions into NFAs and then DFAs---because we simply do not
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
  1014
know how such back-references can be represented by DFAs.
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
  1015
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
  1016
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
  1017
\bibliographystyle{plain}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
  1018
\bibliography{root}
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
  1019
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
  1020
bd9eb959dbce changed file name to ninems
Chengsong
parents:
diff changeset
  1021
\end{document}