diff --git a/regexx.c b/regexx.c index 30d2682..d854bb0 100644 --- a/regexx.c +++ b/regexx.c @@ -2,29 +2,45 @@ * * See concept.md for the full design rationale. This file is the v1 * implementation: it covers the public API and pattern syntax listed in - * README.md "Implementation status" in full, executed by a single - * recursive backtracking engine (concept.md Section 7.3) over a fully - * materialized copy of the input. It does not yet implement the - * streaming, bounded-memory regular engine of concept.md Section 7.2; - * that remains future work, tracked in README.md. + * README.md "Implementation status" in full, executed by one of two + * engines over a fully materialized copy of the input, chosen + * automatically per compiled pattern (concept.md Section 7.2/7.7): * - * That backtracking engine is memoized (run_memo) and, for quantifiers - * over a single character/class/./ (OP_REPEAT1), backed by precomputed - * run-length and skip-ahead tables (compute_maxrun, - * compute_next_prevmatch), so that Pattern_search/finditer/split/sub - * run in linear rather than quadratic time for the common, - * backreference-free case; see README.md "Implementation status" for - * the measured numbers, the precise remaining limitations, and - * citations to the published techniques this matches. + * - A Pike VM (Section 6b, "6b. Pike VM" below), a Thompson-NFA + * simulation with no backtracking at all, for any pattern with no + * backreference, lookahead, lookbehind, or atomic group. No + * per-thread heap allocation (a flat table indexed directly by + * instruction, concept.md 7.10) and a Boyer-Moore-Horspool literal + * prefilter for a pattern beginning with a mandatory literal string. + * - A recursive backtracking engine (Section 6, concept.md 7.3) for + * everything else, memoized (run_memo) and, for quantifiers over a + * single character/class/./ (OP_REPEAT1), backed by precomputed + * run-length and skip-ahead tables (compute_maxrun, + * compute_next_prevmatch), so that Pattern_search/finditer/split/sub + * run in linear rather than quadratic time for the common, + * backreference-free case there too. + * + * Neither engine yet implements the streaming, bounded-memory regular + * engine of concept.md Section 7.2 (both still materialize the whole + * input); that remains future work, tracked in README.md. See + * README.md "Implementation status" and "The Pike VM" for the measured + * numbers on both engines, the precise remaining limitations, and + * citations to the published techniques and production engines + * (RE2, rust-lang/regex) this matches. * * Naming convention (concept.md Section 9.0): every identifier with a * direct Python `re` counterpart uses that counterpart's exact spelling. * - * Not reentrant: re_compile() uses one process-wide parser scratch pool + * Reentrancy: re_compile() uses one process-wide parser scratch pool * and the module level functions share one process-wide pattern cache - * (concept.md 13.6); do not call regexx functions from more than one - * thread without external synchronization. - */ + * (concept.md 13.6); do not call re_compile() or any re_-prefixed + * module level function from more than one thread without external + * synchronization. Pattern_-prefixed functions on an already-compiled + * Pattern no thread is concurrently modifying need no such + * synchronization (nothing here mutates a compiled Pattern, including + * matching on the Pike VM: its per-search working state, PikeEngine, + * is always local to one top level call, never cached on the Pattern + * itself, specifically so this guarantee holds, concept.md 7.10). */ #define _DEFAULT_SOURCE #include "regexx.h" #include diff --git a/regexx.h b/regexx.h index 226d528..448340e 100644 --- a/regexx.h +++ b/regexx.h @@ -9,19 +9,21 @@ * described below, executed by one of two engines over a fully * materialized copy of the input, chosen automatically per compiled * pattern (concept.md Section 7.2/7.7): a Pike VM (a Thompson-NFA - * simulation, genuinely linear time, no backtracking at all) for any - * pattern with no backreference, lookaround, or atomic group; a - * recursive backtracking engine (concept.md Section 7.3), augmented - * with memoization and precomputed skip-ahead tables (regexx.c: - * run_memo, compute_maxrun, compute_next_prevmatch) that make the - * search-family functions (Pattern_search/finditer/split/sub) run in - * linear time for the common, backreference-free case there too, - * otherwise. Neither engine yet implements the streaming, bounded- - * memory version of Section 7.2; see README.md "Implementation status" - * and "The Pike VM" for the complete, itemized, measured account of - * what v1 does and does not cover, including a real, documented - * performance trade-off between the two engines that is not yet - * resolved (concept.md 7.8). + * simulation, genuinely linear time, no backtracking at all, no + * per-thread heap allocation, and a Boyer-Moore-Horspool literal + * prefilter, concept.md 7.10) for any pattern with no backreference, + * lookaround, or atomic group; a recursive backtracking engine + * (concept.md Section 7.3), augmented with memoization and precomputed + * skip-ahead tables (regexx.c: run_memo, compute_maxrun, + * compute_next_prevmatch) that make the search-family functions + * (Pattern_search/finditer/split/sub) run in linear time for the + * common, backreference-free case there too, otherwise. Neither engine + * yet implements the streaming, bounded-memory version of Section 7.2; + * see README.md "Implementation status" and "The Pike VM" for the + * complete, itemized, measured account of what v1 does and does not + * cover, including the remaining, narrower performance trade-off + * between the two engines on patterns the Pike VM's prefilter cannot + * help (concept.md 7.9/7.10). */ #ifndef REGEXX_H #define REGEXX_H