47 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			47 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Factor
		
	
	
| 
								 | 
							
								! Copyright (C) 2008 Doug Coleman.
							 | 
						||
| 
								 | 
							
								! See http://factorcode.org/license.txt for BSD license.
							 | 
						||
| 
								 | 
							
								USING: accessors arrays assocs fry hashtables kernel sequences
							 | 
						||
| 
								 | 
							
								vectors regexp.utils ;
							 | 
						||
| 
								 | 
							
								IN: regexp.transition-tables
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: transition from to obj ;
							 | 
						||
| 
								 | 
							
								TUPLE: literal-transition < transition ;
							 | 
						||
| 
								 | 
							
								TUPLE: class-transition < transition ;
							 | 
						||
| 
								 | 
							
								TUPLE: default-transition < transition ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: literal obj ;
							 | 
						||
| 
								 | 
							
								TUPLE: class obj ;
							 | 
						||
| 
								 | 
							
								TUPLE: default ;
							 | 
						||
| 
								 | 
							
								: make-transition ( from to obj class -- obj )
							 | 
						||
| 
								 | 
							
								    new
							 | 
						||
| 
								 | 
							
								        swap >>obj
							 | 
						||
| 
								 | 
							
								        swap >>to
							 | 
						||
| 
								 | 
							
								        swap >>from ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: <literal-transition> ( from to obj -- transition )
							 | 
						||
| 
								 | 
							
								    literal-transition make-transition ;
							 | 
						||
| 
								 | 
							
								: <class-transition> ( from to obj -- transition )
							 | 
						||
| 
								 | 
							
								    class-transition make-transition ;
							 | 
						||
| 
								 | 
							
								: <default-transition> ( from to -- transition )
							 | 
						||
| 
								 | 
							
								    t default-transition make-transition ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: transition-table transitions start-state final-states ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: <transition-table> ( -- transition-table )
							 | 
						||
| 
								 | 
							
								    transition-table new
							 | 
						||
| 
								 | 
							
								        H{ } clone >>transitions
							 | 
						||
| 
								 | 
							
								        H{ } clone >>final-states ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: maybe-initialize-key ( key hashtable -- )
							 | 
						||
| 
								 | 
							
								    2dup key? [ 2drop ] [ H{ } clone -rot set-at ] if ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: set-transition ( transition hash -- )
							 | 
						||
| 
								 | 
							
								    #! set the state as a key
							 | 
						||
| 
								 | 
							
								    2dup [ to>> ] dip maybe-initialize-key
							 | 
						||
| 
								 | 
							
								    [ [ to>> ] [ obj>> ] [ from>> ] tri ] dip
							 | 
						||
| 
								 | 
							
								    2dup at* [ 2nip insert-at ]
							 | 
						||
| 
								 | 
							
								    [ drop >r >r H{ } clone [ insert-at ] keep r> r> set-at ] if ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: add-transition ( transition transition-table -- )
							 | 
						||
| 
								 | 
							
								    transitions>> set-transition ;
							 |