From aedfc8db0ca244d1ce85eb8205abc68595dde79d Mon Sep 17 00:00:00 2001 From: Ulya Trofimovich Date: Mon, 10 Jul 2017 14:43:28 +0100 Subject: [PATCH] First part of the paper on Lookahead TDFA. --- re2c/doc/tdfa/img/example1/tdfa0.png | Bin 0 -> 3243 bytes re2c/doc/tdfa/img/example1/tdfa0_raw.png | Bin 0 -> 11260 bytes re2c/doc/tdfa/img/example1/tdfa1.png | Bin 0 -> 4145 bytes re2c/doc/tdfa/img/example1/tdfa1_raw.png | Bin 0 -> 10906 bytes re2c/doc/tdfa/img/example1/tnfa.png | Bin 0 -> 7704 bytes re2c/doc/tdfa/img/example2/tdfa0.png | Bin 0 -> 3405 bytes re2c/doc/tdfa/img/example2/tdfa0_raw.png | Bin 0 -> 18430 bytes re2c/doc/tdfa/img/example2/tdfa1.png | Bin 0 -> 3180 bytes re2c/doc/tdfa/img/example2/tdfa1_raw.png | Bin 0 -> 14532 bytes re2c/doc/tdfa/img/example2/tnfa.png | Bin 0 -> 6547 bytes re2c/doc/tdfa/img/example3/tdfa0.png | Bin 0 -> 4250 bytes re2c/doc/tdfa/img/example3/tdfa0_raw.png | Bin 0 -> 18526 bytes re2c/doc/tdfa/img/example3/tdfa1.png | Bin 0 -> 3999 bytes re2c/doc/tdfa/img/example3/tdfa1_raw.png | Bin 0 -> 15063 bytes re2c/doc/tdfa/img/example3/tnfa.png | Bin 0 -> 4872 bytes re2c/doc/tdfa/img/example4/tdfa0.png | Bin 0 -> 5628 bytes re2c/doc/tdfa/img/example4/tdfa0_raw.png | Bin 0 -> 26594 bytes re2c/doc/tdfa/img/example4/tdfa1.png | Bin 0 -> 5075 bytes re2c/doc/tdfa/img/example4/tdfa1_raw.png | Bin 0 -> 25548 bytes re2c/doc/tdfa/img/example4/tnfa.png | Bin 0 -> 8452 bytes re2c/doc/tdfa/img/example5/tdfa0.png | Bin 0 -> 6665 bytes re2c/doc/tdfa/img/example5/tdfa0_raw.png | Bin 0 -> 22799 bytes re2c/doc/tdfa/img/example5/tdfa1.png | Bin 0 -> 6086 bytes re2c/doc/tdfa/img/example5/tdfa1_raw.png | Bin 0 -> 17801 bytes re2c/doc/tdfa/img/example5/tnfa.png | Bin 0 -> 5802 bytes re2c/doc/tdfa/img/example6/tdfa0.png | Bin 0 -> 2996 bytes re2c/doc/tdfa/img/example6/tdfa0_raw.png | Bin 0 -> 6202 bytes re2c/doc/tdfa/img/example6/tdfa1.png | Bin 0 -> 3851 bytes re2c/doc/tdfa/img/example6/tdfa1_raw.png | Bin 0 -> 7390 bytes re2c/doc/tdfa/img/example6/tnfa.png | Bin 0 -> 5449 bytes re2c/doc/tdfa/img/plot_acyc_neg.png | Bin 0 -> 8641 bytes re2c/doc/tdfa/img/plot_acyc_neg_logscale.png | Bin 0 -> 11514 bytes re2c/doc/tdfa/img/plot_grid_nhard.png | Bin 0 -> 9830 bytes .../doc/tdfa/img/plot_grid_nhard_logscale.png | Bin 0 -> 12042 bytes re2c/doc/tdfa/mk.sh | 3 + re2c/doc/tdfa/tdfa.tex | 2315 +++++++++++++++++ 36 files changed, 2318 insertions(+) create mode 100644 re2c/doc/tdfa/img/example1/tdfa0.png create mode 100644 re2c/doc/tdfa/img/example1/tdfa0_raw.png create mode 100644 re2c/doc/tdfa/img/example1/tdfa1.png create mode 100644 re2c/doc/tdfa/img/example1/tdfa1_raw.png create mode 100644 re2c/doc/tdfa/img/example1/tnfa.png create mode 100644 re2c/doc/tdfa/img/example2/tdfa0.png create mode 100644 re2c/doc/tdfa/img/example2/tdfa0_raw.png create mode 100644 re2c/doc/tdfa/img/example2/tdfa1.png create mode 100644 re2c/doc/tdfa/img/example2/tdfa1_raw.png create mode 100644 re2c/doc/tdfa/img/example2/tnfa.png create mode 100644 re2c/doc/tdfa/img/example3/tdfa0.png create mode 100644 re2c/doc/tdfa/img/example3/tdfa0_raw.png create mode 100644 re2c/doc/tdfa/img/example3/tdfa1.png create mode 100644 re2c/doc/tdfa/img/example3/tdfa1_raw.png create mode 100644 re2c/doc/tdfa/img/example3/tnfa.png create mode 100644 re2c/doc/tdfa/img/example4/tdfa0.png create mode 100644 re2c/doc/tdfa/img/example4/tdfa0_raw.png create mode 100644 re2c/doc/tdfa/img/example4/tdfa1.png create mode 100644 re2c/doc/tdfa/img/example4/tdfa1_raw.png create mode 100644 re2c/doc/tdfa/img/example4/tnfa.png create mode 100644 re2c/doc/tdfa/img/example5/tdfa0.png create mode 100644 re2c/doc/tdfa/img/example5/tdfa0_raw.png create mode 100644 re2c/doc/tdfa/img/example5/tdfa1.png create mode 100644 re2c/doc/tdfa/img/example5/tdfa1_raw.png create mode 100644 re2c/doc/tdfa/img/example5/tnfa.png create mode 100644 re2c/doc/tdfa/img/example6/tdfa0.png create mode 100644 re2c/doc/tdfa/img/example6/tdfa0_raw.png create mode 100644 re2c/doc/tdfa/img/example6/tdfa1.png create mode 100644 re2c/doc/tdfa/img/example6/tdfa1_raw.png create mode 100644 re2c/doc/tdfa/img/example6/tnfa.png create mode 100644 re2c/doc/tdfa/img/plot_acyc_neg.png create mode 100644 re2c/doc/tdfa/img/plot_acyc_neg_logscale.png create mode 100644 re2c/doc/tdfa/img/plot_grid_nhard.png create mode 100644 re2c/doc/tdfa/img/plot_grid_nhard_logscale.png create mode 100755 re2c/doc/tdfa/mk.sh create mode 100644 re2c/doc/tdfa/tdfa.tex diff --git a/re2c/doc/tdfa/img/example1/tdfa0.png b/re2c/doc/tdfa/img/example1/tdfa0.png new file mode 100644 index 0000000000000000000000000000000000000000..4bcbe608f36f6953386d6c41f75116df62fc4f13 GIT binary patch literal 3243 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 Tk;FgXIRHp=8?!1?_vn8CUaAwQ literal 0 HcmV?d00001 diff --git a/re2c/doc/tdfa/img/example1/tdfa0_raw.png b/re2c/doc/tdfa/img/example1/tdfa0_raw.png new file mode 100644 index 0000000000000000000000000000000000000000..f563c5b71ff8427265d5856b1c70d93bd161ed9b GIT binary patch literal 11260 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

C;uKCy$< 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 z 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 JatV{*{{ksl4{!hg literal 0 HcmV?d00001 diff --git a/re2c/doc/tdfa/img/example1/tnfa.png b/re2c/doc/tdfa/img/example1/tnfa.png new file mode 100644 index 0000000000000000000000000000000000000000..26e51bc488d1af7de637851dfbfd2cb04800f811 GIT binary patch literal 7704 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 literal 0 HcmV?d00001 diff --git a/re2c/doc/tdfa/img/example2/tdfa0.png b/re2c/doc/tdfa/img/example2/tdfa0.png new file mode 100644 index 0000000000000000000000000000000000000000..4749bdf9f40537fac4083e935a5e5890ce0ba128 GIT binary patch literal 3405 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 IHSMDQ1w%tytN;K2 literal 0 HcmV?d00001 diff --git a/re2c/doc/tdfa/img/example2/tdfa0_raw.png b/re2c/doc/tdfa/img/example2/tdfa0_raw.png new file mode 100644 index 0000000000000000000000000000000000000000..55a7ea054520d058d578432127385eaf6b74be49 GIT binary patch literal 18430 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 Lg-Wg`#jySc;SdkX literal 0 HcmV?d00001 diff --git a/re2c/doc/tdfa/img/example2/tdfa1.png b/re2c/doc/tdfa/img/example2/tdfa1.png new file mode 100644 index 0000000000000000000000000000000000000000..5611ee1f00343dcc74533b9e8fc7104654ff1a20 GIT binary patch literal 3180 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 Uqh0ia7XqO8{)21<#5DMS0TKavUH||9 literal 0 HcmV?d00001 diff --git a/re2c/doc/tdfa/img/example3/tdfa0.png b/re2c/doc/tdfa/img/example3/tdfa0.png new file mode 100644 index 0000000000000000000000000000000000000000..3cc703174715e82a685e8ddf8653e36cdb5557ee GIT binary patch literal 4250 zcmb7IXH-+$x(!WKA_yqGD1vZ8F%+c>2uPDEE%e@dH%L>dQbbPZ?SQmU0|FANAOr}# zi4X`75osZa5HJWgyfeld?~QTp9pnDltL<;DZ_l;YUUTk513isvS2?Z%0Dx;+nrcP> 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 literal 0 HcmV?d00001 diff --git a/re2c/doc/tdfa/img/example3/tdfa1.png b/re2c/doc/tdfa/img/example3/tdfa1.png new file mode 100644 index 0000000000000000000000000000000000000000..727e5f08150b760272b3aeb4c532ccc0dbbf3074 GIT binary patch literal 3999 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 T!(?TM0YFYlS+YvpH28l3$4 literal 0 HcmV?d00001 diff --git a/re2c/doc/tdfa/img/example3/tnfa.png b/re2c/doc/tdfa/img/example3/tnfa.png new file mode 100644 index 0000000000000000000000000000000000000000..b3fa69d6f450a8d2a4b2d57b7404f5133e258314 GIT binary patch literal 4872 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 V8#vC-`cK^o(0HVyS_QX>{tswQDd7MB literal 0 HcmV?d00001 diff --git a/re2c/doc/tdfa/img/example4/tdfa0.png b/re2c/doc/tdfa/img/example4/tdfa0.png new file mode 100644 index 0000000000000000000000000000000000000000..bc8ebaaded9ea55177bad54685dc31a79086413a GIT binary patch literal 5628 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 literal 0 HcmV?d00001 diff --git a/re2c/doc/tdfa/img/example4/tdfa0_raw.png b/re2c/doc/tdfa/img/example4/tdfa0_raw.png new file mode 100644 index 0000000000000000000000000000000000000000..048549c3ce111e4321af74b0c3debed6c994de26 GIT binary patch literal 26594 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 literal 0 HcmV?d00001 diff --git a/re2c/doc/tdfa/img/example4/tdfa1.png b/re2c/doc/tdfa/img/example4/tdfa1.png new file mode 100644 index 0000000000000000000000000000000000000000..fa1773ef5c8a86d2c934a92599743c4b55aaae53 GIT binary patch literal 5075 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 E0r<;w`v3p{ literal 0 HcmV?d00001 diff --git a/re2c/doc/tdfa/img/example5/tdfa0_raw.png b/re2c/doc/tdfa/img/example5/tdfa0_raw.png new file mode 100644 index 0000000000000000000000000000000000000000..2f88663667396c58b072caa23b938c697374e99d GIT binary patch literal 22799 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 literal 0 HcmV?d00001 diff --git a/re2c/doc/tdfa/img/example5/tdfa1.png b/re2c/doc/tdfa/img/example5/tdfa1.png new file mode 100644 index 0000000000000000000000000000000000000000..328d60e93e324f7fd81a3233bf8654c2cc833ed9 GIT binary patch literal 6086 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 V4RIzDq7Mdunv%9+rM$(*{{nC@J=y>O literal 0 HcmV?d00001 diff --git a/re2c/doc/tdfa/img/example5/tdfa1_raw.png b/re2c/doc/tdfa/img/example5/tdfa1_raw.png new file mode 100644 index 0000000000000000000000000000000000000000..771853d31f59435302a5cfe0b2243a54d9e2b8b7 GIT binary patch literal 17801 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⁣6*y^(lYgj=K8~P(_FcB4yPijG6u24oCk7UJSZ= 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 JY$L`s@o)8)Q_uha literal 0 HcmV?d00001 diff --git a/re2c/doc/tdfa/img/example6/tdfa0_raw.png b/re2c/doc/tdfa/img/example6/tdfa0_raw.png new file mode 100644 index 0000000000000000000000000000000000000000..2a968b426321f61c9061dd295b199df3d585fe2a GIT binary patch literal 6202 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 literal 0 HcmV?d00001 diff --git a/re2c/doc/tdfa/img/example6/tdfa1_raw.png b/re2c/doc/tdfa/img/example6/tdfa1_raw.png new file mode 100644 index 0000000000000000000000000000000000000000..8e82b5a96c272959f327c88fd941e2355d2d4547 GIT binary patch literal 7390 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 H>DT`PKUWre literal 0 HcmV?d00001 diff --git a/re2c/doc/tdfa/img/example6/tnfa.png b/re2c/doc/tdfa/img/example6/tnfa.png new file mode 100644 index 0000000000000000000000000000000000000000..0ef09d392598261dabb17e260c015421e079b1c5 GIT binary patch literal 5449 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 ND9ETvmrI%l{SWl=*0%rv literal 0 HcmV?d00001 diff --git a/re2c/doc/tdfa/mk.sh b/re2c/doc/tdfa/mk.sh new file mode 100755 index 00000000..60f8cab4 --- /dev/null +++ b/re2c/doc/tdfa/mk.sh @@ -0,0 +1,3 @@ +#!/bin/sh -e + +pdflatex -shell-escape tdfa.tex tdfa.build_log diff --git a/re2c/doc/tdfa/tdfa.tex b/re2c/doc/tdfa/tdfa.tex new file mode 100644 index 00000000..22409340 --- /dev/null +++ b/re2c/doc/tdfa/tdfa.tex @@ -0,0 +1,2315 @@ +\documentclass{article} +\usepackage[margin=2cm]{geometry} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{amsthm} +\usepackage{amsfonts} +\usepackage[utf8]{inputenc} +\usepackage{graphicx} +\usepackage{caption} +\usepackage{listings} +\usepackage{multicol}\setlength{\columnsep}{1cm} +\setlength{\parindent}{0pt} + +\usepackage{enumitem} +\setlist{nosep} +\setlistdepth{9} +\setlist[enumerate,1]{label=$\arabic*.$} +\setlist[enumerate,2]{label=$\alph*.$} +\setlist[enumerate,3]{label=$\roman*.$} +\setlist[enumerate,4]{label=$(\arabic*)$} +\setlist[enumerate,5]{label=$(\alph*)$} +\setlist[enumerate,6]{label=$(\roman*)$} +\setlist[enumerate,7]{label=$\arabic*$} +\setlist[enumerate,8]{label=$\alph*$} +\setlist[enumerate,9]{label=$\roman*$} +\renewlist{enumerate}{enumerate}{9} + +\newcommand{\Xset}{\!\leftarrow\!} +\newcommand{\Xund}{\rule{.4em}{.4pt}} % underscore +\newcommand{\Xin}{\!\in\!} +\newcommand{\Xeq}{\!=\!} +\newcommand{\Xlb}{[\![} +\newcommand{\Xrb}{]\!]} +\newcommand{\Xmap}{\!\mapsto\!} +\newcommand{\XB}{\mathcal{B}} +\newcommand{\XD}{\mathcal{D}} +\newcommand{\XF}{\mathcal{F}} +\newcommand{\XI}{\mathcal{I}} +\newcommand{\XL}{\mathcal{L}} +\newcommand{\XN}{\mathcal{N}} +\newcommand{\XO}{\mathcal{O}} +\newcommand{\XP}{\mathcal{P}} +\newcommand{\XS}{\mathcal{S}} +\newcommand{\XT}{\mathcal{T}} +\newcommand{\XX}{\mathcal{X}} +\newcommand{\YB}{\mathbb{B}} +\newcommand{\YF}{\mathbb{F}} +\newcommand{\YN}{\mathbb{N}} +\newcommand{\YT}{\mathbb{T}} +\newcommand{\YQ}{\mathbb{Q}} + +\newcommand{\Xstirling}[2]{\genfrac{\{}{\}}{0pt}{}{#1}{#2}} + +\makeatletter +\newcommand*{\Relbarfill@}{\arrowfill@\Relbar\Relbar\Relbar} +\newcommand*{\Xlongeq}[2][]{\ext@arrow 0055\Relbarfill@{#1}{\text{#2}}} +\newcommand*{\Xbar}[1]{\overline{#1\vphantom{\bar{#1}}}} +\makeatother + +\theoremstyle{definition} +\newtheorem{Xdef}{Definition} +\newtheorem{XThe}{Theorem} +\newtheorem{XLem}{Lemma} + +\title{Tagged Deterministic Finite Automata with Lookahead} +\author{Ulya Trofimivich} +\date{March 2017} + +\begin{document} + +\maketitle + +\begin{abstract} +\noindent +This paper extends the work of Laurikari [Lau00] [Lau01] and Kuklewicz [Kuk??] on tagged deterministic finite automata (TDFA) +in connection with submatch extraction in regular expressions. +I augment TDFA with 1-symbol lookahead, which results in significant reduction of tag variables and operations. +Lookahead-aware automata may have slightly more states, but they are more amenable to optimizations and as a rule result in both smaller and faster code. +The proposed algorithm can handle repeated submatch and therefore is applicable to full parsing. +Furthermore, I consider two disambiguation policies: leftmost greedy and POSIX. +I formalize the algorithm suggested by Kuklewicz +and show that Kuklewicz TDFA have no overhead compared to Laurikari TDFA or automata that use leftmost greedy disambiguation. +All discussed models and algorithms are implemented in the open source lexer generator RE2C. +\end{abstract} +%\vspace{1em} + +\begin{multicols}{2} + +\section*{Introduction} + +RE2C [Bum94] [web??] is a lexer generator for C: it compiles regular expressions into code. +Unlike regular expression libraries such as TRE [Lau01] or RE2 [Cox??], RE2C has no restriction on preprocessing time +and concentrates fully on the quality of generated code. +RE2C takes pride in generating fast lexers: at least as fast as reasonably optimized lexers coded by hand. +This is not an easy goal; hand-written code is specialized for a particular environment, while autogenerated code must fit anywhere. +RE2C has a highly configurable interface and quite a few optimizations ranging from +high-level program transformations to low-level tweaks of conditional jumps. +In such setting it is undesirable to add extensions that affect performance. +\\ \\ +One useful extension of regular expressions is submatch extraction and parsing. +Many authors studied this subject and developed algorithms suitable for their particular settings and problem domains. +Their approaches differ in many respects: +the specific subtype of problem (full parsing, submatch extracton with or without history of repetitions); +the underlying formalizm (backtracking, +nondeterministic automata, deterministic automata, +multiple automata, lazy determinization); +the number of passes over the input (streaming, multi-pass); +space consumption with respect to input length (constant, proportional); +treatment of ambiguity (unhandled, manual disambiguation, default disambiguation policy, all possible parse trees). +%Their approaches differ in many respects: +%the specific subtype of problem (full parsing, submatch extracton with or without history of repeated submatches); +%the underlying formalizm (backtracking, +%nondeterministic automaton [ThoBra] [Cox], +%deterministic automaton [Ragel] [Lau00] [Gra15], +%multiple deterministic automata [SohTho], +%lazy determinization [Kuk] [Kar]); +%the number of passes over the input (streaming, multi-pass); +%space consumption (constant, proportional to the size of output [Gra] [ThoBra], proportional to length of input [Kea] [DubFee]); +%treatment of ambiguity (forbidden, manual disambiguation [Ragel], default policy [FriCar] [Gra], multiple options [ThoBra]). +Most of the algorithms are unsuitable for RE2C: either insufficienty generic (cannot handle ambiguity), +or too heavyweight (incur too much overhead on regular expressions with only a few submatches or no submatches at all). +Laurikari algorithm is special in this respect. +It is based on a single deterministic automaton, runs in one pass and linear time, +and the consumed space does not depend on the input length. +What is most important, the overhead on submatch extraction depends on the detalization of submatch: +on regular expressions without submatches Laurikari automaton shrinks to a simple DFA. +\\ \\ +From RE2C point of view this is close enough to hand-written code: +you only pay for what you need, like a reasonable programmer would do. +However, a closer look at Laurikari automata reveals that +they behave like a very strange programmer who is unable to think even one step ahead. +Take, for example, regular expression \texttt{a*b*} +and suppose that we must find the boundary between \texttt{a} and \texttt{b} in the input string. +The programmer would probably match all \texttt{a}, then save the input position, then match all \texttt{b}: + +\begin{small} +\begin{verbatim} + while (*s++ == 'a') ; + p = s; + while (*s++ == 'b') ; +\end{verbatim} +\end{small} + +And this is how the automaton would do: + +\begin{small} +\begin{verbatim} + p = s; + while (*s++ == 'a') p = s; + while (*s++ == 'b') ; +\end{verbatim} +\end{small} + +This behaviour is correct (it yields the same result), but strangely inefficient: +it repeatedly saves input position after every \texttt{a}, +while for the programmer it is obvious that there is nothing to save until the first non-\texttt{a}. +One might object that the compiler would optimize out the difference, +and it probably would in simple cases like this. +However, the flaw is common to all Laurikari automata: +they ignore lookahead when recording submatches. +But they don't have to; with a minor fix we can teach them +to delay recording until the right lookahead symbol shows up. +This minor fix is my first contribution. +\\ + +Another problem that needs attention is disambiguation. +The original paper [Lau01] claims to have POSIX semantics, but it was proved to be wrong [LTU]. +Since then Kuklewicz suggested a fix of Laurikari algorithm that does have POSIX semantics [Regex-TDFA], but he never formalized it. +The informal description [regex-wiki] is somewhat misleading as it suggests that Kuklewicz automata +require additional run-time operations to keep track of submatch history and hence are less efficient than Laurikari automata. +That is not true, as we shall see: all the added complexity is related to determinization, +while the resulting automata are just the same (except they have POSIX semantics). +Kuklewicz did not emphasize this, probably because his implementation constructs TDFA lazily at run-time. +I formalize Kuklewicz algorithm; this is my second contibution. +\\ + +Finally, theory is no good without practice. +Even lookahead-aware automata contain a lot of redundant operations, +which can be dramatically reduced by the most basic optimizations like liveness analysis and dead code elimination. +The overall number of submatch records can be minimized using technique similar to register allocation. +I suggest another tweak of Laurikari algoritm that makes optimizations particularly easy +and show that they have crucial impact on the quality of code, even in the presence of an optimizing C compiler. +RE2C implementation of submatch extraction is the motivation and the main goal of this work. +\\ + +The rest of this paper is arranged as follows. +We start with theoretical foundations and gradually move towards practical algorithms. +Section \ref{section_regular_expressions} revises the basic definition of regular expressions. +In section \ref{section_tagged_extension} we extend it with tags +and define ambiguity with respect to submatch extraction. +In section \ref{section_tnfa} we convert regular expressions to nondeterministic automata +and in section \ref{section_closure} study various algorithms for closure construction. +Section \ref{section_disambiguation} is about disambiguation; +we discuss leftmost greedy and POSIX policies and the necessary properties that disambiguation policy should have in order to allow efficient submatch extraction. +Section \ref{section_determinization} is the main part of this paper: it presents determinization algorithm. +Section \ref{section_optimizations} highlihgts some practical implementation details and optimizations. +Section \ref{section_evaluation} concerns correctness testing and benchmarks. +Finally, section \ref{section_future_work} points directions for future work. + +\section{Regular expressions}\label{section_regular_expressions} + +Regular expressions is a notation that originates in the work of Kleene +\emph{``Representation of Events in Nerve Nets and Finite Automata''} [Kle51] [Kle56]. +He used this notation to describe \emph{regular events}: +each regular event is a set of \emph{definite events}, +and the class of all regular events is defined inductively +as the least class containing basic events (empty set and all unit sets) +and closed under the operations of \emph{sum}, \emph{product} and \emph{iterate}. +Kleene showed that regular events form exactly the class of events that can be represented by McCulloch-Pitts nerve nets or, equivalently, finite automata. +However, generalization of regular events to other fields of mathematics remained an open problem; +in particular, Kleene raised the question whether regular events could be reformulated +as a deductive system based on logical axioms and algebraic laws. +This question was thoroughly investigated by many authors (see [Koz91] for a historic overview) +and the formalism became known as \emph{the algebra of regular events} %$\mathcal{K} \Xeq (K, +, \cdot, *, 1, 0)$ +or, more generally, the \emph{Kleene algebra}. +Several different axiomatizations of Kleene algebra were given; +in particular, Kozen gave a finitary axiomatization based on equations and equational implications and sound for all interpretations [Koz91]. +We will use the usual inductive definition: +\\ + + \begin{Xdef} + \emph{Regular expressions (RE)} over finite alphabet $\Sigma$ + is a notation that is inductively defined as follows: + \begin{enumerate} + \medskip + \item[] $\emptyset$, $\epsilon$ and $\alpha \Xin \Sigma$ are \emph{atomic} RE + \item[] if $e_1$, $e_2$ are RE, then $e_1 | e_2$ is RE (\emph{sum}) + \item[] if $e_1$, $e_2$ are RE, then $e_1 e_2$ is RE (\emph{product}) + \item[] if $e$ is RE, then $e^*$ is RE (\emph{iteration}) + \medskip + \end{enumerate} + Iteration has precedence over product and product over sum; + parenthesis may be used to override it. + $\square$ + \end{Xdef} + +For the most useful RE there are special shortcuts: + \begin{align*} + e^n &\quad\text{for}\quad \overbrace{e \dots e}^{n} \\[-0.5em] + e^{n,m} &\quad\text{for}\quad e^n | e^{n+1} | \dots | e^{m-1} | e^m \\[-0.5em] + e^{n,} &\quad\text{for}\quad e^n e^* \\[-0.5em] + e^+ &\quad\text{for}\quad ee^* \\[-0.5em] + e^? &\quad\text{for}\quad e | \epsilon + \end{align*} + +Since RE are only a notation, their exact meaning depends on the particular \emph{interpretation}. +In the \emph{standard} interpretation RE denote \emph{languages}: sets of strings over the alphabet of RE. + + \begin{Xdef} + \emph{Language} over $\Sigma$ is a subset of $\Sigma^*$, + where $\Sigma^*$ denotes the set of all (possibly empty) strings over $\Sigma$. + $\square$ + \end{Xdef} + + \begin{Xdef}\label{langunion} + \emph{Union} of two languages $L_1$ and $L_2$ is + $L_1 \cup L_2 = \{ x \mid x \Xin L_1 \vee x \Xin L_2 \}$ + $\square$ + \end{Xdef} + + \begin{Xdef}\label{langproduct} + \emph{Product} of two languages $L_1$ and $L_2$ is + $L_1 \cdot L_2 = \{ x_1 x_2 \mid x_1 \Xin L_1 \wedge x_2 \Xin L_2 \}$ + $\square$ + \end{Xdef} + + \begin{Xdef}\label{langiterate} + n-th \emph{Power} of language $L$ is + $$L^n = \begin{cases} + \{ \epsilon \} & \text{if } n \Xeq 0 \\[-0.5em] + L \cdot L^{n - 1} & \text{if } n\!>\!0 + \end{cases}$$ + $\square$ + \end{Xdef} + + \begin{Xdef}\label{langiterate} + \emph{Iterate} of language $L$ is + $L^* = \bigcup\limits_{n = 0}^\infty L^n$. + $\square$ + \end{Xdef} + + \begin{Xdef} + \emph{(Language interpretation of RE)} \\ + RE denotes a language over $\Sigma$: + \begin{align*} + \XL \Xlb \emptyset \Xrb &= \emptyset \\ + \XL \Xlb \epsilon \Xrb &= \{ \epsilon \} \\ + \XL \Xlb \alpha \Xrb &= \{\alpha\} \\ + \XL \Xlb e_1 | e_2 \Xrb &= \XL \Xlb e_1 \Xrb \cup \XL \Xlb e_2 \Xrb \\ + \XL \Xlb e_1 e_2 \Xrb &= \XL \Xlb e_1 \Xrb \cdot \XL \Xlb e_2 \Xrb \\ + \XL \Xlb e^* \Xrb &= \XL \Xlb e \Xrb ^* + \end{align*} + $\square$ + \end{Xdef} + +Other interpretations are also possible; +one notable example is the \emph{type interpretation}, +in which RE denote sets of parse trees [ThoBra10] [Gra15]. +This is close to what we need for submatch extraction, +except that we are interested in partial parse structure rather than full parse trees. + + \begin{Xdef} + Language $L$ over $\Sigma$ is \emph{regular} iff $\exists$ RE $e$ over $\Sigma$ + such that $L$ is denoted by $e$: $\XL \Xlb e \Xrb \Xeq L$. + $\square$ + \end{Xdef} + +The set $\mathcal{R}_\Sigma$ of all regular languages over alphabet $\Sigma$ +together with constants $\emptyset$, $\{ \epsilon \}$ and operations $\cup$, $\cdot$ and ${}^*$ +forms a Kleene algebra $\mathcal{K} \Xeq (\mathcal{R}_\Sigma, \cup, \cdot, *, \emptyset, \{ \epsilon \})$. + +\section{Tagged extension}\label{section_tagged_extension} + +In short, tags are position markers attached to the structure of RE. +The idea of adding such markers is not new: +many RE flavours have \emph{capturing groups}, or the \emph{lookahead} operator, or \emph{pre-} and \emph{post-context} operators; +all of them are used for submatch extraction of some sort. +Laurikari used the word \emph{tag}. +He did not define tags explicitly; rather, he defined automata with tagged transitions. +We take a slightly different appoach, inspired by [ThoBra10], [Gra15] and a number of other publications. +First, we define an extension of RE: tagged RE, +and two interpretations: \emph{S-language} that ignores tags and \emph{T-language} that respects them. +T-language has the bare minimum of information necessary for submatch extraction; +in particular, it is less expressive than \emph{parse trees} or \emph{types} that are used for RE parsing. +Then we define \emph{ambiguity} and \emph{disambiguation policy} in terms of relations between the two interpretations. +Finally, we show how T-language can be converted to the \emph{tag value functions} used by Laurikari +and argue that the latter representation is insufficient as it cannot express ambiguity in some RE. +\\ + +Tagged RE differ from RE in the following respects. +First, they have a new kind of atomic primitive: tags. +Second, we use generalized repetition $e^{n,m}$ (possibly $m \Xeq \infty$) as one of the three base operations instead of iteration $e^*$. +The reason for this is that +desugaring repetition into concatenation and iteration requires duplication of $e$, +and duplication may change the semantics of submatch extraction. +For example, POSIX RE \texttt{(a(b?))\{2\}} contains two submatch groups (aside from the whole RE), +but if we rewrite it as \texttt{(a(b?))(a(b?))}, the number of submatches will change to four. +Third difference is that repetition starts from one: zero or more repetitions are expressed as alternative between one or more repetitions and the empty word. +This is mostly a matter of convenience: +the case of zero iterations is special because it contains no tags, even if the subexpression itself does. + + \begin{Xdef} + \emph{Tagged regular expressions (TRE)} over disjoint finite alphabets $\Sigma$ and $T$ + is a notation that is inductively defined as follows: + \begin{enumerate} + \medskip + \item[] $\emptyset$, $\epsilon$, $\alpha \Xin \Sigma$, $t \Xin T$ are \emph{atomic} TRE + \item[] if $e_1$, $e_2$ are TRE, then $e_1 | e_2$ is TRE (\emph{sum}) + \item[] if $e_1$, $e_2$ are TRE, then $e_1 e_2$ is TRE (\emph{product}) +% \item[] if $e$ is TRE and $1 \!\leq\! n \!\leq\! \infty$, then $e^{1,n}$ is TRE (\emph{repetition}) + \item[] if $e$ is TRE and $0 \!<\! n \!\leq\! m \!\leq\! \infty$, then $e^{n,m}$ is TRE (\emph{repetition}) + \medskip + \end{enumerate} + Repetition has precedence over product and product over sum; + parenthesis may be used to override it. + Additionally, the following shorthand notation may be used: + \begin{align*} +% e^n &\quad\text{for}\quad \overbrace{e \dots e}^{n} \\[-0.5em] +% e^{n,m} &\quad\text{for}\quad e^{n-1} e^{1,m-n} \\[-0.5em] + e^n &\quad\text{for}\quad e^{n,n} \\[-0.5em] + e^{0,m} &\quad\text{for}\quad e^{1,m} | \epsilon \\[-0.5em] + e^* &\quad\text{for}\quad e^{1,\infty} | \epsilon \\[-0.5em] + e^+ &\quad\text{for}\quad e^{1,\infty} \\[-0.5em] + e^? &\quad\text{for}\quad e | \epsilon + \end{align*} + $\square$ + \end{Xdef} + + \begin{Xdef} + TRE over $\Sigma$, $T$ is \emph{well-formed} iff + all tags in it are pairwise different + and $T \Xeq \{ 1, \dots, |T| \}$. + $\square$ + We will consider only well-formed TRE. + \end{Xdef} + +If we assume that tags are aliases to $\epsilon$, then every TRE over $\Sigma$, $T$ is a RE over $\Sigma$: +intuitively, this corresponds to erasing all submatch information. +We call this \emph{S-language interpretation} (short from ``sigma'' or ``source''), +and the corresponding strings are \emph{S-strings}: + + \begin{Xdef}\label{defslang} + \emph{(S-language interpretation of TRE)} \\ + TRE over $\Sigma$, $T$ denotes a language over $\Sigma$: + \begin{align*} + \XS \Xlb \emptyset \Xrb &= \emptyset \\ + \XS \Xlb \epsilon \Xrb &= \{ \epsilon \} \\ + \XS \Xlb \alpha \Xrb &= \{\alpha\} \\ + \XS \Xlb t \Xrb &= \{\epsilon\} \\ + \XS \Xlb e_1 | e_2 \Xrb &= \XS \Xlb e_1 \Xrb \cup \XS \Xlb e_2 \Xrb \\ + \XS \Xlb e_1 e_2 \Xrb &= \XS \Xlb e_1 \Xrb \cdot \XS \Xlb e_2 \Xrb \\ + \XS \Xlb e^{n,m} \Xrb &= \bigcup\limits_{i=n}^m \XS \Xlb e \Xrb ^i + \end{align*} + $\square$ + \end{Xdef} + +On the other hand, if we interpret tags as symbols, then every TRE over $\Sigma$, $T$ is a RE over the joined alphabet $\Sigma \cup T$. +This interpretation retains submatch information; however, it misses one important detail: \emph{negative} submatches. +Negative submatches are implicitly encoded in the structure of TRE: +we can always deduce the \emph{absense} of tag from its \emph{presence} on alternative branch of TRE. +To see why this is important, consider POSIX RE \texttt{(a(b)?)*} matched against string \texttt{aba}. +The outermost capturing group matches twice at offsets \texttt{(0,2)} and \texttt{(2,3)}. +The innermost group matches only once at \texttt{(1,2)}; there is no match on the second outermost iteration. +POSIX standard demands that we report the absence of match \texttt{(?,?)}. +Even aside from POSIX, we might be interested in the whole history of submatch. +Therefore we will rewrite TRE in a form that makes negative submatches explicit +(by tracking tags on alternative branches and inserting negative tags at all join points). +Negative tags are marked with bar, and $\Xbar{T}$ denotes the set of all negative tags. + + \begin{Xdef}\label{deftlang} + Operator $\XX$ rewrites TRE over $\Sigma$, $T$ to a TRE over $\Sigma$, $T \cup \Xbar{T}$: + \begin{align*} + \XX(\emptyset) &= \emptyset \\ + \XX(\epsilon) &= \epsilon \\ + \XX(\alpha) &= \alpha \\ + \XX(t) &= t \\ + \XX(e_1 | e_2) + &= \XX(e_1) \chi(e_2) \mid \XX(e_2) \chi(e_1) \\ + \text{where } + &\chi(e) = \Xbar{t_1} \dots \Xbar{t_n} \text{ such that} \\ + &t_1 \dots t_n \text{ are all tags in } e \\ + \XX(e_1 e_2) &= \XX(e_1) \XX(e_2) \\ + \XX(e^{n,m}) &= \XX(e)^{n,m} + \end{align*} + $\square$ + \end{Xdef} + + \begin{Xdef}\label{deftlang} + \emph{(T-language interpretation of TRE)} \\ + TRE over $\Sigma$, $T$ denotes a language over $\Sigma \cup T \cup \Xbar{T}$: + $\XT \Xlb e \Xrb = \XL \Xlb \widetilde{e} \Xrb$, where $\widetilde{e}$ is a RE + syntactically identical to TRE $\XX(e)$. + $\square$ + \end{Xdef} + +The language over $\Sigma \cup T \cup \Xbar{T}$ is called \emph{T-language} +(short from ``tag'' or ``target''), and its strings are called \emph{T-strings}. +For example: +\begin{align*} + \XT \Xlb \beta &| (\alpha 1)^{0,2} \Xrb += + \XT \Xlb \beta \Xrb \cdot \{\Xbar{1}\} \cup + \XT \Xlb (\alpha 1)^{1,2} | \epsilon \Xrb \cdot \{\epsilon\} = \\ +&= + \{\beta \Xbar{1}\} \cup + \big(\XT \Xlb \alpha 1 \Xrb + \cup \XT \Xlb \alpha 1 \Xrb \cdot \XT \Xlb \alpha 1 \Xrb + \big) \cdot \{\epsilon\} + \cup \{\Xbar{1}\} = \\ +&= + \{\beta \Xbar{1}\} \cup + \{\alpha 1 \} \cup + \{\alpha 1 \alpha 1 \} \cup + \{\Xbar{1}\} = \\ +&= + \{\beta \Xbar{1}, \Xbar{1}, \alpha 1, \alpha 1 \alpha 1 \} +\end{align*} + + \begin{Xdef}\label{untag} + The \emph{untag} function $S$ converts T-strings into S-strings: + $S(\gamma_0 \dots \gamma_n) \Xeq \alpha_0 \dots \alpha_n$, where: + $$\alpha_i = \begin{cases} + \gamma_i &\text{if } \gamma_i \Xin \Sigma \\[-0.5em] + \epsilon &\text{otherwise} + \end{cases}$$ + $\square$ + \end{Xdef} + +It is easy to see that for any TRE $e$, $\XS \Xlb e \Xrb$ +is exactly the same language as $\{S(x) \mid x \Xin \XT \Xlb e \Xrb\}$. +Moreover, the relation between S-language and T-language +describes exactly the problem of submatch extraction: +given a TRE $e$ and an S-string $s \Xin \XS \Xlb e \Xrb$, +find the corresponding T-string $x \Xin \XT \Xlb e \Xrb$ +(in other words, translate a string from S-language to T-language). +However, there might be multiple such T-strings, in which case we speak of \emph{ambiguity}. + + \begin{Xdef} + T-strings $x$ and $y$ are \emph{ambiguous} iff $x \!\neq\! y$ and $S(x) \Xeq S(y)$. + $\square$ + \end{Xdef} + +We can define equvalence relation $\simeq$ on the T-language: let $x \simeq y \Leftrightarrow S(x) \Xeq S(y)$. +Under this relation each equvalence class with more than one element forms a maximal subset of pairwise ambiguous T-strings. + + \begin{Xdef} + For a TRE $e$ \emph{disambiguation policy} is a strict partial order $\prec$ on $L \Xeq \XT \Xlb e \Xrb$, such that + for each subset of pairwise ambiguous T-strings + it is total ($\forall$ ambiguous $x, y \Xin L$: either $x \prec y$ or $y \prec x$), + and the minimal T-string in this subset exists ($\exists x \Xin L: \forall y \Xin L \mid$ ambiguous $x, y: x \prec y$). + $\square$ + \end{Xdef} + +We will return to disambiguation in section \ref{section_disambiguation}. +\\ + +In practice obtaining submatch results in a form of a T-string is inconvenient. +A more practical representation is the \emph{tag value function} used by Laurikari: +a separate list of offsets in the input string for each tag. +Tag value functions can be trivially reconstructed from T-strings. +However, the two representations are inequivalent; +in particular, tag value functions have a weaker notion of ambiguity and fail to capture ambiguity in some TRE, as shown below. +Therefore we use T-strings as a primary representation +and convert them to tag value functions after disambiguation. + + \begin{Xdef}\label{tagvalfun} + \emph{Decomposition} of a T-string $x \Xeq \gamma_1 \dots \gamma_n$ + is a \emph{tag value function} $H: T \rightarrow (\YN_0 \cup \{ \varnothing \})^*$ + that maps each tag to a string of offsets in $S(x)$: + $H(t) \Xeq \varphi^t_1 \dots \varphi^t_n$, where: + $$\varphi^t_i = \begin{cases} + \varnothing &\text{if } \gamma_i \Xeq \Xbar{t} \\[-0.5em] + |S(\gamma_1 \dots \gamma_i)| &\text{if } \gamma_i \Xeq t \\[-0.5em] + \epsilon &\text{otherwise} + \end{cases}$$ + $\square$ + \end{Xdef} + +Negative submatches have no exact offset: they can be attributed to any point on the alternative path of TRE. +We use a special value $\varnothing$ to represent them +(it is semantically equivalent to negative infinity). +\\ + +For example, for a T-string $x \Xeq \alpha 1 2 \beta 2 \beta \alpha 1 \Xbar{2}$, +possibly denoted by TRE $(\alpha 1 (2 \beta)^*)^*$, we have +$S(x) \Xeq \alpha \beta \beta \alpha$ and tag value function: + $$H(t) \Xeq \begin{cases} + 1 \, 4 &\text{if } t \Xeq 1 \\[-0.5em] + 1 \, 2 \, \varnothing &\text{if } t \Xeq 2 + \end{cases}$$ + +Decomposition is irreversible in general: +even if we used a real offset instead of $\varnothing$, we no longer know the relative order of tags with equal offsets. +For example, TRE $(1 (3 \, 4)^{1,3} 2)^{2}$, +which may represent POSIX RE \texttt{(()\{1,3\})\{2\}}, +denotes ambiguous T-strings $x \Xeq 1 3 4 3 4 2 1 3 4 2$ and $y \Xeq 1 3 4 2 1 3 4 3 4 2$. +According to POSIX, first iteration is more important than the second one, +and repeated empty match, if optional, should be avoided, therefore $y \prec x$. +However, both $x$ and $y$ decompose to the same tag value function: + $$H(t) \Xeq \begin{cases} + 0 \, 0 &\text{if } t \Xeq 1 \\[-0.5em] + 0 \, 0 &\text{if } t \Xeq 2 \\[-0.5em] + 0 \, 0 \, 0 &\text{if } t \Xeq 3\\[-0.5em] + 0 \, 0 \, 0 &\text{if } t \Xeq 4 + \end{cases}$$ + +Moreover, consider another T-string $z \Xeq 1 3 4 2 1 3 4 3 4 3 4 2$ denoted by this RE. +By the same reasoning $z \prec x$ and $y \prec z$. +However, comparison of tag value functions cannot yield the same result +(since $x$, $y$ have the same tag value function and $z$ has a different one). +In practice this doesn't cause disambiguation errors +as long as the minimal T-string corresponds to the minimal tag value function, +but in general the order is different. +\\ + +Decomposition can be computed incrementally in a single left-to-right pass over the T-string: +$\alpha_i$ in definition \ref{untag} and +$\varphi_i^t$ in definition \ref{tagvalfun} depend only on $\gamma_j$ such that $j \!\leq\! i$. + +\section{From TRE to automata}\label{section_tnfa} + +Both S-language and T-language of the given TRE are regular, +and in this perspective submatch extraction reduces to the problem of translation between regular languages. +The class of automata capable of performing such translation is known as \emph{finite state transducers (FST)} [??]. +TNFA, as defined by Laurikari in [Lau01], is a nondeterministic FST +that performs on-the-fly decomposition of output strings into tag value functions +and then applies disambiguation. +Our definition is different in the following respects. +First, we apply disambiguation \emph{before} decomposition +(for the reasons discussed in the previous section). +Second, we do not consider disambiguation policy as an attribute of TNFA: +the same TNFA can be simulated with different policies, though not always efficiently. +Third, we include information about TRE structure in the form of \emph{prioritized} $\epsilon$-transitions: +it is used by some disambiguation policies. +Finally, we add negative tagged transitions. + + \begin{Xdef} + \emph{Tagged Nondeterministic Finite Automaton (TNFA)} + is a structure $(\Sigma, T, P, Q, F, q_0, \Delta)$, where: + \begin{itemize} + \setlength{\parskip}{0.5em} + \item[] $\Sigma$ is a finite set of symbols (\emph{alphabet}) + \item[] $T$ is a finite set of \emph{tags} + \item[] $P$ is a finite set of \emph{priorities} + \item[] $Q$ is a finite set of \emph{states} + \item[] $F \subseteq Q$ is the set of \emph{final} states + \item[] $q_0 \in Q$ is the \emph{initial} state + +% \item[] $\Delta \Xeq \Delta^\Sigma \sqcup \Delta^\epsilon$ is the \emph{transition} relation, where: +% \begin{itemize} +% \item[] $\Delta^\Sigma \subseteq Q \times \Sigma \times \{\epsilon\} \times Q$ +% \item[] $\Delta^\epsilon \subseteq Q \times (P \cup \{\epsilon\}) \times (T \cup \Xbar{T} \cup \{\epsilon\}) \times Q$ +% \end{itemize} + + \item[] $\Delta \Xeq \Delta^\Sigma \sqcup \Delta^\epsilon \sqcup \Delta^T \sqcup \Delta^P$ is the \emph{transition} relation, which includes + transitions on symbols, $\epsilon$-transitions, tagged $\epsilon$-transitions and prioritized $\epsilon$-transitions: + \begin{itemize} + \item[] $\Delta^\Sigma \subseteq Q \times \Sigma \times \{\epsilon\} \times Q$ + \item[] $\Delta^\epsilon \subseteq Q \times \{\epsilon\} \times \{\epsilon\} \times Q$ + \item[] $\Delta^T \subseteq Q \times \{\epsilon\} \times (T \cup \Xbar{T}) \times Q$ + \item[] $\Delta^P \subseteq Q \times P \times \{\epsilon\} \times Q$ + \end{itemize} + + and all $\epsilon$-transitions from the same state have different priority: + $\forall (x, r, \epsilon, y), (\widetilde{x}, \widetilde{r}, \epsilon, \widetilde{y}) \Xin \Delta: + x \Xeq \widetilde{x} \wedge y \Xeq \widetilde{y} \Rightarrow \wedge r \!\neq\! \widetilde{r}$. + \end{itemize} + $\square$ + \end{Xdef} + + \begin{Xdef} + State $q$ in TNFA $(\Sigma, T, P, Q, F, q_0, \Delta)$ + is a \emph{core} state if it is final: $q \Xin F$, + or has outgoing transitions on symbols: $\exists \alpha \Xin \Sigma, p: (q, \alpha, \epsilon, p) \Xin \Delta$. + \end{Xdef} + + \begin{Xdef} + A \emph{path} in TNFA $(\Sigma, T, P, Q, F, q_0, \Delta)$ is a set of transitions + $\{(q_i, \alpha_i, a_i, \widetilde{q}_i)\}_{i=1}^n \subseteq \Delta$, where $n \!\geq\! 0$ + and $\widetilde{q}_i \Xeq q_{i+1} \; \forall i \Xeq \overline{1,n-1}$. + $\square$ + \end{Xdef} + + \begin{Xdef} + Path $\{(q_i, \alpha_i, a_i, \widetilde{q}_i)\}_{i=1}^n$ in TNFA $(\Sigma, T, P, Q, F, q_0, \Delta)$ is \emph{accepting} + if either $n \Xeq 0 \wedge q_0 \Xin F$ or $n\!>\!0 \wedge q_1 \Xeq q_0 \wedge \widetilde{q}_n \Xin F$. + $\square$ + \end{Xdef} + +% \begin{Xdef} +% Every path $\pi \Xeq \{(q_i, \alpha_i, a_i, \widetilde{q}_i)\}_{i=1}^n$ +% induces a string $u \Xeq \alpha_1 a_1 \dots \alpha_n a_n$ +% over the mixed alphabet $\Sigma \cup T \cup \Xbar{T} \cup \{\Xbar{0}, \Xbar{1}\}$ +% called \emph{P-string} and denoted as $\pi \Xmap u$. +% $\square$ +% \end{Xdef} +% +% From the given P-string $u \Xeq \gamma_1 \dots \gamma_n$ it is possible to filter out S-string, T-string and \emph{bitcode}: +% \begin{align*} +% \XS(x) &= \alpha_1 \dots \alpha_n +% &&\alpha_i = \begin{cases} +% \gamma_i &\text{if } \gamma_i \Xin \Sigma \\[-0.5em] +% \epsilon &\text{otherwise} +% \end{cases} \\ +% \XT(x) &= \tau_1 \dots \tau_n +% &&\tau_i = \begin{cases} +% \gamma_i &\text{if } \gamma_i \Xin \Sigma \cup T \cup \Xbar{T} \\[-0.5em] +% \epsilon &\text{otherwise} +% \end{cases} \\ +% \XB(x) &= \beta_1 \dots \beta_n +% &&\beta_i = \begin{cases} +% \gamma_i &\text{if } \gamma_i \Xin \{ \Xbar{0}, \Xbar{1} \} \\[-0.5em] +% \epsilon &\text{otherwise} +% \end{cases} +% \end{align*} + + \begin{Xdef} + Every path $\pi \Xeq \{(q_i, \alpha_i, a_i, \widetilde{q}_i)\}_{i=1}^n$ + in TNFA $(\Sigma, T, P, Q, F, q_0, \Delta)$ + \emph{induces} an S-string, a T-string and a string over $P$ called \emph{bitcode}: + \begin{align*} + \XS(\pi) &= \alpha_1 \dots \alpha_n \\ + \XT(\pi) &= \alpha_1 \gamma_1 \dots \alpha_n \gamma_n + &&\gamma_i = \begin{cases} + a_i &\text{if } a_i \Xin T \cup \Xbar{T} \\[-0.5em] + \epsilon &\text{otherwise} + \end{cases} \\[-0.5em] + \XB(\pi) &= \beta_1 \dots \beta_n + &&\beta_i = \begin{cases} + a_i &\text{if } a_i \Xin P \\[-0.5em] + \epsilon &\text{otherwise} + \end{cases} + \end{align*} + $\square$ + \end{Xdef} + + \begin{Xdef} + Paths + $\pi_1 \Xeq \{(q_i, \alpha_i, a_i, \widetilde{q}_i)\}_{i=1}^n$ and + $\pi_2 \Xeq \{(p_i, \beta_i, b_i, \widetilde{p}_i)\}_{i=1}^m$ + are \emph{ambiguous} if their start and end states coincide: $q_1 \Xeq p_1$, $\widetilde{q}_n \Xeq \widetilde{p}_m$ + and their induced T-strings $\XT(\pi_1)$ and $\XT(\pi_2)$ are ambiguous. + $\square$ + \end{Xdef} + + \begin{Xdef} + TNFA $\XN$ \emph{transduces} string $s$ to a T-string $x$, denoted $s \xrightarrow{\XN} x$ + if $s \Xeq S(x)$ and there is an accepting path $\pi$ in $\XN$, such that $\XT(\pi) \Xeq x$. + $\square$ + \end{Xdef} + + \begin{Xdef} + The \emph{input language} of TNFA $\XN$ is \\ + $\XI(\XN) \Xeq \{ s \mid \exists x: s \xrightarrow{\XN} x \}$ + $\square$ + \end{Xdef} + + \begin{Xdef} + The \emph{output language} of TNFA $\XN$ is \\ + $\XO(\XN) \Xeq \{ x \mid \exists s: s \xrightarrow{\XN} x \}$ + $\square$ + \end{Xdef} + + +\begin{XThe}\label{theorem_tnfa} +For any TRE $e$ over $\Sigma$, $T$ there is a TNFA $\XN(e)$, such that +the input language of $\XN$ is the S-language of $e$: +$\XI(\XN) \Xeq \XS \Xlb e \Xrb$ and +the output language of $\XN$ is the T-language of $e$: +$\XO(\XN) \Xeq \XT \Xlb e \Xrb$. +\\ \\ +Proof. +First, we give an algorithm for FST construction (derived from Thompson NFA construction). +Let $\XN(e) \Xeq (\Sigma, T, \{0, 1\}, Q, \{ y \}, x, \Delta)$, such that $(Q, x, y, \Delta) \Xeq \XF(\XX(e))$, where: + \begin{align*} + \XF(\emptyset) &= (\{ x, y \}, x, y, \emptyset) \tag{1a} \\ + \XF(\epsilon) &= (\{ x, y \}, x, y, \{ (x, \epsilon, \epsilon, y) \}) \tag{1b} \\ + \XF(\alpha) &= (\{ x, y \}, x, y, \{ (x, \alpha, \epsilon, y) \}) \tag{1c} \\ + \XF(t) &= (\{ x, y \}, x, y, \{ (x, \epsilon, t, y) \}) \tag{1d} \\ + \XF(e_1 | e_2) &= \XF(e_1) \cup \XF(e_2) \tag{1e} \label{tnfaalt} \\ + \XF(e_1 e_2) &= \XF(e_1) \cdot \XF(e_2) \tag{1f} \label{tnfacat} \\ + \XF(e^{n,\infty}) &= \XF(e)^{n,\infty} \tag{1g} \label{tnfaunbounditer} \\ + \XF(e^{n,m}) &= \XF(e)^{n, m} \tag{1h} \label{tnfabounditer} + \end{align*} +% + \begin{align*} + F_1 \cup F_2 &= (Q, x, y, \Delta) \tag{1i} \label{tnfaaltconstr} \\ + \text{where } + & (Q_1, x_1, y_1, \Delta_1) = F_1 \\ + & (Q_2, x_2, y_2, \Delta_2) = F_2 \\ + & Q = Q_1 \cup Q_2 \cup \{ x, y \} \\ + & \Delta = \Delta_1 \cup \Delta_2 \cup \{ \\ + & \qquad (x, 0, \epsilon, x_1), (y_1, \epsilon, \epsilon, y), \\ + & \qquad (x, 1, \epsilon, x_2), (y_2, \epsilon, \epsilon, y) \} + \end{align*} +% + \begin{align*} + F_1 \cdot F_2 &= (Q, x_1, y_2, \Delta) \tag{1j} \label{tnfacatconstr} \\ + \text{where } + & (Q_1, x_1, y_1, \Delta_1) = F_1 \\ + & (Q_2, x_2, y_2, \Delta_2) = F_2 \\ + & Q = Q_1 \cup Q_2 \\ + & \Delta = \Delta_1 \cup \Delta_2 \cup \{ (y_1, \epsilon, \epsilon, x_2) \} + \end{align*} +% + \begin{align*} + F^{n,\infty} &= (Q, y_0, y_{n+1}, \Delta) \tag{1k} \label{tnfaunbounditerconstr} \\ + \text{where } + & \{(Q_i, x_i, y_i, \Delta_i)\}_{i=1}^n = \{F, \dots, F\} \\ + & Q = \bigcup\nolimits_{i=1}^n Q_i \cup \{ y_0, y_{n+1} \} \\ + & \Delta = \bigcup\nolimits_{i=1}^n \Delta_i + \cup \{(y_{i-1}, \epsilon, \epsilon, x_i)\}_{i=1}^n \\ + & \hphantom{\hspace{2em}} + \cup \{ (y_n, 0, \epsilon, x_n), (y_n, 1, \epsilon, y_{n+1}) \} + \end{align*} +% + \begin{align*} + F^{n,m} &= (Q, y_0, y_{m+1}, \Delta) \tag{1l} \label{tnfabounditerconstr} \\ + \text{where } + & \{(Q_i, x_i, y_i, \Delta_i)\}_{i=1}^m = \{F, \dots, F\} \\ + & Q = \bigcup\nolimits_{i=1}^m Q_i \cup \{ y_0, y_{m+1} \} \\ + & \Delta = \bigcup\nolimits_{i=1}^m \Delta_i + \cup \{(y_{i-1}, 0, \epsilon, x_i)\}_{i=1}^m \\ + & \hphantom{\hspace{6em}} + \cup \{(y_i, 1, \epsilon, y_{m+1})\}_{i=n}^m + \end{align*} + +Second, we must prove language equality. +Consider arbitrary TRE $e$: let $\widetilde{e} \Xeq \XF(\XX(e))$ +and let $\XO(\widetilde{e})$ denote $\XO(\XN(e))$. +We will show by induction on the size of $\widetilde{e}$ that $\XO(\XF(\widetilde{e})) \Xeq \XL \Xlb \widetilde{e} \Xrb$. +As a consequence, we will have $\XO(\XN) \Xeq \XT \Xlb e \Xrb$ and $\XI(\XN) \Xeq \XS \Xlb e \Xrb$, +since $\XI(\XN) \Xeq \{S(h) \mid h \Xin \XO(\XN)\}$ and +$\XS \Xlb e \Xrb \Xeq \{S(h) \mid h \Xin \XT \Xlb e \Xrb \}$. +\\ + +Induction basis for atomic expressions $\emptyset$, $\epsilon$, $\alpha$, $t$ +trivially follows from equations 1a - 1d and definition \ref{deftlang}. +To make the induction step, consider compound TRE. +First, note that the T-string induced by concatenation of two paths +is a concatenation of T-strings induced by each path. +%if $\pi_1 \Xeq \{(q_i, \alpha_i, a_i, \widetilde{q}_i)\}_{i=1}^n \Xmap x$ +%and $\pi_2 \Xeq \{(p_i, \beta_i, b_i, \widetilde{p}_i)\}_{i=1}^m \Xmap y$, +%then $\pi_1 +% \cup \{(\widetilde{q}_n, \epsilon, \epsilon, p_1)\} +% \cup \pi_2 \Xmap xy$ +Then by construction of TNFA we have: + + \begin{align*} + \XO(F_1 \cup F_2) \Xlongeq{\ref{tnfaaltconstr}}&\; \XO(F_1) \cup \XO(F_2)) \\ + \XO(F_1 \cdot F_2) \Xlongeq{\ref{tnfacatconstr}}&\; \XO(F_1) \cdot \XO(F_2) \\ + \XO(F^{n,m}) \Xlongeq{\ref{tnfaunbounditerconstr},\ref{tnfabounditerconstr}}&\; \bigcup_{i=n}^m {\XO(F)}^i + \end{align*} + +Given that, induction step is trivial: + + \begin{align*} + \XO(&\XF(e_1 | e_2)) \Xlongeq{\ref{tnfaalt}} \; + \XO(\XF(e_1) \cup \XF(e_2) = \\ + =&\; \XO(\XF(e_1)) \cup \XO(\XF(e_2)) = + \XL \Xlb e_1 \Xrb \cup \XL \Xlb e_2 \Xrb + = \XL \Xlb e_1 | e_2 \Xrb \\ +% + \XO(&\XF(e_1 e_2)) \Xlongeq{\ref{tnfacat}} \; \XO(\XF(e_1) \cdot \XF(e_2)) = \\ + =&\; \XO(\XF(e_1)) \cdot \XO(\XF(e_2)) = + \XL \Xlb e_1 \Xrb \cdot \XL \Xlb e_2 \Xrb = \XL \Xlb e_1 e_2 \Xrb \\ +% + \XO(&\XF(e^{n,m})) \Xlongeq{\ref{tnfabounditer},\ref{tnfaunbounditer}} \; \XO(\XF(e)^{n,m}) = \\[-0.5em] + &=\; \bigcup\limits_{i=n}^m \XO(\XF(e))^i + \Xlongeq{ind} \bigcup\limits_{i=n}^m \XL\Xlb e \Xrb^i + = \XL \Xlb e^{n,m} \Xrb + \end{align*} + $\square$ + \end{XThe} + +The simplest way to simulate TNFA is as follows. +Starting from the initial state, trace all possible paths that match the input string; record T-strings along each path. +When the input string ends, paths that end in a final state are accepting; +choose the one with the minimal T-string (with respect to disambiguation policy). +Convert the resulting T-string into tag value function. +At each step the algorithm maintains a set of \emph{configurations} $(q, x)$ that represent current paths: +$q$ is TNFA state and $x$ is the induced T-string. +The efficiency of this algorithm depends on the implementation of $closure$, which is discussed in the next section. +\\ + +% \begin{minipage}{\linewidth} + $transduce((\Sigma, T, P, Q, F, q_0, T, \Delta), \alpha_1 \dots \alpha_n)$ + \hrule + \begin{itemize}[leftmargin=0in] + \smallskip + \item[] $X \Xset closure(\{ (q_0, \epsilon) \}, F, \Delta)$ + \smallskip + \item[] for $i \Xeq \overline{1,n}$: + \begin{itemize} + \item[] $Y \Xset reach(X, \Delta, \alpha_i)$ + \item[] $X \Xset closure(Y, F, \Delta)$ + \end{itemize} + \item[] $x \Xset min_\prec\{ x \mid (q, x) \Xin X \wedge q \Xin F \}$ + \item[] return $H(x)$ + \end{itemize} +% \end{minipage} + + \bigskip + +% \begin{minipage}{\linewidth} + $reach(X, \Delta, \alpha)$ + \hrule + \begin{itemize}[leftmargin=0in] + \smallskip + \item[] return $\{ (p, x \alpha) \mid (q, x) \Xin X \wedge (q, \alpha, \epsilon, p) \Xin \Delta \}$ + \end{itemize} +% \end{minipage} + +\section{Tagged $\epsilon$-closure}\label{section_closure} + +The most straightforward implementation of $closure$ (shown below) +is to simply gather all possible non-looping $\epsilon$-paths that end in core state: + + \bigskip + +% \begin{minipage}{\linewidth} + $closure(X, F, \Delta)$ + \hrule + \begin{itemize}[leftmargin=0in] + \smallskip + \item[] empty $stack$, $result \Xset \emptyset$ + \item[] for $(q, x) \Xin X:$ + \begin{itemize} + \item[] $push(stack, (q, x))$ + \end{itemize} + \item[] while $stack$ is not empty + \begin{itemize} + \item[] $(q, x) \Xset pop(stack)$ + \item[] $result \Xset result \cup \{(q, x)\}$ + \item[] for all outgoing arcs $(q, \epsilon, \chi, p) \Xin \Delta$ + \begin{itemize} + \item[] if $\not \exists (\widetilde{p}, \widetilde{x})$ on stack $: \widetilde{p} \Xeq p$ + \begin{itemize} + \item[] $push(stack, (p, x \chi))$ + \end{itemize} + \end{itemize} + \end{itemize} + \item[] return $\{ (q, x) \Xin result \mid core(q, F, \Delta) \}$ + \end{itemize} +% \end{minipage} + + \bigskip + + $core(q, F, \Delta)$ + \hrule + \begin{itemize}[leftmargin=0in] + \smallskip + \item[] return $q \Xin F \vee \exists \alpha, p: (q, \alpha, \epsilon, p) \Xin \Delta$ + \end{itemize} + + \bigskip + +Since there might be multiple paths between two given states, +the number of different paths may grow up exponentially in the number of TNFA states. +If we prune paths immedately as they arrive at the same TNFA state, +we could keep the number of active paths at any point of simulation bounded by the number of TNFA states. +However, this puts a restriction on disambiguation policy: +it must allow to compare ambiguous T-strings by their ambiguous prefixes. +We call such policy \emph{prefix-based}; +later we will show that both POSIX and leftmost greedy policies have this property. + + \begin{Xdef} + Disambiguation policy for TRE $e$ is \emph{prefix-based} + if it can be extended on the set of ambiguous prefixes of T-strings in $\XT \Xlb e \Xrb$, + so that for any ambiguous paths $\pi_1 $, $\pi_2 $ in TNFA $\XN \Xlb e \Xrb$ + and any common suffix $\pi_3$ the following holds: + $\XT(\pi_1) \prec \XT(\pi_2) \Leftrightarrow \XT(\pi_1 \pi_3) \prec \XT(\pi_2 \pi_3)$. + $\square$ + \end{Xdef} + +The problem of closure construction can be expressed in terms of single-source shortest-path problem +in directed graph with cycles and mixed (positive and negative) arc weights. +(We assume that all initial closure states are connected to one imaginary ``source'' state). +Most algorithms for solving shortest-path problem have the same basic structure: +starting with the source node, repeatedly scan nodes; +for each scanned node apply \emph{relaxation} to all outgoing arcs; +if path to the given node has been improved, schedule it for further scanning. +Such algorithms are based on the \emph{optimal substructure} principle [Cor]: +any prefix of the shortest path is also a shortest path. +In our case tags do not map directly to weights and T-strings are more complex than distances, but direct mapping is not necessary: +optimal substructure principle still applies if the disambiguation policy is prefix-based, +and relaxation can be implemented via T-string comparison and extension of T-string along the given transition. +Also, we assume absense of epsilon-loops with ``negative weight'', +which is quite reasonable for any disambiguation policy. +Laurikari gives the following algorithm for closure construction (see Algorithm 3.4 in [Lau01]): +\\ + +% \begin{minipage}{\linewidth} + $closure \Xund laurikari(X, F, \Delta)$ + \hrule + \begin{itemize}[leftmargin=0in] + \smallskip + \item[] empty $deque$, $result(q) \equiv \bot$ + \item[] $indeg \Xeq count \Xset indegree(X, \Delta)$ + \item[] for $(q, x) \Xin X$: + \begin{itemize} + \item[] $relax(q, x, result, deque, count, indeg)$ + \end{itemize} + \item[] while $deque$ is not empty + \begin{itemize} + \item[] $q \Xset pop \Xund front (deque)$ + \item[] for all outgoing arcs $(q, \epsilon, \chi, p) \Xin \Delta$ + \begin{itemize} + \item[] $x \Xset result(q) \chi$ + \item[] $relax(p, x, result, deque, count, indeg)$ + \end{itemize} + \end{itemize} + \item[] return $\{ (q, x) \mid x \Xeq result(q) \wedge core(q, F, \Delta) \}$ + \end{itemize} +% \end{minipage} + + \bigskip + +% \begin{minipage}{\linewidth} + $relax(q, x, result, deque, count, indeg)$ + \hrule + \begin{itemize}[leftmargin=0in] + \smallskip + \item[] if $x \prec result(q)$ + \begin{itemize} + \item[] $result(q) \Xset x$ + \item[] $count(p) \Xset count(p) - 1$ + \item[] if $count(p) \Xeq 0$ + \begin{itemize} + \item[] $count(p) \Xset indeg(p)$ + \item[] $push \Xund front (deque, q)$ + \end{itemize} + \item[] else + \begin{itemize} + \item[] $push \Xund back (deque, q)$ + \end{itemize} + \end{itemize} + \end{itemize} +% \end{minipage} + + \bigskip + +% \begin{minipage}{\linewidth} + $indegree(X, \Delta)$ + \hrule + \begin{itemize}[leftmargin=0in] + \smallskip + \item[] empty $stack$, $indeg(q) \equiv 0$ + \item[] for $(q, x) \Xin X$ + \begin{itemize} + \item[] $push(stack, q)$ + \end{itemize} + \item[] while $stack$ is not empty + \begin{itemize} + \item[] $q \Xset pop(stack)$ + \item[] if $indeg(q) \Xeq 0$ + \begin{itemize} + \item[] for all outgoing arcs $(q, \epsilon, \chi, p) \Xin \Delta$ + \begin{itemize} + \item[] $push(stack, p)$ + \end{itemize} + \end{itemize} + \item[] $indeg(q) \Xset indeg(q) + 1$ + \end{itemize} + \item[] return $indeg$ + \end{itemize} +% \end{minipage} + + \bigskip + +We will refer to the above algorithm as LAU. +The key idea of LAU is to reorder scanned nodes so that anscestors are processed before their descendants. +This idea works well for acyclic graphs: scanning nodes in topological order yields a linear-time algorithm [??], +so we should expect that LAU also has linear complexity on acyclic graphs. +However, the way LAU decremets in-degree is somewhat odd: decrement only happens if relaxation was successful, +while it seems more logical to decrement in-degree every time the node is encountered. +Another deficiency is that nodes with zero in-degree may occur in the middle of the queue, +while the first node does not necessarily have zero in-degree. +These observations lead us to a modification of LAU, which we call LAU1 +(all the difference is in $relax$ procedure): +\\ + +% \begin{minipage}{\linewidth} + $relax(q, x, result, deque, count, indeg)$ + \hrule + \begin{itemize}[leftmargin=0in] + \smallskip + \item[] if $count(q) \Xeq 0$ + \begin{itemize} + \item[] $count(q) \Xset indeg(q)$ + \end{itemize} + \item[] $count(p) \Xset count(p) - 1$ + + \item[] if $count(p) \Xeq 0$ and $p$ is on $deque$ + \begin{itemize} + \item[] $remove (deque, p)$ + \item[] $push \Xund front (deque, p)$ + \end{itemize} + + \item[] if $x \prec result(q)$ + \begin{itemize} + \item[] $result(q) \Xset x$ + \item[] if $q$ is not on $deque$ + \begin{itemize} + \item[] if $count(q) \Xeq 0$ + \begin{itemize} + \item[] $push \Xund front (deque, q)$ + \end{itemize} + \item[] else + \begin{itemize} + \item[] $push \Xund back (deque, q)$ + \end{itemize} + \end{itemize} + \end{itemize} + \end{itemize} +% \end{minipage} + + \bigskip + +Still for graphs with cycles worst-case complexity of LAU and LAU1 is unclear; +usually algorithms that schedule nodes in LIFO order (e.g. Pape-Levit) have exponential compexity [ShiWit81]. +However, there is another algorithm also based on the idea of topological ordering, +which has $O(nm)$ worst-case complexity and $O(n + m)$ complexity on acyclic graphs +(where $n$ is the number of nodes and $m$ is the nuber of edges). +It is the GOR1 algorithm described in [GolRad93]: +\\ + +% \begin{minipage}{\linewidth} + $closure \Xund goldberg \Xund radzik(X, F, \Delta)$ + \hrule + \begin{itemize}[leftmargin=0in] + \smallskip + \item[] empty stacks $topsort$, $newpass$ + \item[] $result(q) \equiv \bot$ + \item[] $status(q) \equiv \mathit{OFFSTACK}$ + \item[] for $(q, x) \Xin X$: + \begin{itemize} + \item[] $relax(q, x, result, topsort)$ + \end{itemize} + \item[] while $topsort$ is not empty + \begin{itemize} + + \smallskip + \item[] while $topsort$ is not empty + \begin{itemize} + \item[] $q \Xset pop(topsort)$ + + \item[] if $status(q) \Xeq \mathit{TOPSORT}$ + \begin{itemize} + \item[] $push(newpass, n)$ + \end{itemize} + + \item[] else if $status(q) \Xeq \mathit{NEWPASS}$ + \begin{itemize} + \item[] $status(q) \Xset \mathit{TOPSORT}$ + \item[] $push(topsort, q)$ + \item[] $scan(q, result, topsort)$ + \end{itemize} + \end{itemize} + + \smallskip + \item[] while $newpass$ is not empty + \begin{itemize} + \item[] $q \Xset pop(newpass)$ + \item[] $scan(q, result, topsort)$ + \item[] $status(q) \Xset \mathit{OFFSTACK}$ + \end{itemize} + \end{itemize} + + \item[] return $\{ (q, x) \mid x \Xeq result(q) \wedge core(q, F, \Delta) \}$ + \end{itemize} +% \end{minipage} + + \bigskip + +% \begin{minipage}{\linewidth} + $scan(q, result, topsort)$ + \hrule + \begin{itemize}[leftmargin=0in] + \smallskip + \item[] for all outgoing arcs $(q, \epsilon, \chi, p) \Xin \Delta$: + \begin{itemize} + \item[] $x \Xset result(q) \chi$ + \item[] $relax(p, x, result, topsort)$ + \end{itemize} + \end{itemize} +% \end{minipage} + + \bigskip + +% \begin{minipage}{\linewidth} + $relax(q, x, result, topsort)$ + \hrule + \begin{itemize}[leftmargin=0in] + \smallskip + \item[] if $x \prec result(q)$ + \begin{itemize} + \item[] $result(q) \Xset x$ + \item[] if $status(q) \neq \mathit{TOPSORT}$ + \begin{itemize} + \item[] $push(topsort, q)$ + \item[] $status(q) \Xset \mathit{NEWPASS}$ + \end{itemize} + \end{itemize} + \end{itemize} +% \end{minipage} + + \bigskip + +% $boundary(X, F, \Delta)$ +% \hrule +% \begin{itemize}[leftmargin=0in] +% \smallskip +% \item[] return $q \Xin F \vee \exists \alpha, p: (q, \alpha, \epsilon, p) \Xin \Delta$ +% \end{itemize} + +In order to better understand all three algorithms and compare their behaviour on various classes of graphs +I used the benchmark sute described in [CheGolRad96]. +I implemented LAU, LAU1 and the above version of GOR1; +source codes are freely available in [??] and open for suggestions and bug fixes. +The most important results are as follows. +On Acyc-Neg family (acyclic graphs with mixed weights) +LAU is non-linear and significantly slower, +while LAU1 and GOR1 are both linear and LAU1 scans each node exactly once: + +\begin{center} +\includegraphics[width=\linewidth]{img/plot_acyc_neg.png} +\nolinebreak[4] +\\\footnotesize{Behavior of LAU, LAU1 and GOR1 on Acyc-Neg family.} +\end{center} + +\begin{center} +\includegraphics[width=\linewidth]{img/plot_acyc_neg_logscale.png} +\nolinebreak[4] +\\\footnotesize{Behavior of LAU, LAU1 and GOR1 on Acyc-Neg family (logarithmic scale on both axes).} +\end{center} + +On Grid-NHard and Grid-PHard families (graphs with cycles designed to be hard for algorithms that exploit graph structure) +both LAU and LAU1 are very slow (though approximation suggests polynomial, not exponential fit), +while GOR1 is fast: + +\begin{center} +\includegraphics[width=\linewidth]{img/plot_grid_nhard.png} +\nolinebreak[4] +\\\footnotesize{Behavior of LAU, LAU1 and GOR1 on Grid-NHard family.} +\end{center} + +\begin{center} +\includegraphics[width=\linewidth]{img/plot_grid_nhard_logscale.png} +\nolinebreak[4] +\\\footnotesize{Behavior of LAU, LAU1 and GOR1 on Grid-NHard family (logarithmic scale on both axes).} +\end{center} + +On other graph families all three algorithms behave quite well; +it is strange that LAU is fast on Acyc-Pos family, while being so slow on Acyc-Neg family. +See also [NonPalXue00]: they study two modifications of GOR1, one of which is very close to LAU1, +and conjecture (without a proof) that worst-case complexity is exponential. + +%\end{multicols} +%\begin{minipage}{\linewidth} +%\begin{center}\includegraphics[width=\linewidth]{img/plot_acyc_neg_both.png} +%\\ +%\footnotesize{Behavior of LAU, LAU1 and GOR algorithms on Acyc-Neg family +%(left -- normal scale, right -- logarithmic scale on both axes).} +%\end{center} +%\end{minipage} +%\begin{minipage}{\linewidth} +%\begin{center}\includegraphics[width=\linewidth]{img/plot_grid_nhard_both.png} +%\\ +%\footnotesize{Behavior of LAU, LAU1 and GOR algorithms on Grid-NHard family +%(left -- normal scale, right -- logarithmic scale on both axes).} +%\end{center} +%\end{minipage} +%\\ +%\begin{multicols}{2} + +\section{Disambiguation}\label{section_disambiguation} + +In section \ref{section_tagged_extension} we defined disambiguation policy as strict partial order on the T-languge of the given TRE. +In practice T-language may be very large or infinite +and explicit listing of all ambiguous pairs is not an option; we need a comparison algorithm. +There are two main approaches: structure-based and value-based. +Structure-based disambiguation is guided by the order of operators in RE; tags play no role in it. +Value-based disambiguation is the opposite: it is defined in terms of maximization/minimization of certain tag parameters. +As a consequence, it has to deal with conflicts between different tags --- +a complication that never arises for structure-based approach. +Moreover, in value-based disambiguation different tags may have different rules and relations. +Below is a summary of two real-world policies supported by RE2C: +\\ + +\begin{itemize} + \setlength{\parskip}{0.5em} + \item Leftmost greedy. + Match the longest possible prefix of the input string + and take the \emph{leftmost path} through RE that corresponds to this prefix: + in unions prefer left alternative, in iterations prefer re-iterating. + + \item POSIX. + Each subexpression including the RE itself should match as early as possible + and span as long as possible, while not violating the whole match. + Subexpressions that start earlier in RE have priority over those starting later. + Empty match is considered longer than no match; + repeated empty match is allowed only for non-optional repetitions. + \\ +\end{itemize} + +As we have already seen, a sufficient condition for efficient TNFA simulation is that the policy is prefix-based. +What about determinization? +In order to construct TDFA we must be able to fold loops: +if there is a nonempty loop in TNFA, determinization must eventually construct a loop in TDFA +(otherwise it won't terminate). +To do this, determinization must establish \emph{equivalnce} of two TDFA states. +%We cannot define equivalence as exact coincidence: if there is a loop, histories in one state are prefixes of histories in the other. +%But we can use a weaker definition: +From disambiguation point of view equivalence means that all ambiguities stemming from one state +are resolved in the same way as ambiguities stemming from the other. +However, we cannot demand exact coincidence of all state attributes engaged in disambiguation: +if there is loop, attributes in one state are extensions of those in the other state (and hence not equal). +Therefore we need to abstract away from absolute paths and define ``ambiguity shape'' of each state: relative order on all its configurations. +Disambiguation algorithm must be defined in terms of relative paths, not absolute paths. +Then we could compare states by their orders. +If disambiguation policy can be defined in this way, we call it \emph{foldable}. +\\ + +In subsequent sections we will formally define both policies in terms of comparison of ambiguous T-strings +and show that each policy is prefix-based and foldable. + +\subsection{Leftmost greedy} + +Leftmost greedy policy was extensively studied by many authors; we will refer to [Gra15], as their setting is very close to ours. +We can define it as lexicographic order on the set of all bitcodes corresponding to ambiguous paths +(see [Gra15], definition 3.25). +Let $\pi_1$, $\pi_2$ be two ambiguous paths which induce T-strings $x \Xeq \XT(\pi_1)$, $y \Xeq \XT(\pi_2)$ +and bitcodes $a \Xeq \XB(\pi_1)$, $b \Xeq \XB(\pi_2)$. +Then $x \prec y$ iff $\prec_{lexicographic} (a, b)$: +\\ + + $\prec_{lexicographic} (a_1 \dots a_n, b_1 \dots b_m)$ + \hrule + \begin{enumerate}[leftmargin=0in] + \smallskip + \item[] for $i \Xeq \overline{1, min(n, m)}$: + \begin{enumerate} + \item[] if $a_i \!\neq\! b_i$ return $a_i \!<\! b_i$ + \end{enumerate} + \item[] return $n \!<\! m$. + \\ + \end{enumerate} + \bigskip + +This definition has one caveat: the existence of minimal element is not guaranteed for TRE that contain $\epsilon$-loops. +For example, TNFA for $\epsilon^+$ has infinitely many ambiguous paths with bitcodes +of the form $\widehat{0}^n \widehat{1}$, where $n \!\geq\! 0$, +and each bitcode is lexicographically less than the previous one. +Paths that contain $\epsilon$-loops are called \emph{problematic} (see [Gra15], definition 3.28). +If we limit ourselves to non-problematic paths (e.g. by cancelling loops in $\epsilon$-closure), +then the minimal element exists and bitcodes are well-ordered. +%The following lemma states an important property of bitcodes induced by paths gathered by $\epsilon$-closure: + +\begin{XLem}\label{lemma_bitcodes} +Let $\Pi$ be a set of TNFA paths that have common start state, induce the same S-string and end in a core state. +Then the set of bitcodes induced by paths in $\Pi$ is prefix-free +(compare with [Gra15], lemma 3.1). + +\medskip + +Proof. +Consider paths $\pi_1$ and $\pi_2$ in $\Pi$, +and suppose that $\XB(\pi_1)$ is a prefix of $\XB(\pi_2)$. +Then $\pi_1$ must be a prefix of $\pi_2$: otherwise there is a state where $\pi_1$ and $\pi_2$ diverge, +and by TNFA construction all outgoing transitions from this state have different priorities, +which contradicts the equality of bitcodes. +Let $\pi_2 \Xeq \pi_1 \pi_3$. +Since $\XS(\pi_1) \Xeq \XS(\pi_2)$, and since $\XS(\rho\sigma) \Xeq \XS(\rho)\XS(\sigma)$ for arbitrary path $\rho\sigma$, +it must be that $\XS(\pi_3) \Xeq \epsilon$. +The end state of $\pi_2$ is a core state: by TNFA construction it has no outgoing $\epsilon$-transitions. +But it is also the start state of $\epsilon$-path $\pi_3$, therefore $\pi_3$ is an empty path and $\pi_1 \Xeq \pi_2$. +$\square$ +\end{XLem} + +From Lemma \ref{lemma_bitcodes} it easily follows that leftmost greedy disambiguation is prefix-based. +Consider ambiguous paths $\pi_1$, $\pi_2$ and arbitrary suffix $\pi_3$, +and let $\XB(\pi_1) \Xeq a$, $\XB(\pi_2) \Xeq b$, $\XB(\pi_3) \Xeq c$. +Note that $\XB(\rho\sigma) \Xeq \XB(\rho)\XB(\sigma)$ for arbitrary path $\rho\sigma$, +therefore $\XB(\pi_1\pi_3) \Xeq ac$ and $\XB(\pi_2\pi_3) \Xeq bc$. +If $a \Xeq b$, then $ac \Xeq bc$. +Otherwise, without loss of generality let $a \prec_{lexicographic} b$: since $a$, $b$ are prefix-free, $ac \prec_{lexicographic} bc$ +(compare with [Gra15], lemma 2.2). +\\ + +From Lemma \ref{lemma_bitcodes} it also follows that leftmost greedy disambiguation is foldable: +prefix-free bitcodes can be compared incrementally on each step of simulation. +We define ``ambiguity shape'' of TDFA state as lexicographic order on bitcodes of all paths represented by configurations +(compare with [Gra15], definition 7.14). +The number of different weak orderings of $n$ elements is finite, therefore determinization terminates +(this number equals $\sum_{k=0}^n \Xstirling{n}{k} k!$, also known as the \emph{ordered Bell number} [??]). +Order on configurations is represented with ordinal numbers assigned to each configuration. +Ordinals are initialized to zero and then updated on each step of simulation by comparing bitcodes. +Bitcodes are compared incrementally: +first, by ordinals calculated on the previous step, then by bitcode fragments added by the $\epsilon$-closure. +\\ + +%\begin{minipage}{\linewidth} + $\prec_{leftmost \Xund greedy} ((n, a), (m, b))$ + \hrule + \begin{enumerate}[leftmargin=0in] + \smallskip + \item[] if $n \!\neq\! m$ return $n \!<\! m$ + \item[] return $\prec_{lexicographic} (a, b)$ + \\ + \end{enumerate} +%\end{minipage} + + \bigskip + +%\begin{minipage}{\linewidth} + $ordinals (\{(q_i, o_i, x_i)\}_{i=1}^n)$ + \hrule + \begin{enumerate}[leftmargin=0in] + \smallskip + \item[] $\{(p_i, B_i)\} \Xset $ sort $\{(i, (o_i, x_i))\}$ by second component \\ + \hphantom{hspace{2em}} using $\prec_{leftmost \Xund greedy}$ as comparator + \item[] $\widetilde{o}_{p_1 t} \Xset 0, \; j \Xset 0$ + \item[] for $i \Xeq \overline{2, n}$: + \begin{enumerate} + \item[] if $B_{i-1} \!\neq\! B_i: j \Xset j \!+\! 1$ + \item[] $\widetilde{o}_{p_i t} \Xset j$ + \end{enumerate} + \item[] return $\{(q_i, \widetilde{o}_i, x_i)\}_{i=1}^n$ + \\ + \end{enumerate} +%\end{minipage} + + \bigskip + +In practice explicit calculation of ordinals and comparison of bitcodes is not necessary: +if we treat TDFA states as ordered sets, +sort TNFA transitions by their priority +and define $\epsilon$-closure as a simple depth-first search, +then the first path that arrives at any state would be the leftmost. +This approach is taken in e.g. [Karper]. +Since tags are not engaged in disambiguation, +we can use paired tags that represent capturing parenthesis, or just standalone tags --- this makes no difference with leftmost greedy policy. + +\subsection{POSIX} + +POSIX policy is defined in [??]; [Fow] gives a comprehensible interpretation of it. +We will give a formal interpretation in terms of tags; +it was first described by Laurikari in [Lau01], but the key idea must be absolutely attributed to Kuklewicz [??]. +He never fully formalized his algorithm, and our version slightly deviates from the informal description, +so all errors should be attributed to the author of this paper. +Fuzz-testing RE2C against Regex-TDFA revealed no difference in submatch extraction +(see section ?? for details). +\\ + +Consider an arbitrary RE without tags, +and suppose that parenthesized subexpressions are marked for submatch extraction. +We start by enumerating all subexpressions according to POSIX standard: + + \begin{Xdef} + For a given RE $e$, its \emph{indexed RE (IRE)} is $(\widetilde{e}, n \!-\! 1)$, + where $(\widetilde{e}, n) \Xeq \XI(e, 1)$ + and $\XI$ is defined as follows: + \begin{align*} + \XI(\emptyset, i) &= ((i, \emptyset), i \!+\! 1) \\ + \XI(\epsilon, i) &= ((i, \epsilon), i \!+\! 1) \\ + \XI(\alpha, i) &= ((i, \alpha), i \!+\! 1) \\ + \XI(e_1 | e_2, i) &= ((i, \widetilde{e_1} | \widetilde{e_2}), k) \\ + \text{where } + & (\widetilde{e_1}, j) \Xeq \XI(e_1, i \!+\! 1), + \; (\widetilde{e_2}, k) \Xeq \XI(e_2, j \!+\! 1) \\ + \XI(e_1 e_2, i) &= ((i, \widetilde{e_1} \widetilde{e_2}), k) \\ + \text{where } + & (\widetilde{e_1}, j) \Xeq \XI(e_1, i \!+\! 1), + \; (\widetilde{e_2}, k) \Xeq \XI(e_2, j \!+\! 1) \\ + \XI(e^{n,m}, i) &= ((i, \widetilde{e}^{n,m}), j) \\ + \text{where } & (\widetilde{e}, j) \Xeq \XI(e, i \!+\! 1) + \end{align*} + $\square$ + \end{Xdef} + +Next, we rewrite IRE into TRE by rewriting each indexed subexpression $(i, e)$ +into tagged subexpression $t_1 e \, t_2$, where $t_1 \Xeq 2i \!-\! 1$ is the \emph{start tag} +and $t_2 \Xeq 2i$ is the \emph{end tag}. +Tags that correspond to iteration subexpressions are called \emph{orbit} tags. +\\ + +Strictly speaking, IRE is not necessary: it's just a consise way of enumerating tags. +For example, RE $a^* (b | \epsilon)$ corresponds to IRE +$(1, + (2, (3, a)^*) + (4, (5, b) | (6, \epsilon)) +)$ +and to TRE +$(1\, + 3\, (5\, a \,6)^* \,4\, + 7\, (9\, b \,10 | 11\, \epsilon \,12) 8\, +2)$. +\\ + +POSIX disambiguation is hierarchical: +it starts with the first subexpression and traverses subexpressions in order of their indices. +For each subexpression it compares positions of start and end tags in the two given T-strings. +Positions are called \emph{offsets}; each offset is either $\varnothing$ (if the occurence of tag is negative), +or equal to the number of $\Sigma$-symbols before this occurence. +The sequence of offsets is called \emph{history}. +Each history consists of one or more \emph{subhistories}: +they correspond to longest continuous substrings not interrupted by tags of subexpressions with lower indices. +For non-iteration subexpressions subhistories contain exactly one offset; +for iteration subexpressions they are either $\varnothing$, or may contain multiple non-$\varnothing$ offsets. +If disambiguation is between T-string prefixes, then the last subhistory may be incomplete or empty. +The following algorithm constructs a list of subhistories for the given T-string (possibly prefix) and tag. +Its complexity is $O(n)$, since it processes each symbol at most once: +\\ + +%\begin{minipage}{\linewidth} + $history(a_1 \dots a_n, t)$ + \hrule + \begin{enumerate}[leftmargin=0in] + \smallskip + \item[] $U \Xset \{ u \mid u < 2 \lceil t / 2 \rceil \!-\! 1 \}$ + \item[] $i \Xset 1, \; j \Xset 1, \; p \Xset 0$ + + \item[] while $true$ + \begin{enumerate} + + \item[] while $i \leq n$ and $a_i \!\not\in\! \{t, \Xbar{t}\}$ + \begin{enumerate} + \item[] if $a_i \Xin \Sigma: p \Xset p \!+\! 1$ + \item[] $i \Xset i \!+\! 1$ + \end{enumerate} + + \item[] while $i \leq n$ and $a_i \!\not\in\! (U \cup \Xbar{U})$ + \begin{enumerate} + \item[] if $a_i \Xin \Sigma: p \Xset p \!+\! 1$ + \item[] if $a_i \Xeq t: A_j \Xset A_j p$ + \item[] if $a_i \Xeq \Xbar{t}: A_j \Xset A_j \varnothing$ + \item[] $i \Xset i \!+\! 1$ + \end{enumerate} + + \item[] if $i \!>\! n$ break + \item[] $j \Xset j \!+\! 1$ + + \end{enumerate} + \item[] return $A_1 \dots A_j$ + \end{enumerate} +%\end{minipage} + + \bigskip + +Because of the hierarchical structure of POSIX disambiguation, if comparison reaches $i$-th subexpression, +it means that all subexpressions with lower indices have already been considered and their histories coincide. +Consequently for start and end tags of $i$-th subexpression +the number of subhistories in the compared T-strings must be equal. +If comparison is between prefixes, last subhistory of start tag may contain one more offset than last suhistory of end tag: +in this case we assume that the missing offset if $\infty$ (as it must be greater than any offset in this history). +Given all that, POSIX disambiguation for TRE with $N$ subexpressions is defined as follows: +\\ + +%\begin{minipage}{\linewidth} + $\prec_{POSIX}(x, y)$ + \hrule + \begin{enumerate}[leftmargin=0in] + \smallskip + \item[] for $t \Xeq \overline{1, N}$: + \begin{enumerate} + \item[] $A_1 \dots A_n \Xset history(x, 2t \!-\! 1)$ + \item[] $C_1 \dots C_n \Xset history(x, 2t)$ + \item[] $B_1 \dots B_n \Xset history(y, 2t \!-\! 1)$ + \item[] $D_1 \dots D_n \Xset history(y, 2t)$ + \item[] for $i \Xeq \overline{1, n}$: + \begin{enumerate} + \item[] let $A_i \Xeq a_1 \dots a_m$, $C_i \Xeq c_1 \dots c_{\widetilde{m}}$ + \item[] let $B_i \Xeq b_1 \dots b_k$, $D_i \Xeq d_1 \dots d_{\widetilde{k}}$ + \item[] if $\widetilde{m} \!<\! m: c_m \Xset \infty$ + \item[] if $\widetilde{k} \!<\! k: d_k \Xset \infty$ + \item[] for $j \Xeq \overline{1, min(m, k)}$: + \begin{enumerate} + \item[] if $a_j \!\neq\! b_j$ return $a_j \!<\! b_j$ + \item[] if $c_j \!\neq\! d_j$ return $c_j \!>\! d_j$ + \end{enumerate} + \item[] if $m \!\neq\! k$ return $m \!<\! k$ + \end{enumerate} + \end{enumerate} + \item[] return $false$ + \\ + \end{enumerate} +%\end{minipage} + + \bigskip + +It's not hard to show that $\prec_{POSIX}$ is prefix-based. +Consider $t$-th iteration of the algorithm and let $s \Xeq 2t \!-\! 1$ be the start tag, +$history(x, s) \Xeq A_1 \dots A_n$ and $history(y, s) \Xeq B_1 \dots B_n$. +The value of each offset depends only on the number of preceding $\Sigma$-symbols, +therefore for an arbitrary suffix $z$ we have: +$history(xz, s) \Xeq A_1 \dots A_{n-1} A'_n C_1 \dots C_n$ and +$history(yz, s) \Xeq B_1 \dots B_{n-1} B'_n C_1 \dots C_n$, +where $A'_n \Xeq A_n c_1 \dots c_m$, $B'_n \Xeq B_n c_1 \dots c_m$. +The only case when $z$ may affect comparison is when $m \!\geq\! 1$ and one history is a proper prefix of the other: +$A_i \Xeq B_i$ for all $i \Xeq \overline{1,n-1}$ and (witout loss of generality) $B_n \Xeq A_n b_1 \dots b_k$. +Otherwise either histories are equal, or comparison terminates before reaching $c_1$. +Let $d_1 \dots d_{k+m} \Xeq b_1 \dots b_k c_1 \dots c_m$. +None of $d_j$ can be $\varnothing$, because $n$-th subhistory contains multiple offsets. +Therefore $d_j$ are non-decreasing and $d_j \!\leq\! c_j$ for all $j \Xeq \overline{1, m}$. +Then either $d_j \!<\! c_j$ at some index $j \!\leq\! m$, or $A'_n$ is shorter than $B'_n$; in both cases comparison result is unchanged. +The same reasoning holds for the end tag. +\\ + +It is less evident that $\prec_{POSIX}$ is foldable: +the rest of this chapter is a long and tiresome justification of Kuklewicz algorithm +(with a coulple of modifications and ideas by the author). +\\ + +First, we simplify $\prec_{POSIX}$. +It makes a lot of redundant checks: +for adjacent tags the position of the second tag is fixed on the position of the first tag. +In particular, comparison of the start tags $a_j$ and $b_j$ is almost always redundant. +If $j \!>\! 1$, then $a_j$ and $b_j$ are fixed on $c_{j-1}$ and $d_{j-1}$, which have been compared on the previous iteration. +If $j \Xeq 1$, then $a_j$ and $b_j$ are fixed on some higher-priority tag which has already been checked, unless $t \Xeq 1$. +The only case when this comparison makes any difference is when $j \Xeq 1$ and $t \Xeq 1$: +the very first position of the whole match. +In order to simplify further discussion we will assume that the match is anchored; +otherwise one can handle it as a special case of comparison algorithm. +The simplified algorithm looks like this: +\\ + +%\begin{minipage}{\linewidth} + $\prec_{POSIX}(x, y)$ + \hrule + \begin{enumerate}[leftmargin=0in] + \smallskip + \item[] for $t \Xeq \overline{1, N}$: + \begin{enumerate} + \item[] $A_1 \dots A_n \Xset history(x, 2t)$ + \item[] $B_1 \dots B_n \Xset history(y, 2t)$ + \item[] for $i \Xeq \overline{1, n}$: + \begin{enumerate} + \item[] if $A_i \!\neq\! B_i: return \prec_{subhistory} (A_i, B_i)$ + \end{enumerate} + \end{enumerate} + \item[] return $false$ + \\ + \end{enumerate} +%\end{minipage} + + \bigskip + +%\begin{minipage}{\linewidth} + $\prec_{subhistory} (a_1 \dots a_n, b_1 \dots b_m)$ + \hrule + \begin{enumerate}[leftmargin=0in] + \smallskip + \item[] for $i \Xeq \overline{1, min(n, m)}$: + \begin{enumerate} + \item[] if $a_i \!\neq\! b_i$ return $a_i \!>\! b_i$ + \end{enumerate} + \item[] return $n \!<\! m$. + \\ + \end{enumerate} +%\end{minipage} + + \bigskip + +Next, we explore the structure of ambigous paths that contain multiple subhistories +and show that (under ceratin conditions) such paths can be split into ambiguous subpaths, +one per each subhistory. +\\ + +\begin{XLem}\label{lemma_path_decomposition} +For a POSIX TRE $e$, +if $a$, $b$ are ambiguous paths in TNFA $\XN(e)$, such that $\XT(a) \Xeq x$, $\XT(b) \Xeq y$, +$t$ is a tag such that $history(x, u) \Xeq history(y, u)$ for all $u \!<\! t$ +and $history(x, t) \Xeq A_1 \dots A_n$, $history(y, t) \Xeq B_1 \dots B_n$, +then $a$, $b$ can be decomposed into path segments $a_1 \dots a_n$, $b_1 \dots b_n$, +such that for all $i \!\leq\! n$ paths $a_1 \dots a_i$, $b_1 \dots b_i$ are ambiguous +and $history(\XT(a_1 \dots a_i), t) \Xeq A_1 \dots A_i$, $history(\XT(b_1 \dots b_i), t) \Xeq B_1 \dots B_i$. +\\ +\\ +Proof is by induction on $t$ and relies on the construction of TNFA given in Theorem \ref{theorem_tnfa}. +Induction basis is $t \Xeq 1$ and $t \Xeq 2$ (start and end tags of the topmost subexpression): let $n \Xeq 1$, $a_1 \Xeq a$, $b_1 \Xeq b$. +Induction step: suppose that lemma is true for all $u \!<\! t$, +and for $t$ the conditions of lemma are satisfied. +Let $r$ be the start tag of a subexpression in which $t$ is immediately enclosed. +Since $r \!<\! t$, the lemma is true for $r$ by inductive hypothesis; +%let $history(x, r) \Xeq C_1 \dots C_m$, $history(y, r) \Xeq D_1 \dots D_m$ and +let $c_1 \dots c_m$, $d_1 \dots d_m$ be the corresponding path decompositions. +Each subhistory of $t$ is covered by some subhistory of $r$ (by definition $history$ doesn't break at lower-priority tags), +therefore decompositions $a_1 \dots a_n$, $b_1 \dots b_n$ can be constructed as a refinement of $c_1 \dots c_m$, $d_1 \dots d_m$. +If $r$ is a non-orbit tag, each subhistory of $r$ contains exactly one subhistory of $t$ +and the refinement is trivial: $n \Xeq m$, $a_i \Xeq c_i$, $b_i \Xeq d_i$. +Otherwise, $r$ is an orbit tag and single subhistory of $r$ may contain multiple subhistories of $t$. +Consider path segments $c_i$ and $d_i$: +since they have common start and end states, and since they cannot contain tagged transitions with higher-priority tags, +both must be contained in the same subautomaton of the form $F^{k,l}$ (possibly $l \Xeq \infty$). +This subautomaton itself consists of one or more subautomata for $F$ each starting with an $r$-tagged transition; +let the start state of each subautomaton be a breaking point in the refinement of $c_i$ and $d_i$. +By construction of TNFA the number of iterations through $F^{k,l}$ uniquely determins the order of subautomata traversal +(automaton corresponding to $(j \!+\! 1)$-th iteration is only reachable from the one corresponding to $j$-th iteration). +Since $history(x, r) \Xeq history(y, r)$, the number of iterations is equal and +therefore breaking points coincide. +$\square$ +\end{XLem} + +Lemma \ref{lemma_path_decomposition} has the following implication. +Suppose that at $p$-th step of TNFA simulation we are comparing histories $A_1 \dots A_n$, $B_1 \dots B_n$. +Let $j \!\leq\! n$ be the greatest index such that $A_1 \dots A_j$, $B_1 \dots B_j$ end before $p$-th position in the input string +(it is the same index for both histories because higher-priority tags coincide). +Then $A_i \Xeq B_i$ for all $i \!\leq\! j$: +by Lemma \ref{lemma_path_decomposition} $A_1 \dots A_j$, $B_1 \dots B_j$ +correspond to ambiguous subpaths which must have been compared on some previous step of the algorithm. +This means that we only need to compare $A_{j+1} \dots A_n$ and $B_{j+1} \dots B_n$. +Of them only $A_{j+1}$ and $B_{j+1}$ may start before $p$-th position in the input string: +all other subhistories belong to current $\epsilon$-closure (though $A_n$, $B_n$ may not end in it). +Therefore between steps of simulation we need to remeber only the last (possibly incomplete) subhistory of each tag. +\\ + +Now we can define ``ambiguity shape'' of TDFA state: +we define it as a set of orders, one for each tag, on the last subhistories of this tag in this state. +Of course, comparison only makes sense for subhistories that correspond to ambiguous paths and prefixes of ambiguous paths, +and in general we do not know which prefixes will cause ambiguity on subsequent steps. +Therefore some comparisons may be meaningless, incorrect and unjustified. +However, they do not affect valid comparisons, +and they do not cause disambiguation errors: their results are never used. +At worst they can prevent state merging. +As with leftmost greedy policy, the number of different orders is finite +and therefore determinization terminates. +\\ + +Consider subhistories for which comparison is valid. +Comparison algorithm differs for orbit and non-orbit tags. +Orbit subhistories can be compared incrementally: +if at some step we determine that $A \prec B$, then it will be true ever after, no matter what values are added to $A$ and $B$. +(This can be proven by induction on the number of steps +and using the fact that $\varnothing$ can be added only at the first step, +by TNFA construction for the case of zero iterations). +Therefore we can use the results of comparison on the previous step and compare only the added parts of subhistories. +For non-orbit tags incremental comparison doesn't work: +subhistories consist of a single value, but different paths may discover it at different steps, +and the later value may turn to be either $\varnothing$ or not. +However, a single value cannot be spread across multiple steps: +it either belongs to current $\epsilon$-closure or to some earlier step. +If both values belong to earlier steps, we can use results of the previous comparison; +it they both belong to $\epsilon$-closure, they are equal; +otherwise the one from the $\epsilon$-closure is better. +\\ + +Orders on configurations are represented with vectors of ordinal numbers (one per tag) assigned to each configuration. +Ordinals are initialized to zero and updated on each step of simulation by comparing tag histories. +Histories are compared using ordinals calculated on the previous step and T-string fragments added by $\epsilon$-closure. +Ordinals are assigned in decreasing order, so that they can be compared in the same way as offsets: greater means better. +\\ + +%\begin{minipage}{\linewidth} + $ordinals (\{(q_i, o_i, x_i)\}_{i=1}^n)$ + \hrule + \begin{enumerate}[leftmargin=0in] + \smallskip + \item[] for $t \Xeq \overline{1, N}$: + \begin{enumerate} + \item[] for $i \Xeq \overline{1, n}$: + \begin{enumerate} + \item[] $A_1 \dots A_m \Xset \epsilon \Xund history(x_i, t)$ + \item[] $B_i \Xset A_m$ + \item[] if $m \Xeq 1$ and ($t$ is an orbit tag or $B_i \Xeq \epsilon$) + \begin{enumerate} + \item[] $B_i \Xset o_{i t} B_i$ + \end{enumerate} + \end{enumerate} + \smallskip + \item[] $\{(p_i, C_i)\} \Xset $ sort $\{(i, B_i)\}$ by second component \\ + \hphantom{\quad} using inverted $\prec_{subhistory}$ as comparator + \item[] $\widetilde{o}_{p_1 t} \Xset 0, \; j \Xset 0$ + \item[] for $i \Xeq \overline{2, n}$: + \begin{enumerate} + \item[] if $C_{i-1} \!\neq\! C_i: j \Xset j \!+\! 1$ + \item[] $\widetilde{o}_{p_i t} \Xset j$ + \end{enumerate} + \end{enumerate} + \smallskip + \item[] return $\{(q_i, \widetilde{o}_i, x_i)\}_{i=1}^n$ + \\ + \end{enumerate} +%\end{minipage} + + \bigskip + +The $history$ algorithm is modified so that it works on T-string fragments added by the $\epsilon$-closure. +Non-$\varnothing$ offsets are set to $\infty$, since all tags in the $\epsilon$-closure have the same position +which must be greater than any ordinal calculated on the previous step. +\\ + +%\begin{minipage}{\linewidth} + $\epsilon \Xund history (a_1 \dots a_n, t)$ + \hrule + \begin{enumerate}[leftmargin=0in] + \smallskip + \item[] $U \Xset \{ u \mid u < 2 \lceil t / 2 \rceil \!-\! 1 \}$ + \item[] $i \Xset 1, \; j \Xset 1$ + + \item[] while $true$ + \begin{enumerate} + \item[] while $i \leq n$ and $a_i \!\not\in\! (U \cup \Xbar{U})$ + \begin{enumerate} + \item[] if $a_i \Xeq t: A_j \Xset A_j \infty$ + \item[] if $a_i \Xeq \Xbar{t}: A_j \Xset A_j \varnothing$ + \item[] $i \Xset i \!+\! 1$ + \end{enumerate} + + \item[] if $i \!>\! n$ break + \item[] $j \Xset j \!+\! 1$ + + \item[] while $i \leq n$ and $a_i \!\not\in\! \{t, \Xbar{t}\}$ + \begin{enumerate} + \item[] $i \Xset i \!+\! 1$ + \end{enumerate} + + \end{enumerate} + \item[] return $A_1 \dots A_j$ + \end{enumerate} +%\end{minipage} + + \bigskip + +Finally, disambiguation algorithm is redefined in terms of ordinals and added T-string fragments: +\\ + +%\begin{minipage}{\linewidth} + $\prec_{POSIX}((ox, x), (oy, y))$ + \hrule + \begin{enumerate}[leftmargin=0in] + \smallskip + \item[] for $t \Xeq \overline{1, N}$: + \begin{enumerate} + \item[] $A_1 \dots A_n \Xset \epsilon \Xund history(x, 2t), \; a \Xset ox_{2t}$ + \item[] $B_1 \dots B_n \Xset \epsilon \Xund history(y, 2t), \; b \Xset oy_{2t}$ + + \item[] if $2t$ is an orbit tag: + \begin{enumerate} + \item[] $A_1 \Xset a A_1$ + \item[] $B_1 \Xset b B_1$ + \end{enumerate} + \item[] else + \begin{enumerate} + \item[] if $A_1 \Xeq \epsilon: A_1 \Xset a$ + \item[] if $B_1 \Xeq \epsilon: B_1 \Xset b$ + \end{enumerate} + + \item[] for $i \Xeq \overline{1, n}$: + \begin{enumerate} + \item[] if $A_i \!\neq\! B_i: return \prec_{subhistory} (A_i, B_i)$ + \end{enumerate} + + \end{enumerate} + \item[] return $false$ + \\ + \end{enumerate} +%\end{minipage} + + \bigskip + +So far we have treated all subexpressions uniformly as if they were marked for submatch extraction. +In practice most of them are not: we can reduce the amount of tags by dropping all tags in subexpressions without nested submatches +(since no other tags depend on them). +However, all the hierarchy of tags from the topmost subexpression down to each submatch must be preserved, +including \emph{fictive} tags that don't correspond to any submatch and exist purely for disambiguation purposes. +They are probably not many: POSIX RE use the same operator for grouping and submatching, +and compound expressions usually need grouping to override operator precedence, +so it is uncommon to construct a large RE without submatches. +%(otherwise union cannot be enclosed in concatenation and repetition of non-atomic subexpressions cannot be used at all). +However, fictive tags must be inserted into RE; neither Laurikari nor Kuklewicz mention it, +but both their libraries seem to do it (judging by the source code). +\\ + +In this respect TDFA-based matchers have an advantage over TNFA-based ones: +disambiguation happens at determinization time, +and afterwards we can erase all fictive tags -- the resulting TDFA will have no overhead. +However, if it is necessary to reduce the amount of tags at all costs (even at disambiguation time), +then fictive tags can be dropped and the algorithm modified as follows. +Each submatch should have two tags (start and end) +and repeated submatches should also have a third (orbit) tag. +Start and end tags should be maximized, if both conflicting subhistories are non-$\varnothing$; +otherwise, if only one is $\varnothing$, leftmost path should be taken; +if both are $\varnothing$, disambiguation should continue with the next tag. +Orbit tags obey the same rules as before. +The added complexity is caused by the possible absence of tags in the left part of union and concatenation. +We won't go into further details, as the modified algorithm is probably not very useful; +but an exprimental implementation in RE2C passed all the tests in [??]. +Correctness proof might be based on the limitations of POSIX RE due to the coupling of groups and submatches. + +\section{Determinization}\label{section_determinization} + +When discussing TNFA simulation we paid little attention to tag value functions: +decomposition must wait until disambiguation, which is defined on T-strings, +and in general this means waiting until the very end of simulation. +However, since then we have studied leftmost greedy and POSIX policies more closely +and established that both are prefix-based and foldable. +This makes them suitable for determinization, but also opens possibilities for more efficient simulation. +In particular, there's no need to remember the whole T-string for each active path: +we only need ordinals and the most recent fragment added by the $\epsilon$-closure. +All the rest can be immediately decomposed into tag value function (or any other suitable representation). +Consequently, we extend configurations with vectors of \emph{tag values}: +in general, each value is an offset list of arbitrary length, +but in practice values may be single offsets or anything else. +\\ + +Laurikari determinization algorithm has the same basic principle as the usual powerset construction: +simulation of nondeterministic automaton on all possible inputs combined with merging of equivalent states. +The most tricky part is merging: extended configuration sets are no longer equal, as they contain absolute tag values. +%(in fact, they cannot coincide in case of tagged non-empty loops in TNFA). +In section \ref{section_disambiguation} we solved similar problem with respect to disambiguation +by moving from absolute T-strings to relative ordinals. +However, this wouldn't work with tag values, as we need the exact offsets. +Laurikari resolved this predicament using \emph{references}: +he noticed that we can represent tag values as cells in ``memory'' and address each value by reference to the cell that holds it. +If states $X$ and $Y$ are equal up to renaming of references, +then we can convert $X$ to $Y$ by copying the contents of cells in $X$ to the cells in $Y$. +The number of different cells needed at each step is finite: +it is bounded by the number of tags times the number of configurations in the given state. +Therefore ``memory'' can be modelled as a finite set of \emph{registers}, +which brings us to the following definition of TDFA: + + \begin{Xdef} + \emph{Tagged Deterministic Finite Automaton (TDFA)} + is a structure $(\Sigma, T, \YQ, \YF, Q_0, R, \delta, \zeta, \eta, \iota)$, where: + \begin{itemize} + \setlength{\parskip}{0.5em} + \item[] $\Sigma$ is a finite set of \emph{symbols} (\emph{alphabet}) + \item[] $T$ is a finite set of \emph{tags} + \item[] $\YQ$ is a finite set of \emph{states} + \item[] $\YF \subseteq \YQ$ is the set of \emph{final} states + \item[] $Q_0 \in \YQ$ is the \emph{initial} state + \item[] $R$ is a finite set of \emph{registers} + \item[] $\delta: \YQ \times \Sigma \to \YQ$ is the \emph{transition} function + \item[] $\zeta: \YQ \times \Sigma \times R \to R \times \YB^*$ \\ + is the \emph{register update} function + \item[] $\eta: \YF \times R \to R \times \YB^*$ \\ + is the \emph{register finalize} function + \item[] $\iota: R \to R \times \YB^*$ \\ + is the \emph{register initialize} function + \end{itemize} + where $\YB$ is the boolean set $\{0,1\}$. + $\square$ + \end{Xdef} + +Operations on registers have the form $r_1 \Xeq r_2 \cdot x$, where $x$ is a (possibly empty) boolean string +and $1$, $0$ denote \emph{current position} and \emph{default value}. +For example, $r_1 \Xeq 0$ means ``set $r_1$ to default value'', +$r_1 \Xeq r_2$ means ``copy $r_2$ to $r_1$'' and +$r_1 \Xeq r_1 1 1$ means ``append current position to $r_1$ twice''. +\\ + +TDFA definition looks very similar to the definition of +\emph{deterministic streaming string transducer (DSST)}, described by Alur and Cerny in [AluCer11]. +Indeed, the two kinds of automata are similar and have similar applications: DSSTs are used for RE parsing in [Gra15]. +However, their semantics is different: TDFA operates on tag values, while DSST operates on strings of the output language. +What is more important, DSST is \emph{copyless}: +its registers can be only \emph{moved}, not \emph{copied}. +TDFA violates this restriction, but this doesn't affect its performance as long as registers hold scalar values. +Fortunately, it is always possible to represent tag values as scalars +(single offsets are obviously scalar, and offset lists form a \emph{prefix tree} that can be stored as an array of pointers to parent, +as suggested in [Karper]). +\\ + +TDFA can be constructed in two slightly different ways +depending on whether we associate $\epsilon$-closure of each state with the \emph{incoming} transition, +or with all \emph{outgoing} transitions. +For the usual powerset construction it makes no difference, but things change in the presence of tagged transitions. +In the former case register operations are associated with the \emph{incoming} transition and should be executed \emph{after} it. +In the latter case they belong to each \emph{outgoing} transition and should be executed \emph{before} it, +which means that we can exploit the \emph{lookahead} symbol to filter out only the relevant part of $\epsilon$-closure: +pick only those $\epsilon$-paths which end states have transitions on the lookahead symbol. +This leaves out many useless register operations: +intuituvely, we delay their application until the right lookahead symbol shows up. +However, state mapping becomes more complex: +since the operations are delayed, +their effect on each state is not reflected in configurations at the time of mapping. +In order to ensure state equivalence we must additionaly demand exact coincidence of delayed operations. +\\ + +The two ways of constructing TDFA resemble slightly of LR(0) and LR(1) automata; we call them TDFA(0) and TDFA(1). +Indeed, we can define \emph{conflict} as a situation when tag has at least two different values in the given state. +Tags that induce no conflicts are \emph{deterministic}; +the maximal number of different values per state is the tag's \emph{degree of nondeterminism}. +Accordingly, \emph{tag-deterministic} RE are those for which it is possible to build TDFA without conflicts. +As with LR(0) and LR(1), many RE are tag-deterministic with respesct to TDFA(1), but not TDFA(0). +Unlike LR automata, TDFA with conflicts are correct, but they can be very inefficient: +%tags with high degree of nondeterminizm induce a lot of register operations. +the higher tag's degree of nondeterminism, the more registers it takes to hold its values, +and the more operations are required to manage these registers. +Determinstic tags need only a single register and can be implemented without copy operations. +\\ + +Laurikari used TDFA(0); we study both methods and argue that TDFA(1) is better. +Determinization algorithm is designed in a way that can handle both types of automata in a uniform way. +States are sets of configurations $(q, v, o, x)$, +where $q$ is a core TNFA state, $v$ is a vector of registers that hold tag values, $o$ is the ordinal +and $x$ is the T-string of the $\epsilon$-path by which $q$ was reached. +The last component, $x$, is used only by TDFA(1), as it needs to check coincidence of delayed register operations; +for TDFA(0) it is always $\epsilon$. +During construction of $\epsilon$-closure configurations are extended to the form $(q, v, o, x, y)$, +where $y$ is the new T-string: TDFA(0) immediately applies it to tag values, +but TDFA(1) applies $x$ and delays $y$ until the next step. +Registers are allocated for all new operations: +the same register may be used on multiple outgoing transitions for operations of the same tag, +but different tags never share registers. +Unlike Laurikari, we assume an infinite number of vacant registers and allocate them freely, not trying to reuse old ones; +this results in a more optimization-friendly automaton +which has a lot of short-lived registers with independent lifetimes. +Mapping of a newly constructed state $X$ to an existing state $Y$ checks coincidence of TNFA states, orders, delayed operations, +and constructs bijection between registers of $X$ and $Y$. +If $r_1$ in $X$ corresponds to $r_2$ in $Y$ (and they are not equal), then $r_1$ must be copied to $r_2$ on the transition to $X$ +(which will become transition to $Y$ after merging). +It may happen so that $r_1$ itself is a left-hand side of an operation on this transition: +in this case we simply substitute it with $r_2$ instead of copying. +Determinization algorithm can handle both POSIX and leftmost greedy policies, +but in the latter case it can be simplified to avoid explicit calculation of ordinals, as discussed in section \ref{section_disambiguation}. +\\ + +%Determinization algorithm is parameterized with a boolean flag that allows to switch between TDFA(0) and TDFA(1). + +% \begin{minipage}{\linewidth} + $determinization(\XN \Xeq (\Sigma, T, Q, F, q_0, T, \Delta), \ell)$ + \hrule + \begin{itemize}[leftmargin=0in] + \smallskip + \item[] $v(t) \Xeq 2t\!-\!1, + \; f(t) \Xeq 2t, + \; o(t) \Xeq 0$ + \item[] $maxreg \Xset 2|T|$, $newreg(o) \Xeq \bot$ + \item[] $(Q_0, \iota, maxreg, newreg) \\ + \hphantom{\hspace{2em}} \Xset closure(\XN, \ell, \{(q_0, v, o, \epsilon)\}, maxreg, newreg)$ + \item[] $\YQ \Xset \{ Q_0 \}, \; \YF \Xset \emptyset$ + \smallskip + \item[] while $\exists$ unmarked $X \Xin \YQ$ + \begin{itemize} + \item[] mark $X$ + \smallskip + \item[] $newreg(o) \Xeq \bot$ + \item[] for all $\alpha \in \Sigma$: + \begin{itemize} + \item[] $Y \Xset reach'(\Delta, X, \alpha)$ + \item[] $(Z, regops, maxreg, newreg) \\ + \hphantom{\hspace{2em}} \Xset closure(\XN, \ell, Y, maxreg, newreg)$ + \item[] if $\exists Z' \Xin \YQ \mid \bot\!\neq\!ops' \Xset map(Z', Z, T, regops)$ + \begin{itemize} + \item[] $(Z, regops) \Xset (Z', regops')$ + \end{itemize} + \item[] $\YQ \Xset \YQ \cup \{ Z \}$ + \item[] $\delta \Xset \delta \cup \{(X, \alpha, Z)\}$ + \item[] $\zeta \Xset \zeta \cup \{(X, \alpha, r_1, r_2, a) \mid (r_1, r_2, a) \Xin regops \}$ + \end{itemize} + \smallskip + \item[] if $\exists (q, v, o, x) \Xin X \mid q \Xin F$: + \begin{itemize} + \item[] $\YF \Xset \YF \cup \{ X \}$ + \item[] $\eta \Xset \eta \cup \{(X, f_t, v_t, h_t(x)) \mid t \Xin T\}$ + \end{itemize} + \end{itemize} + \smallskip + \item[] $R \Xset \{ 1, \dots, maxreg \}$ + \item[] return $(\Sigma, T, \YQ, \YF, Q_0, R, \delta, \zeta, \eta, \iota)$ + \\ \\ + \end{itemize} +% \end{minipage}\\ \\ + +% \begin{minipage}{\linewidth} + $map(X, Y, T, ops)$ + \hrule + \begin{itemize}[leftmargin=0in] + \smallskip + \item[] $V^x(t) \Xset \{v_t \mid (q, v, o, x) \Xin X \}$ + \item[] $V^y(t) \Xset \{v_t \mid (q, v, o, x) \Xin Y \}$ + \smallskip + \item[] if $\exists$ bijection $M: X \leftrightarrow Y$, such that + \begin{itemize} + \item[] $\forall t \Xin T\ \exists$ bijection $m_t: V^x_t \leftrightarrow V^y_t$ + \item[] and $\forall ((q, v, o, x), (\widetilde{q}, \widetilde{v}, \widetilde{o}, \widetilde{x})) \Xin M: \\ + \hphantom{\hspace{2em}} q \Xeq \widetilde{q} \wedge o \Xeq \widetilde{o} \wedge \forall t \Xin T: \\ + \hphantom{\hspace{4em}} (v_t, \widetilde{v}_t) \Xin m_t \wedge h_t(x) \Xeq h_t(\widetilde{x})$ + \smallskip + \item[] $m \Xset \bigcup_{t \in T} m_t$ + \item[] $ops_1 \Xset \{ (r_1, r_3, a) \mid (r_1, r_2) \Xin m \wedge (r_2, r_3, a) \Xin ops \}$ + \item[] $ops_2 \Xset \{ (r_1, r_2, \epsilon) \mid (r_1, r_2) \Xin m \wedge r_1 \!\neq\! r_2 \\ + \hphantom{hspace{2em}} \wedge \nexists r_3, a: (r_2, r_3, a) \Xin ops \}$ + \item[] return $ops_1 \cup ops_2$ + \end{itemize} + \smallskip + \item[] else return $\bot$ + \\ \\ + \end{itemize} +% \end{minipage}\\ \\ + +% \begin{minipage}{\linewidth} + $closure(\XN \Xeq (\Sigma, T, Q, F, q_0, T, \Delta), \\ + \hphantom{\hspace{2em}} lookahead, X, maxreg, newreg)$ + \hrule + \begin{itemize}[leftmargin=0in] + \smallskip + \item[] $Y \Xset \{(q, o, \epsilon) \mid (q, v, o, x) \Xin X \}$ + \item[] $Y \Xset closure' (Y, F, \Delta)$ + \item[] $Y \Xset ordinals (Y)$ + \item[] $Z \Xset \{(q, v, \widetilde{o}, x, y) \mid (q, v, o, x) \Xin X \wedge (q, \widetilde{o}, y) \Xin Y \}$ + + \item[] if not $lookahead$: + \begin{itemize} + \item[] $Z \Xset \{(q, v, o, y, \epsilon) \mid (q, v, o, x, y) \Xin Z \}$ + \end{itemize} + + \smallskip + \item[] $opsrhs \Xset \{ (t, v_t, h_t(x)) \mid \\ + \hphantom{\hspace{4em}} t \Xin T, (q, v, o, x, y) \Xin Z \wedge h_t(x)\!\neq\!\epsilon \}$ + + \item[] for all $o \Xin opsrhs \mid newreg(o) \Xeq \bot:$ + \begin{itemize} + \item[] $maxreg \Xset maxreg + 1$ + \item[] $newreg \Xset newreg \cup \{(o, maxreg)\}$ +% \item[] $newreg(\widetilde{o}) \Xeq +% \begin{cases} +% maxreg & \text{if } \widetilde{o} \Xeq o \\[-0.5em] +% newreg(o) & \text{otherwise} +% \end{cases}$ + \end{itemize} + + \item[] $X \Xset \{(q, \widetilde{v}, o, y) \mid (q, v, o, x, y) \Xin Z,\\ + \hphantom{\hspace{4em}} \widetilde{v}(t) \Xeq + \begin{cases} + newreg(t, v_t, h_t(x)) & \text{if } h_t(x)\!\neq\!\epsilon \\[-0.5em] + v_t & \text{otherwise} + \end{cases} \; \}$ + + \item[] $newops \Xset \{(newreg(o), r, a) \mid o \Xeq (t, r, a) \Xin opsrhs\}$ + + \item[] return $(X, newops, maxreg, newreg)$ + \\ \\ + \end{itemize} +% \end{minipage}\\ \\ + + +Functions $reach'$ and $closure'$ are exactly as +$reach$ and $closure \Xund goldberg \Xund radzik$ from section \ref{section_closure}, +except for the trivial adjustments to carry around ordinals and pass them into disambiguation procedure. +We use $h_t(x)$ to denote $H(t)$, where $H$ is decomposition of T-string $x$ into tag value function (definition \ref{tagvalfun}). +\\ + +Now let's see the difference between TDFA(0) and TDFA(1) on a series of small examples. +Each example contains a short description followed by five pictures: +TNFA and both kinds of TDFA, each in two forms: expanded and compact. +Expanded form shows the process of determinization. +States are tables: rows are configurations; first column is TNFA state; +subsequent columns are registers used for each tag. +TDFA(1) may have additional columns for lookahead tags (for TDFA(0) they are reflected in register versions). +Ordinals are omitted for brevity: in case of leftmost greedy policy they coincide with row indices. +Dotted states and transitions illustrate the process of mapping: +each dotted state has a transition to solid state (labeled with reordering operations). +Initializer and finalizers are also dotted. +Discarded ambiguous paths (if any) are shown in light grey. +Compact form shows the resulting unoptimized TDFA: many registers can be merged and assiciated operations reduced. +Alphabet symbols are shown as ASCII codes. +Operations take two forms: normal form $r_1 \Xeq r_2 x$ +and short form $r x$, which means ``set $r$ to $x$'' (it allows to skip register initialization). +Symbols $\uparrow$ and $\downarrow$ mean ``current position'' and ``default value''. +All graphs in this section are autogenerated with RE2C, so they reflect exactly the constructed automata. +By default we use leftmost greedy disambiguation, as it allows to study standalone tags and generate smaller pictures. +\\ + +The first example is $a^* 1 b^*$ (the TRE mentioned in the introduction). +It is deterministic with respect to TDFA(1), but not TDFA(0) +(nondeterminism degree is 2, as there are at most two different registers used in each state). +This example is very simple, but it shows an important use case: +finding the edge between two non-overlapping components of the input string. +As the pictures show, TDFA(0) behaves much worse than TDFA(1): +it pulls the operation inside of loop and repeatedly rewrites tag value on each iteration, +while TDFA(1) saves it only once, when the lookahead symbol changes from \texttt{a} to \texttt{b}. +\begin{center} +\includegraphics[width=\linewidth]{img/example1/tnfa.png}\\ +\footnotesize{TNFA for $a^* 1 b^*$.} \\ +\end{center} +\begin{center} +\includegraphics[width=0.8\linewidth]{img/example1/tdfa0_raw.png}\\ +\footnotesize{Construction of TDFA(0) for $a^* 1 b^*$.} \\ +\end{center} +\begin{center} +\includegraphics[width=0.6\linewidth]{img/example1/tdfa0.png}\\ +\footnotesize{Unoptimized TDFA(0) for $a^* 1 b^*$.} \\ +\end{center} +\begin{center} +\includegraphics[width=0.8\linewidth]{img/example1/tdfa1_raw.png}\\ +\footnotesize{Construction of TDFA(1) for $a^* 1 b^*$.} \\ +\end{center} +\begin{center} +\includegraphics[width=0.6\linewidth]{img/example1/tdfa1.png}\\ +\footnotesize{Unoptimized TDFA(1) for $a^* 1 b^*$.} \\ +\end{center} + +The next example is $a^* 1 a^* a$ --- the same TRE that Lauriakri used to explain his algorithm. +It has a modest degree of nondeterminism: 2 for TDFA(1) and 3 for TDFA(0). +Compare TDFA(0) with figure 3 from [Lau00]: it the same automaton up to a minor notational diffence +(in this case leftmost greedy policy agrees with POSIX). +\begin{center} +\includegraphics[width=\linewidth]{img/example2/tnfa.png}\\ +\footnotesize{TNFA for $a^* 1 a^* a$.} \\ +\end{center} +\begin{center} +\includegraphics[width=0.8\linewidth]{img/example2/tdfa0_raw.png}\\ +\footnotesize{Construction of TDFA(0) for $a^* 1 a^* a$.} \\ +\end{center} +\begin{center} +\includegraphics[width=0.6\linewidth]{img/example2/tdfa0.png}\\ +\footnotesize{Unoptimized TDFA(0) for $a^* 1 a^* a$.} \\ +\end{center} +\begin{center} +\includegraphics[width=0.8\linewidth]{img/example2/tdfa1_raw.png}\\ +\footnotesize{Construction of TDFA(1) for $a^* 1 a^* a$.} \\ +\end{center} +\begin{center} +\includegraphics[width=0.5\linewidth]{img/example2/tdfa1.png}\\ +\footnotesize{Unoptimized TDFA(1) for $a^* 1 a^* a$.} \\ +\end{center} + +The next example is $(1 a)^*$. +It shows the typical difference between automata: +TDFA(0) has less states, but more operations; its operations are more clustered and interrelated. +Both automata record the full history of tag on all iterations. +TRE has 2nd degree nondeterminism for TDFA(0) and is deterministic for TDFA(1). +\begin{center} +\includegraphics[width=0.6\linewidth]{img/example6/tnfa.png}\\ +\footnotesize{TNFA for $(1 a)^*$.} \\ +\end{center} +\begin{center} +\includegraphics[width=0.6\linewidth]{img/example6/tdfa0_raw.png}\\ +\footnotesize{Construction of TDFA(0) for $(1 a)^*$.} \\ +\end{center} +\begin{center} +\includegraphics[width=0.5\linewidth]{img/example6/tdfa0.png}\\ +\footnotesize{Unoptimized TDFA(0) for $(1 a)^*$.} \\ +\end{center} +\begin{center} +\includegraphics[width=0.9\linewidth]{img/example6/tdfa1_raw.png}\\ +\footnotesize{Construction of TDFA(1) for $(1 a)^*$.} \\ +\end{center} +\begin{center} +\includegraphics[width=0.6\linewidth]{img/example6/tdfa1.png}\\ +\footnotesize{Unoptimized TDFA(1) for $(1 a)^*$.} \\ +\end{center} + +The next example is $(1 a^+ 2 b^+)^+$. +Like the first example, it shows that TDFA(0) tends to pull operations inside of loops +and behaves much worse than hypothetical hand-written code +(only this example is bigger and gives an idea how the difference between automata changes with TRE size). +If $a^+$ and $b^+$ match multiple iterations (which is likely in practice for TRE of such form), then the difference is considerable. +Both tags have 2nd degree of nondeterminism for TDFA(0), and both are deterministic for TDFA(1). +\begin{center} +\includegraphics[width=\linewidth]{img/example5/tnfa.png}\\ +\footnotesize{TNFA for $(1 a^+ 2 b^+)^+$.} \\ +\end{center} +\begin{center} +\includegraphics[width=\linewidth]{img/example5/tdfa0_raw.png}\\ +\footnotesize{Construction of TDFA(0) for $(1 a^+ 2 b^+)^+$.} \\ +\end{center} +\begin{center} +\includegraphics[width=\linewidth]{img/example5/tdfa0.png}\\ +\footnotesize{Unoptimized TDFA(0) for $(1 a^+ 2 b^+)^+$.} \\ +\end{center} +\begin{center} +\includegraphics[width=\linewidth]{img/example5/tdfa1_raw.png}\\ +\footnotesize{Construction of TDFA(1) for $(1 a^+ 2 b^+)^+$.} \\ +\end{center} +\begin{center} +\includegraphics[width=0.8\linewidth]{img/example5/tdfa1.png}\\ +\footnotesize{Unoptimized TDFA(1) for $(1 a^+ 2 b^+)^+$.} \\ +\end{center} + +The next example is $a^* 1 a^{3}$, +which demonstrates a pathological case for both types of automata: +nondeterminism degree grows linearly with the number of repetitions. +As a result, for $n$ repetitions both automata contan $O(n)$ states and $O(n)$ copy operations inside of a loop. +TDFA(0) has one more operation than TDFA(0), but for $n \!>\! 2$ this probably makes little difference. +Obviously, for TRE of such kind both methods are impractical. +However, bounded repetition is a problem on its own, even without tags; +relatively small repetition numbers dramatically increase the size of automaton. +If bounded repetition is necessary, more powerful methods should be used: +e.g. automata with \emph{counters} described in [??]. +\begin{center} +\includegraphics[width=\linewidth]{img/example3/tnfa.png}\\ +\footnotesize{TNFA for $a^* 1 a^{3}$.} \\ +\end{center} +\begin{center} +\includegraphics[width=\linewidth]{img/example3/tdfa0_raw.png}\\ +\footnotesize{Construction of TDFA(0) for $a^* 1 a^{3}$.} \\ +\end{center} +\begin{center} +\includegraphics[width=0.8\linewidth]{img/example3/tdfa0.png}\\ +\footnotesize{Unoptimized TDFA(0) for $a^* 1 a^{3}$.} \\ +\end{center} +\begin{center} +\includegraphics[width=\linewidth]{img/example3/tdfa1_raw.png}\\ +\footnotesize{Construction of TDFA(1) for $a^* 1 a^{3}$.} \\ +\end{center} +\begin{center} +\includegraphics[width=0.8\linewidth]{img/example3/tdfa1.png}\\ +\footnotesize{Unoptimized TDFA(1) for $a^* 1 a^{3}$.} \\ +\end{center} + +Finally, the last example is POSIX RE \texttt{(a|aa)+}, which is represented with TRE $1 (3 (a | aa) 4)^* 2$. +An early optimization in RE2C rewrites it to $1 (3 (a | aa) )^* 4 \, 2$: +orbit tag $4$ is moved out of loop, as we need only its last offset +(disambiguation is based on maximization of tag $3$: as argued in section \ref{section_disambiguation}, checking both tags is redundant). +The resulting automata oscillate between two final states: +submatch result depends on the parity of symbols \texttt{a} in the input string. +Tag $3$ has maximal degree of nondeterminism: $3$ for TDFA(0) and $2$ for TDFA(1). +Tags $2$ and $4$ are deterministic for TDFA(1) and have degree $2$ for TDFA(0). +Tag $1$ is deterministic for both automata. +\begin{center} +\includegraphics[width=\linewidth]{img/example4/tnfa.png}\\ +\footnotesize{TNFA for $1 (3 (a | aa) )^* 4 \, 2$.} \\ +\end{center} +\begin{center} +\includegraphics[width=\linewidth]{img/example4/tdfa0_raw.png}\\ +\footnotesize{Construction of TDFA(0) for $1 (3 (a | aa) )^* 4 \, 2$.} \\ +\end{center} +\begin{center} +\includegraphics[width=\linewidth]{img/example4/tdfa0.png}\\ +\footnotesize{Unoptimized TDFA(0) for $1 (3 (a | aa) )^* 4 \, 2$.} \\ +\end{center} +\begin{center} +\includegraphics[width=\linewidth]{img/example4/tdfa1_raw.png}\\ +\footnotesize{Construction of TDFA(1) for $1 (3 (a | aa) )^* 4 \, 2$.} \\ +\end{center} +\begin{center} +\includegraphics[width=\linewidth]{img/example4/tdfa1.png}\\ +\footnotesize{Unoptimized TDFA(1) for $1 (3 (a | aa) )^* 4 \, 2$.} \\ +\end{center} + +%\vfill\null\pagebreak + +%\begin{minipage}{\linewidth} +% \centering +% \footnotesize +% \includegraphics[width=0.5\linewidth]{img/x1.png} +% \\ A picture of the same gull looking the other way! +%\end{minipage} +%\begin{center}\includegraphics[width=\linewidth]{img/x0.png}\end{center} +%\begin{center}\includegraphics[width=0.5\linewidth]{img/x1.png}\end{center} +%\begin{center}\includegraphics[width=0.5\linewidth]{img/x2.png}\end{center} + +\section{Optimizations}\label{section_optimizations} + +(1.5x - 2x speedup on in case of RFC-3986 compliant URI parser). + +\section{Evaluation}\label{section_evaluation} + +\section{Future work}\label{section_future_work} + +There is also quite different use of position markers described in literature: +Watson mentions so-called \emph{dotted} RE [Wat95] +that go back to DeRemers's construction of DFA [DeRem74], +which originates in LR parsing invented by Knuth [Knu65] +(\emph{dot} is the well-known LR \emph{item} which separates parsed and unparsed parts of the rule). + +\section*{Acknowledgements} + +\end{multicols} +\pagebreak + +\section*{References} + +\begin{enumerate} +\item Laurikari 2000 +\item Laurikari 2001 +\item Karper +\item Kuklewicz +\end{enumerate} + +\end{document} -- 2.50.1