regexp.disambiguate: Make it cleaner imo, but still can't make heads of tails of the algorithm being used.
parent
9ee109ae50
commit
c5f7ae9d74
|
@ -15,8 +15,7 @@ TUPLE: parts in out ;
|
||||||
|
|
||||||
: partition>class ( parts -- class )
|
: partition>class ( parts -- class )
|
||||||
[ out>> [ <not-class> ] map ]
|
[ out>> [ <not-class> ] map ]
|
||||||
[ in>> <and-class> ] bi
|
[ in>> <and-class> ] bi prefix <and-class> ;
|
||||||
prefix <and-class> ;
|
|
||||||
|
|
||||||
: singleton-partition ( integer non-integers -- {class,partition} )
|
: singleton-partition ( integer non-integers -- {class,partition} )
|
||||||
dupd
|
dupd
|
||||||
|
@ -25,9 +24,9 @@ TUPLE: parts in out ;
|
||||||
2array ;
|
2array ;
|
||||||
|
|
||||||
: add-out ( seq partition -- partition' )
|
: add-out ( seq partition -- partition' )
|
||||||
[ out>> append ] [ in>> ] bi swap parts boa ;
|
[ nip in>> ] [ out>> append ] 2bi parts boa ;
|
||||||
|
|
||||||
: intersection ( seq -- elts )
|
: intersection ( seq -- elts/f )
|
||||||
[ f ] [ unclip [ intersect ] reduce ] if-empty ;
|
[ f ] [ unclip [ intersect ] reduce ] if-empty ;
|
||||||
|
|
||||||
: meaningful-integers ( partition table -- integers )
|
: meaningful-integers ( partition table -- integers )
|
||||||
|
@ -39,34 +38,30 @@ TUPLE: parts in out ;
|
||||||
|
|
||||||
: add-integers ( partitions classes integers -- partitions )
|
: add-integers ( partitions classes integers -- partitions )
|
||||||
class-integers '[
|
class-integers '[
|
||||||
[ _ meaningful-integers ] keep add-out
|
[ _ meaningful-integers ] [ ] bi add-out
|
||||||
] map ;
|
] map ;
|
||||||
|
|
||||||
:: class-partitions ( classes -- assoc )
|
:: class-partitions ( classes -- assoc )
|
||||||
classes [ integer? ] partition :> ( integers classes )
|
classes [ integer? ] partition :> ( integers classes )
|
||||||
|
|
||||||
classes powerset-partition classes integers add-integers
|
classes powerset-partition classes integers add-integers
|
||||||
[ [ partition>class ] keep 2array ] map [ first ] filter
|
[ [ partition>class ] [ ] bi 2array ] map sift-keys
|
||||||
integers [ classes singleton-partition ] map append ;
|
integers [ classes singleton-partition ] map append ;
|
||||||
|
|
||||||
: new-transitions ( transitions -- assoc ) ! assoc is class, partition
|
: new-transitions ( transitions -- assoc ) ! assoc is class, partition
|
||||||
values [ keys ] gather
|
values [ keys ] gather [ tagged-epsilon? ] reject class-partitions ;
|
||||||
[ tagged-epsilon? ] reject
|
|
||||||
class-partitions ;
|
|
||||||
|
|
||||||
: get-transitions ( partition state-transitions -- next-states )
|
: get-transitions ( partition state-transitions -- next-states )
|
||||||
[ in>> ] dip '[ _ at ] gather sift ;
|
[ in>> ] dip '[ _ at ] gather sift ;
|
||||||
|
|
||||||
: preserving-epsilon ( state-transitions quot -- new-state-transitions )
|
|
||||||
[ [ drop tagged-epsilon? ] assoc-filter ] bi
|
|
||||||
assoc-union H{ } assoc-like ; inline
|
|
||||||
|
|
||||||
: disambiguate ( nfa -- nfa )
|
: disambiguate ( nfa -- nfa )
|
||||||
expand-ors [
|
expand-ors [
|
||||||
dup new-transitions '[
|
dup new-transitions '[
|
||||||
[
|
[
|
||||||
_ swap '[ _ get-transitions ] assoc-map
|
_ swap '[ _ get-transitions ] assoc-map
|
||||||
harvest-values
|
harvest-values
|
||||||
] preserving-epsilon
|
] [
|
||||||
|
[ drop tagged-epsilon? ] assoc-filter
|
||||||
|
] bi H{ } assoc-union-as
|
||||||
] assoc-map
|
] assoc-map
|
||||||
] change-transitions ;
|
] change-transitions ;
|
||||||
|
|
Loading…
Reference in New Issue