| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:05:37 -05:00
										 |  |  | regexp.dfa namespaces sets ;
 | 
					
						
							| 
									
										
										
										
											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 )
 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:05:37 -05:00
										 |  |  |     [ transitions>> keys ] [ final-states>> ] bi diff fast-set ;
 | 
					
						
							| 
									
										
										
										
											2009-02-19 17:48:46 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : 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 )
 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:05:37 -05:00
										 |  |  |     dup [ final-states>> members ] keep
 | 
					
						
							| 
									
										
										
										
											2009-03-07 17:31:46 -05:00
										 |  |  |     '[ -2 epsilon _ set-transition ] each
 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:05:37 -05:00
										 |  |  |     HS{ -2 } clone >>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>> ] | 
					
						
							| 
									
										
										
										
											2010-03-02 18:05:37 -05:00
										 |  |  |     [ final-states>> members first ] | 
					
						
							| 
									
										
										
										
											2010-02-03 09:25:53 -05:00
										 |  |  |     [ nfa-table get [ transitions>> ] bi@ swap assoc-union! drop ] tri ;
 | 
					
						
							| 
									
										
										
										
											2009-02-19 19:28:54 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-28 14:46:15 -05:00
										 |  |  | : ast>nfa ( parse-tree -- minimal-dfa )
 | 
					
						
							|  |  |  |     construct-nfa disambiguate ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-10 19:27:04 -04:00
										 |  |  | : ast>dfa ( parse-tree -- minimal-dfa )
 | 
					
						
							| 
									
										
										
										
											2011-11-28 14:46:15 -05:00
										 |  |  |     ast>nfa construct-dfa minimize ;
 | 
					
						
							| 
									
										
										
										
											2009-03-10 19:27:04 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-19 19:28:54 -05:00
										 |  |  | M: negation nfa-node ( node -- start end )
 | 
					
						
							|  |  |  |     term>> ast>dfa negate-table adjoin-dfa ;
 |