1 ! Copyright (C) 2009 Daniel Ehrenberg.
2 ! See https://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs hashtables kernel namespaces regexp.ast
4 regexp.classes regexp.dfa regexp.disambiguate regexp.minimize
5 regexp.nfa regexp.transition-tables sequences sets vectors ;
8 CONSTANT: fail-state -1
10 : add-default-transition ( state's-transitions -- new-state's-transitions )
12 [ [ fail-state ] dip keys [ <not-class> ] map <and-class> ] keep set-at ;
14 : fail-state-recurses ( transitions -- new-transitions )
16 [ fail-state t associate fail-state ] dip set-at ;
18 : add-fail-state ( transitions -- new-transitions )
19 [ add-default-transition ] assoc-map
22 : inverse-final-states ( transition-table -- final-states )
23 [ transitions>> keys ] [ final-states>> ] bi diff fast-set ;
25 : negate-table ( transition-table -- transition-table )
27 [ add-fail-state ] change-transitions
28 dup inverse-final-states >>final-states ;
30 : renumber-states ( transition-table -- transition-table )
31 dup transitions>> keys [ next-state ] H{ } map>assoc
34 : box-transitions ( transition-table -- transition-table )
35 [ [ [ 1vector ] assoc-map ] assoc-map ] change-transitions ;
37 : unify-final-state ( transition-table -- transition-table )
38 dup [ final-states>> members ] keep
39 '[ -2 epsilon _ set-transition ] each
40 HS{ -2 } clone >>final-states ;
42 : adjoin-dfa ( transition-table -- start end )
43 unify-final-state renumber-states box-transitions
45 [ final-states>> members first ]
46 [ nfa-table get [ transitions>> ] bi@ swap assoc-union! drop ] tri ;
48 : ast>nfa ( parse-tree -- minimal-dfa )
49 construct-nfa disambiguate ;
51 : ast>dfa ( parse-tree -- minimal-dfa )
52 ast>nfa construct-dfa minimize ;
55 term>> ast>dfa negate-table adjoin-dfa ;