2009-02-19 17:48:46 -05:00
|
|
|
! Copyright (C) 2009 Daniel Ehrenberg.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2009-02-21 13:09:41 -05:00
|
|
|
USING: regexp.nfa regexp.disambiguate kernel sequences
|
2009-02-19 19:28:54 -05:00
|
|
|
assocs regexp.classes hashtables accessors fry vectors
|
2009-03-05 17:34:04 -05:00
|
|
|
regexp.ast regexp.transition-tables regexp.minimize
|
|
|
|
regexp.dfa namespaces ;
|
2009-02-19 17:48:46 -05:00
|
|
|
IN: regexp.negation
|
|
|
|
|
|
|
|
CONSTANT: fail-state -1
|
|
|
|
|
|
|
|
: add-default-transition ( state's-transitions -- new-state's-transitions )
|
|
|
|
clone dup
|
2009-02-23 14:10:38 -05:00
|
|
|
[ [ fail-state ] dip keys [ <not-class> ] map <and-class> ] keep set-at ;
|
2009-02-19 17:48:46 -05:00
|
|
|
|
|
|
|
: fail-state-recurses ( transitions -- new-transitions )
|
|
|
|
clone dup
|
2009-02-23 14:10:38 -05:00
|
|
|
[ fail-state t associate fail-state ] dip set-at ;
|
2009-02-19 17:48:46 -05:00
|
|
|
|
|
|
|
: add-fail-state ( transitions -- new-transitions )
|
|
|
|
[ add-default-transition ] assoc-map
|
|
|
|
fail-state-recurses ;
|
|
|
|
|
|
|
|
: inverse-final-states ( transition-table -- final-states )
|
|
|
|
[ transitions>> assoc>set ] [ final-states>> ] bi assoc-diff ;
|
|
|
|
|
|
|
|
: negate-table ( transition-table -- transition-table )
|
|
|
|
clone
|
|
|
|
[ add-fail-state ] change-transitions
|
|
|
|
dup inverse-final-states >>final-states ;
|
|
|
|
|
2009-02-19 19:28:54 -05:00
|
|
|
: renumber-states ( transition-table -- transition-table )
|
|
|
|
dup transitions>> keys [ next-state ] H{ } map>assoc
|
2009-03-05 17:34:04 -05:00
|
|
|
transitions-at ;
|
2009-02-19 19:28:54 -05:00
|
|
|
|
|
|
|
: box-transitions ( transition-table -- transition-table )
|
|
|
|
[ [ [ 1vector ] assoc-map ] assoc-map ] change-transitions ;
|
|
|
|
|
|
|
|
: unify-final-state ( transition-table -- transition-table )
|
|
|
|
dup [ final-states>> keys ] keep
|
2009-03-07 17:31:46 -05:00
|
|
|
'[ -2 epsilon _ set-transition ] each
|
2009-02-23 14:10:38 -05:00
|
|
|
H{ { -2 -2 } } >>final-states ;
|
2009-02-19 19:28:54 -05:00
|
|
|
|
|
|
|
: adjoin-dfa ( transition-table -- start end )
|
2009-03-07 17:31:46 -05:00
|
|
|
unify-final-state renumber-states box-transitions
|
2009-02-19 19:28:54 -05:00
|
|
|
[ start-state>> ]
|
|
|
|
[ final-states>> keys first ]
|
2009-02-25 13:22:12 -05:00
|
|
|
[ nfa-table get [ transitions>> ] bi@ swap update ] tri ;
|
2009-02-19 19:28:54 -05:00
|
|
|
|
2009-03-10 19:27:04 -04:00
|
|
|
: ast>dfa ( parse-tree -- minimal-dfa )
|
|
|
|
construct-nfa disambiguate construct-dfa minimize ;
|
|
|
|
|
2009-02-19 19:28:54 -05:00
|
|
|
M: negation nfa-node ( node -- start end )
|
|
|
|
term>> ast>dfa negate-table adjoin-dfa ;
|