| 
									
										
										
										
											2008-08-26 21:24:14 -04:00
										 |  |  | ! Copyright (C) 2008 Doug Coleman. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							|  |  |  | USING: accessors arrays assocs fry hashtables kernel sequences | 
					
						
							| 
									
										
										
										
											2010-03-02 18:05:37 -05:00
										 |  |  | vectors locals regexp.classes sets ;
 | 
					
						
							| 
									
										
										
										
											2008-09-18 15:42:16 -04:00
										 |  |  | IN: regexp.transition-tables | 
					
						
							| 
									
										
										
										
											2008-08-26 21:24:14 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-24 23:16:29 -05:00
										 |  |  | TUPLE: transition-table transitions start-state final-states ;
 | 
					
						
							| 
									
										
										
										
											2008-08-26 21:24:14 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : <transition-table> ( -- transition-table )
 | 
					
						
							|  |  |  |     transition-table new
 | 
					
						
							|  |  |  |         H{ } clone >>transitions | 
					
						
							| 
									
										
										
										
											2010-03-02 18:05:37 -05:00
										 |  |  |         HS{ } clone >>final-states ;
 | 
					
						
							| 
									
										
										
										
											2008-08-26 21:24:14 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-04 01:36:03 -05:00
										 |  |  | :: (set-transition) ( from to obj hash -- )
 | 
					
						
							|  |  |  |     from hash at
 | 
					
						
							|  |  |  |     [ [ to obj ] dip set-at ] | 
					
						
							|  |  |  |     [ to obj associate from hash set-at ] if* ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : set-transition ( from to obj transition-table -- )
 | 
					
						
							|  |  |  |     transitions>> (set-transition) ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :: (add-transition) ( from to obj hash -- )
 | 
					
						
							| 
									
										
										
										
											2009-02-26 15:19:02 -05:00
										 |  |  |     from hash at
 | 
					
						
							|  |  |  |     [ [ to obj ] dip push-at ] | 
					
						
							|  |  |  |     [ to 1vector obj associate from hash set-at ] if* ;
 | 
					
						
							| 
									
										
										
										
											2008-08-26 21:24:14 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-26 15:19:02 -05:00
										 |  |  | : add-transition ( from to obj transition-table -- )
 | 
					
						
							| 
									
										
										
										
											2009-03-04 01:36:03 -05:00
										 |  |  |     transitions>> (add-transition) ;
 | 
					
						
							| 
									
										
										
										
											2009-03-05 17:34:04 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:05:37 -05:00
										 |  |  | : map-set ( set quot -- new-set )
 | 
					
						
							|  |  |  |     over [ [ members ] dip map ] dip set-like ; inline
 | 
					
						
							| 
									
										
										
										
											2009-03-05 17:34:04 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : number-transitions ( transitions numbering -- new-transitions )
 | 
					
						
							|  |  |  |     dup '[ | 
					
						
							|  |  |  |         [ _ at ] | 
					
						
							|  |  |  |         [ [ _ condition-at ] assoc-map ] bi*
 | 
					
						
							|  |  |  |     ] assoc-map ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-05 18:44:29 -05:00
										 |  |  | : transitions-at ( transition-table assoc -- transition-table )
 | 
					
						
							|  |  |  |     [ clone ] dip
 | 
					
						
							|  |  |  |     [ '[ _ condition-at ] change-start-state ] | 
					
						
							|  |  |  |     [ '[ [ _ at ] map-set ] change-final-states ] | 
					
						
							|  |  |  |     [ '[ _ number-transitions ] change-transitions ] tri ;
 | 
					
						
							| 
									
										
										
										
											2009-03-11 23:04:47 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : expand-one-or ( or-class transition -- alist )
 | 
					
						
							|  |  |  |     [ seq>> ] dip '[ _ 2array ] map ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : expand-or ( state-transitions -- new-transitions )
 | 
					
						
							|  |  |  |     >alist [ | 
					
						
							|  |  |  |         first2 over or-class? | 
					
						
							|  |  |  |         [ expand-one-or ] [ 2array 1array ] if
 | 
					
						
							|  |  |  |     ] map concat >hashtable ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : expand-ors ( transition-table -- transition-table )
 | 
					
						
							|  |  |  |     [ [ expand-or ] assoc-map ] change-transitions ;
 |