1 ! Copyright (C) 2009 Daniel Ehrenberg.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays assocs fry kernel locals math math.bits
4 regexp.ast regexp.classes regexp.transition-tables sequences
6 IN: regexp.disambiguate
10 : make-partition ( choices classes -- partition )
11 zip [ first ] partition [ values ] bi@ parts boa ;
13 : powerset-partition ( sequence -- partitions )
14 [ length [ 2^ <iota> ] keep ] keep '[ _ <bits> _ make-partition ] map rest ;
16 : partition>class ( parts -- class )
17 [ out>> [ <not-class> ] map ]
18 [ in>> <and-class> ] bi prefix <and-class> ;
20 : singleton-partition ( integer non-integers -- {class,partition} )
22 '[ _ [ class-member? ] with filter ] keep
26 : add-out ( seq partition -- partition' )
27 [ nip in>> ] [ out>> append ] 2bi parts boa ;
29 : meaningful-integers ( partition table -- integers )
30 [ [ in>> ] [ out>> ] bi ] dip
31 '[ [ _ at ] map intersect-all ] bi@ diff ;
33 : class-integers ( classes integers -- table )
34 '[ _ over '[ _ class-member? ] filter ] H{ } map>assoc ;
36 : add-integers ( partitions classes integers -- partitions )
38 [ _ meaningful-integers ] [ ] bi add-out
41 :: class-partitions ( classes -- assoc )
42 classes [ integer? ] partition :> ( integers classes )
44 classes powerset-partition classes integers add-integers
45 [ [ partition>class ] [ ] bi 2array ] map sift-keys
46 integers [ classes singleton-partition ] map append ;
48 : new-transitions ( transitions -- assoc ) ! assoc is class, partition
49 values [ keys ] gather [ tagged-epsilon? ] reject class-partitions ;
51 : get-transitions ( partition state-transitions -- next-states )
52 [ in>> ] dip '[ _ at ] gather sift ;
54 : disambiguate ( nfa -- nfa )
56 dup new-transitions '[
58 _ swap '[ _ get-transitions ] assoc-map
61 [ drop tagged-epsilon? ] assoc-filter
62 ] bi H{ } assoc-union-as
64 ] change-transitions ;