| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2008-09-18 15:42:16 -04:00
										 |  |  | vectors regexp.utils ;
 | 
					
						
							|  |  |  | IN: regexp.transition-tables | 
					
						
							| 
									
										
										
										
											2008-08-26 21:24:14 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-28 14:45:04 -04:00
										 |  |  | TUPLE: transition from to obj ;
 | 
					
						
							| 
									
										
										
										
											2008-08-26 21:24:14 -04:00
										 |  |  | TUPLE: literal-transition < transition ;
 | 
					
						
							|  |  |  | TUPLE: class-transition < transition ;
 | 
					
						
							|  |  |  | TUPLE: default-transition < transition ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TUPLE: literal obj ;
 | 
					
						
							|  |  |  | TUPLE: class obj ;
 | 
					
						
							|  |  |  | TUPLE: default ;
 | 
					
						
							| 
									
										
										
										
											2008-08-27 17:22:34 -04:00
										 |  |  | : make-transition ( from to obj class -- obj )
 | 
					
						
							|  |  |  |     new
 | 
					
						
							|  |  |  |         swap >>obj | 
					
						
							|  |  |  |         swap >>to | 
					
						
							| 
									
										
										
										
											2008-08-28 14:45:04 -04:00
										 |  |  |         swap >>from ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-27 16:09:49 -04:00
										 |  |  | : <literal-transition> ( from to obj -- transition )
 | 
					
						
							| 
									
										
										
										
											2008-08-27 17:22:34 -04:00
										 |  |  |     literal-transition make-transition ;
 | 
					
						
							| 
									
										
										
										
											2008-11-24 23:16:29 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-27 16:09:49 -04:00
										 |  |  | : <class-transition> ( from to obj -- transition )
 | 
					
						
							| 
									
										
										
										
											2008-08-27 17:22:34 -04:00
										 |  |  |     class-transition make-transition ;
 | 
					
						
							| 
									
										
										
										
											2008-11-24 23:16:29 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-27 16:09:49 -04:00
										 |  |  | : <default-transition> ( from to -- transition )
 | 
					
						
							| 
									
										
										
										
											2008-08-27 17:22:34 -04:00
										 |  |  |     t default-transition make-transition ;
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2008-11-24 23:16:29 -05:00
										 |  |  |         H{ } clone >>final-states ;
 | 
					
						
							| 
									
										
										
										
											2008-08-26 21:24:14 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-19 18:54:34 -04:00
										 |  |  | : maybe-initialize-key ( key hashtable -- )
 | 
					
						
							| 
									
										
										
										
											2009-01-23 19:20:47 -05:00
										 |  |  |     2dup key? [ 2drop ] [ [ H{ } clone ] 2dip set-at ] if ;
 | 
					
						
							| 
									
										
										
										
											2008-09-19 18:54:34 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-26 21:24:14 -04:00
										 |  |  | : set-transition ( transition hash -- )
 | 
					
						
							| 
									
										
										
										
											2008-09-19 18:54:34 -04:00
										 |  |  |     #! set the state as a key | 
					
						
							|  |  |  |     2dup [ to>> ] dip maybe-initialize-key | 
					
						
							| 
									
										
										
										
											2008-08-28 14:45:04 -04:00
										 |  |  |     [ [ to>> ] [ obj>> ] [ from>> ] tri ] dip
 | 
					
						
							| 
									
										
										
										
											2008-08-26 21:24:14 -04:00
										 |  |  |     2dup at* [ 2nip insert-at ] | 
					
						
							| 
									
										
										
										
											2008-11-23 00:01:24 -05:00
										 |  |  |     [ drop [ H{ } clone [ insert-at ] keep ] 2dip set-at ] if ;
 | 
					
						
							| 
									
										
										
										
											2008-08-26 21:24:14 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : add-transition ( transition transition-table -- )
 | 
					
						
							|  |  |  |     transitions>> set-transition ;
 |