2009-02-21 18:13:11 -05:00
|
|
|
! Copyright (C) 2009 Daniel Ehrenberg.
|
2009-02-21 13:09:41 -05:00
|
|
|
! 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 ;
|
|
|
|
IN: regexp.disambiguate
|
|
|
|
|
|
|
|
TUPLE: parts in out ;
|
|
|
|
|
|
|
|
: make-partition ( choices classes -- partition )
|
|
|
|
zip [ first ] partition [ values ] bi@ parts boa ;
|
|
|
|
|
|
|
|
: powerset-partition ( classes -- partitions )
|
|
|
|
[ length [ 2^ ] keep ] keep '[
|
|
|
|
_ <bits> _ make-partition
|
2009-02-23 14:10:38 -05:00
|
|
|
] map rest ;
|
2009-02-21 13:09:41 -05:00
|
|
|
|
|
|
|
: partition>class ( parts -- class )
|
2009-02-23 14:10:38 -05:00
|
|
|
[ out>> [ <not-class> ] map ]
|
|
|
|
[ in>> <and-class> ] bi
|
|
|
|
prefix <and-class> ;
|
2009-02-21 13:09:41 -05:00
|
|
|
|
|
|
|
: get-transitions ( partition state-transitions -- next-states )
|
|
|
|
[ in>> ] dip '[ _ at ] map prune ;
|
|
|
|
|
|
|
|
: disambiguate ( dfa -- nfa )
|
|
|
|
[
|
|
|
|
[
|
|
|
|
[ keys powerset-partition ] keep '[
|
|
|
|
[ partition>class ]
|
|
|
|
[ _ get-transitions ] bi
|
|
|
|
] H{ } map>assoc
|
|
|
|
[ drop ] assoc-filter
|
|
|
|
] assoc-map
|
|
|
|
] change-transitions ;
|
|
|
|
|
2009-03-02 17:30:42 -05:00
|
|
|
USE: sorting
|
|
|
|
|
2009-02-21 13:09:41 -05:00
|
|
|
: nfa>dfa ( nfa -- dfa )
|
2009-03-02 17:30:42 -05:00
|
|
|
construct-dfa minimize
|
|
|
|
disambiguate
|
2009-02-21 13:09:41 -05:00
|
|
|
construct-dfa minimize ;
|