1 ! Copyright (C) 2009 Daniel Ehrenberg.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel accessors regexp.classes math.bits assocs sequences
4 arrays sets regexp.dfa math fry regexp.minimize ;
5 IN: regexp.disambiguate
9 : make-partition ( choices classes -- partition )
10 zip [ first ] partition [ values ] bi@ parts boa ;
12 : powerset-partition ( classes -- partitions )
13 [ length [ 2^ ] keep ] keep '[
14 _ <bits> _ make-partition
17 : partition>class ( parts -- class )
18 [ out>> [ <not-class> ] map ]
19 [ in>> <and-class> ] bi
22 : get-transitions ( partition state-transitions -- next-states )
23 [ in>> ] dip '[ _ at ] map prune ;
25 : disambiguate ( dfa -- nfa )
28 [ keys powerset-partition ] keep '[
30 [ _ get-transitions ] bi
34 ] change-transitions ;
38 : nfa>dfa ( nfa -- dfa )
39 construct-dfa minimize
41 construct-dfa minimize ;