diff --git a/basis/regexp/compiler/compiler.factor b/basis/regexp/compiler/compiler.factor index c837df0f0f..186d683f82 100644 --- a/basis/regexp/compiler/compiler.factor +++ b/basis/regexp/compiler/compiler.factor @@ -77,17 +77,8 @@ C: box : literals>cases ( literal-transitions -- case-body ) [ execution-quot ] assoc-map ; -: expand-one-or ( or-class transition -- alist ) - [ seq>> ] dip '[ _ 2array ] map ; - -: expand-or ( alist -- new-alist ) - [ - first2 over or-class? - [ expand-one-or ] [ 2array 1array ] if - ] map concat ; - : split-literals ( transitions -- case default ) - >alist expand-or [ first integer? ] partition + { } assoc-like [ first integer? ] partition [ [ literals>cases ] keep ] dip non-literals>dispatch ; :: step ( last-match index str quot final? direction -- last-index/f ) diff --git a/basis/regexp/disambiguate/disambiguate.factor b/basis/regexp/disambiguate/disambiguate.factor index eac9c7e81d..67b1503f9b 100644 --- a/basis/regexp/disambiguate/disambiguate.factor +++ b/basis/regexp/disambiguate/disambiguate.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2009 Daniel Ehrenberg. ! See http://factorcode.org/license.txt for BSD license. USING: kernel accessors regexp.classes math.bits assocs sequences -arrays sets regexp.dfa math fry regexp.minimize regexp.ast ; +arrays sets regexp.dfa math fry regexp.minimize regexp.ast regexp.transition-tables ; IN: regexp.disambiguate TUPLE: parts in out ; @@ -32,9 +32,8 @@ TUPLE: parts in out ; : preserving-epsilon ( state-transitions quot -- new-state-transitions ) [ [ drop tagged-epsilon? ] assoc-filter ] bi assoc-union H{ } assoc-like ; inline - : disambiguate ( nfa -- nfa ) - [ + expand-ors [ dup new-transitions '[ [ _ swap '[ _ get-transitions ] assoc-map diff --git a/basis/regexp/minimize/minimize.factor b/basis/regexp/minimize/minimize.factor index bdb53c51cb..1885144e6c 100644 --- a/basis/regexp/minimize/minimize.factor +++ b/basis/regexp/minimize/minimize.factor @@ -96,4 +96,5 @@ IN: regexp.minimize clone number-states combine-states - combine-transitions ; + combine-transitions + expand-ors ; diff --git a/basis/regexp/transition-tables/transition-tables.factor b/basis/regexp/transition-tables/transition-tables.factor index 48e84d372c..3c33ae8846 100644 --- a/basis/regexp/transition-tables/transition-tables.factor +++ b/basis/regexp/transition-tables/transition-tables.factor @@ -47,3 +47,15 @@ TUPLE: transition-table transitions start-state final-states ; [ '[ _ condition-at ] change-start-state ] [ '[ [ _ at ] map-set ] change-final-states ] [ '[ _ number-transitions ] change-transitions ] tri ; + +: expand-one-or ( or-class transition -- alist ) + [ seq>> ] dip '[ _ 2array ] map ; + +: expand-or ( state-transitions -- new-transitions ) + >alist [ + first2 over or-class? + [ expand-one-or ] [ 2array 1array ] if + ] map concat >hashtable ; + +: expand-ors ( transition-table -- transition-table ) + [ [ expand-or ] assoc-map ] change-transitions ;