| 
									
										
										
										
											2008-09-10 23:11:40 -04:00
										 |  |  | ! Copyright (C) 2008 Slava Pestov. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2014-11-14 20:31:33 -05:00
										 |  |  | USING: accessors ascii assocs combinators | 
					
						
							|  |  |  | combinators.short-circuit kernel make math namespaces regexp | 
					
						
							|  |  |  | sequences strings xmode.marker.state xmode.rules xmode.tokens | 
					
						
							|  |  |  | xmode.utilities ;
 | 
					
						
							| 
									
										
										
										
											2009-03-10 19:27:33 -04:00
										 |  |  | IN: xmode.marker | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-12 21:42:32 -05:00
										 |  |  | ! Next two words copied from parser-combinators | 
					
						
							|  |  |  | ! Just like head?, but they optionally ignore case | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : string= ( str1 str2 ignore-case -- ? )
 | 
					
						
							|  |  |  |     [ [ >upper ] bi@ ] when sequence= ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : string-head? ( str1 str2 ignore-case -- ? )
 | 
					
						
							|  |  |  |     2over shorter?
 | 
					
						
							|  |  |  |     [ 3drop f ] [ | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             [ nip ] | 
					
						
							|  |  |  |             [ length head-slice ] 2bi
 | 
					
						
							|  |  |  |         ] dip string= | 
					
						
							|  |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  | ! Based on org.gjt.sp.jedit.syntax.TokenMarker | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : current-keyword ( -- string )
 | 
					
						
							|  |  |  |     last-offset get position get line get subseq ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : keyword-number? ( keyword -- ? )
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2008-08-30 21:32:26 -04:00
										 |  |  |         [ current-rule-set highlight-digits?>> ] | 
					
						
							| 
									
										
										
										
											2009-01-29 23:19:07 -05:00
										 |  |  |         [ dup [ digit? ] any? ] | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  |         [ | 
					
						
							|  |  |  |             dup [ digit? ] all? [ | 
					
						
							| 
									
										
										
										
											2008-08-30 21:32:26 -04:00
										 |  |  |                 current-rule-set digit-re>> | 
					
						
							| 
									
										
										
										
											2007-12-06 00:23:18 -05:00
										 |  |  |                 dup [ dupd matches? ] [ drop f ] if
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  |             ] unless*
 | 
					
						
							|  |  |  |         ] | 
					
						
							| 
									
										
										
										
											2008-06-10 21:42:55 -04:00
										 |  |  |     } 0&& nip ;
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : mark-number ( keyword -- id )
 | 
					
						
							|  |  |  |     keyword-number? DIGIT and ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : mark-keyword ( keyword -- id )
 | 
					
						
							| 
									
										
										
										
											2008-08-30 21:32:26 -04:00
										 |  |  |     current-rule-set keywords>> at ;
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : add-remaining-token ( -- )
 | 
					
						
							| 
									
										
										
										
											2008-08-30 21:32:26 -04:00
										 |  |  |     current-rule-set default>> prev-token, ;
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : mark-token ( -- )
 | 
					
						
							|  |  |  |     current-keyword | 
					
						
							|  |  |  |     dup mark-number [ ] [ mark-keyword ] ?if
 | 
					
						
							|  |  |  |     [ prev-token, ] when* ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : current-char ( -- char )
 | 
					
						
							|  |  |  |     position get line get nth ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | GENERIC: match-position ( rule -- n )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: mark-previous-rule match-position drop last-offset get ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: rule match-position drop position get ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : can-match-here? ( matcher rule -- ? )
 | 
					
						
							|  |  |  |     match-position { | 
					
						
							|  |  |  |         [ over ] | 
					
						
							| 
									
										
										
										
											2008-08-30 21:32:26 -04:00
										 |  |  |         [ over at-line-start?>>     over zero?                implies ] | 
					
						
							|  |  |  |         [ over at-whitespace-end?>> over whitespace-end get = implies ] | 
					
						
							|  |  |  |         [ over at-word-start?>>     over last-offset get =    implies ] | 
					
						
							| 
									
										
										
										
											2008-06-10 21:42:55 -04:00
										 |  |  |     } 0&& 2nip ;
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-08 03:23:14 -05:00
										 |  |  | : rest-of-line ( -- str )
 | 
					
						
							|  |  |  |     line get position get tail-slice ;
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-08 15:14:33 -05:00
										 |  |  | GENERIC: text-matches? ( string text -- match-count/f )
 | 
					
						
							| 
									
										
										
										
											2007-12-02 05:25:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-08 03:23:14 -05:00
										 |  |  | M: f text-matches? | 
					
						
							|  |  |  |     2drop f ;
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-08 03:23:14 -05:00
										 |  |  | M: string-matcher text-matches? | 
					
						
							|  |  |  |     [ | 
					
						
							| 
									
										
										
										
											2008-09-02 04:01:19 -04:00
										 |  |  |         [ string>> ] [ ignore-case?>> ] bi string-head? | 
					
						
							|  |  |  |     ] keep string>> length and ;
 | 
					
						
							| 
									
										
										
										
											2007-12-06 00:23:18 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: regexp text-matches? | 
					
						
							| 
									
										
										
										
											2009-03-28 23:19:55 -04:00
										 |  |  |     [ >string ] dip first-match dup [ to>> ] when ;
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : rule-start-matches? ( rule -- match-count/f )
 | 
					
						
							| 
									
										
										
										
											2009-11-05 18:03:24 -05:00
										 |  |  |     [ start>> dup ] keep can-match-here? [ | 
					
						
							| 
									
										
										
										
											2008-08-30 21:32:26 -04:00
										 |  |  |         rest-of-line swap text>> text-matches? | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  |     ] [ | 
					
						
							|  |  |  |         drop f
 | 
					
						
							|  |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : rule-end-matches? ( rule -- match-count/f )
 | 
					
						
							|  |  |  |     dup mark-following-rule? [ | 
					
						
							| 
									
										
										
										
											2014-11-30 22:26:23 -05:00
										 |  |  |         [ start>> ] keep can-match-here? 0 and
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  |     ] [ | 
					
						
							| 
									
										
										
										
											2009-11-05 18:03:24 -05:00
										 |  |  |         [ end>> dup ] keep can-match-here? [ | 
					
						
							| 
									
										
										
										
											2007-12-08 03:23:14 -05:00
										 |  |  |             rest-of-line | 
					
						
							| 
									
										
										
										
											2008-08-30 21:32:26 -04:00
										 |  |  |             swap text>> context get end>> or
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  |             text-matches? | 
					
						
							|  |  |  |         ] [ | 
					
						
							|  |  |  |             drop f
 | 
					
						
							|  |  |  |         ] if
 | 
					
						
							|  |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-02 05:25:18 -05:00
										 |  |  | DEFER: get-rules | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : get-always-rules ( vector/f ruleset -- vector/f )
 | 
					
						
							| 
									
										
										
										
											2008-08-30 21:32:26 -04:00
										 |  |  |     f swap rules>> at ?push-all ;
 | 
					
						
							| 
									
										
										
										
											2007-12-02 05:25:18 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : get-char-rules ( vector/f char ruleset -- vector/f )
 | 
					
						
							| 
									
										
										
										
											2008-12-17 20:17:37 -05:00
										 |  |  |     [ ch>upper ] dip rules>> at ?push-all ;
 | 
					
						
							| 
									
										
										
										
											2007-12-02 05:25:18 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : get-rules ( char ruleset -- seq )
 | 
					
						
							| 
									
										
										
										
											2009-01-23 19:20:47 -05:00
										 |  |  |     [ f ] 2dip [ get-char-rules ] keep get-always-rules ;
 | 
					
						
							| 
									
										
										
										
											2007-12-02 05:25:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  | GENERIC: handle-rule-start ( match-count rule -- )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | GENERIC: handle-rule-end ( match-count rule -- )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-02 05:25:18 -05:00
										 |  |  | : find-escape-rule ( -- rule )
 | 
					
						
							|  |  |  |     context get dup
 | 
					
						
							| 
									
										
										
										
											2008-08-30 21:32:26 -04:00
										 |  |  |     in-rule-set>> escape-rule>> [ ] [ | 
					
						
							|  |  |  |         parent>> in-rule-set>> | 
					
						
							|  |  |  |         dup [ escape-rule>> ] when
 | 
					
						
							| 
									
										
										
										
											2007-12-02 05:25:18 -05:00
										 |  |  |     ] ?if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : check-escape-rule ( rule -- ? )
 | 
					
						
							| 
									
										
										
										
											2008-08-30 22:10:02 -04:00
										 |  |  |     no-escape?>> [ f ] [ | 
					
						
							| 
									
										
										
										
											2007-12-02 05:25:18 -05:00
										 |  |  |         find-escape-rule dup [ | 
					
						
							|  |  |  |             dup rule-start-matches? dup [ | 
					
						
							|  |  |  |                 swap handle-rule-start | 
					
						
							| 
									
										
										
										
											2011-10-29 04:01:59 -04:00
										 |  |  |                 delegate-end-escaped? toggle
 | 
					
						
							| 
									
										
										
										
											2007-12-02 05:25:18 -05:00
										 |  |  |                 t
 | 
					
						
							|  |  |  |             ] [ | 
					
						
							|  |  |  |                 2drop f
 | 
					
						
							|  |  |  |             ] if
 | 
					
						
							|  |  |  |         ] when
 | 
					
						
							|  |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  | : check-every-rule ( -- ? )
 | 
					
						
							|  |  |  |     current-char current-rule-set get-rules | 
					
						
							|  |  |  |     [ rule-start-matches? ] map-find
 | 
					
						
							|  |  |  |     dup [ handle-rule-start t ] [ 2drop f ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : ?end-rule ( -- )
 | 
					
						
							|  |  |  |     current-rule [ | 
					
						
							|  |  |  |         dup rule-end-matches? | 
					
						
							|  |  |  |         dup [ swap handle-rule-end ] [ 2drop ] if
 | 
					
						
							|  |  |  |     ] when* ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : rule-match-token* ( rule -- id )
 | 
					
						
							| 
									
										
										
										
											2008-08-30 21:32:26 -04:00
										 |  |  |     dup match-token>> { | 
					
						
							| 
									
										
										
										
											2008-08-30 22:10:02 -04:00
										 |  |  |         { f [ dup body-token>> ] } | 
					
						
							| 
									
										
										
										
											2008-08-30 21:32:26 -04:00
										 |  |  |         { t [ current-rule-set default>> ] } | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  |         [ ] | 
					
						
							|  |  |  |     } case nip ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-02 05:25:18 -05:00
										 |  |  | M: escape-rule handle-rule-start | 
					
						
							|  |  |  |     drop
 | 
					
						
							|  |  |  |     ?end-rule | 
					
						
							|  |  |  |     process-escape? get [ | 
					
						
							| 
									
										
										
										
											2011-10-29 04:01:59 -04:00
										 |  |  |         escaped? toggle
 | 
					
						
							| 
									
										
										
										
											2007-12-02 05:25:18 -05:00
										 |  |  |         position [ + ] change
 | 
					
						
							| 
									
										
										
										
											2009-02-12 14:18:43 -05:00
										 |  |  |     ] [ drop ] if ;
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: seq-rule handle-rule-start | 
					
						
							|  |  |  |     ?end-rule | 
					
						
							|  |  |  |     mark-token | 
					
						
							|  |  |  |     add-remaining-token | 
					
						
							| 
									
										
										
										
											2009-11-05 18:03:24 -05:00
										 |  |  |     [ body-token>> next-token, ] keep
 | 
					
						
							| 
									
										
										
										
											2009-01-31 00:26:41 -05:00
										 |  |  |     delegate>> [ push-context ] when* ;
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | UNION: abstract-span-rule span-rule eol-span-rule ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: abstract-span-rule handle-rule-start | 
					
						
							|  |  |  |     ?end-rule | 
					
						
							|  |  |  |     mark-token | 
					
						
							|  |  |  |     add-remaining-token | 
					
						
							| 
									
										
										
										
											2009-11-05 18:03:24 -05:00
										 |  |  |     [ rule-match-token* next-token, ] keep
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  |     ! ... end subst ... | 
					
						
							| 
									
										
										
										
											2010-05-05 16:52:54 -04:00
										 |  |  |     dup context get in-rule<< | 
					
						
							| 
									
										
										
										
											2009-01-31 00:26:41 -05:00
										 |  |  |     delegate>> push-context ;
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: span-rule handle-rule-end | 
					
						
							|  |  |  |     2drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: mark-following-rule handle-rule-start | 
					
						
							|  |  |  |     ?end-rule | 
					
						
							|  |  |  |     mark-token add-remaining-token | 
					
						
							| 
									
										
										
										
											2009-11-05 18:03:24 -05:00
										 |  |  |     [ rule-match-token* next-token, ] keep
 | 
					
						
							| 
									
										
										
										
											2010-05-05 16:52:54 -04:00
										 |  |  |     f context get end<< | 
					
						
							|  |  |  |     context get in-rule<< ;
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-02 05:25:18 -05:00
										 |  |  | M: mark-following-rule handle-rule-end | 
					
						
							|  |  |  |     nip rule-match-token* prev-token, | 
					
						
							| 
									
										
										
										
											2010-05-05 16:52:54 -04:00
										 |  |  |     f context get in-rule<< ;
 | 
					
						
							| 
									
										
										
										
											2007-12-02 05:25:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  | M: mark-previous-rule handle-rule-start | 
					
						
							|  |  |  |     ?end-rule | 
					
						
							|  |  |  |     mark-token | 
					
						
							| 
									
										
										
										
											2008-09-02 04:01:19 -04:00
										 |  |  |     dup body-token>> prev-token, | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  |     rule-match-token* next-token, ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-09 03:14:14 -04:00
										 |  |  | : do-escaped ( -- )
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  |     escaped? get [ | 
					
						
							|  |  |  |         escaped? off
 | 
					
						
							| 
									
										
										
										
											2007-12-02 05:25:18 -05:00
										 |  |  |         ! ... | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  |     ] when ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : check-end-delegate ( -- ? )
 | 
					
						
							| 
									
										
										
										
											2008-08-30 21:32:26 -04:00
										 |  |  |     context get parent>> [ | 
					
						
							|  |  |  |         in-rule>> [ | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  |             dup rule-end-matches? dup [ | 
					
						
							|  |  |  |                 [ | 
					
						
							|  |  |  |                     swap handle-rule-end | 
					
						
							|  |  |  |                     ?end-rule | 
					
						
							|  |  |  |                     mark-token | 
					
						
							|  |  |  |                     add-remaining-token | 
					
						
							| 
									
										
										
										
											2008-08-30 21:32:26 -04:00
										 |  |  |                 ] keep context get parent>> in-rule>> | 
					
						
							|  |  |  |                 rule-match-token* next-token, | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  |                 pop-context | 
					
						
							|  |  |  |                 seen-whitespace-end? on t
 | 
					
						
							| 
									
										
										
										
											2007-12-02 05:25:18 -05:00
										 |  |  |             ] [ drop check-escape-rule ] if
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  |         ] [ f ] if*
 | 
					
						
							|  |  |  |     ] [ f ] if* ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : handle-no-word-break ( -- )
 | 
					
						
							| 
									
										
										
										
											2008-08-30 21:32:26 -04:00
										 |  |  |     context get parent>> [ | 
					
						
							|  |  |  |         in-rule>> [ | 
					
						
							| 
									
										
										
										
											2008-08-30 22:10:02 -04:00
										 |  |  |             dup no-word-break?>> [ | 
					
						
							| 
									
										
										
										
											2007-12-10 02:20:36 -05:00
										 |  |  |                 rule-match-token* prev-token, | 
					
						
							|  |  |  |                 pop-context | 
					
						
							|  |  |  |             ] [ drop ] if
 | 
					
						
							|  |  |  |         ] when*
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  |     ] when* ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : check-rule ( -- )
 | 
					
						
							|  |  |  |     ?end-rule | 
					
						
							|  |  |  |     handle-no-word-break | 
					
						
							|  |  |  |     mark-token | 
					
						
							|  |  |  |     add-remaining-token ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : (check-word-break) ( -- )
 | 
					
						
							|  |  |  |     check-rule | 
					
						
							| 
									
										
										
										
											2014-11-14 20:31:33 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-30 21:32:26 -04:00
										 |  |  |     1 current-rule-set default>> next-token, ;
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-02 05:25:18 -05:00
										 |  |  | : rule-set-empty? ( ruleset -- ? )
 | 
					
						
							| 
									
										
										
										
											2008-08-30 21:32:26 -04:00
										 |  |  |     [ rules>> ] [ keywords>> ] bi
 | 
					
						
							| 
									
										
										
										
											2011-10-15 22:19:44 -04:00
										 |  |  |     [ assoc-empty? ] both? ;
 | 
					
						
							| 
									
										
										
										
											2007-12-02 05:25:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  | : check-word-break ( -- ? )
 | 
					
						
							|  |  |  |     current-char dup blank? [ | 
					
						
							|  |  |  |         drop
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         seen-whitespace-end? get [ | 
					
						
							| 
									
										
										
										
											2009-08-14 15:27:23 -04:00
										 |  |  |             position get 1 + whitespace-end set
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  |         ] unless
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         (check-word-break) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ] [ | 
					
						
							| 
									
										
										
										
											2007-12-02 05:25:18 -05:00
										 |  |  |         ! Micro-optimization with incorrect semantics; we keep | 
					
						
							|  |  |  |         ! it here because jEdit mode files depend on it now... | 
					
						
							|  |  |  |         current-rule-set rule-set-empty? [ | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  |             drop
 | 
					
						
							|  |  |  |         ] [ | 
					
						
							| 
									
										
										
										
											2007-12-02 05:25:18 -05:00
										 |  |  |             dup alpha? [ | 
					
						
							|  |  |  |                 drop
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  |             ] [ | 
					
						
							| 
									
										
										
										
											2007-12-02 05:25:18 -05:00
										 |  |  |                 current-rule-set rule-set-no-word-sep* member? [ | 
					
						
							|  |  |  |                     (check-word-break) | 
					
						
							|  |  |  |                 ] unless
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  |             ] if
 | 
					
						
							|  |  |  |         ] if
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         seen-whitespace-end? on
 | 
					
						
							|  |  |  |     ] if
 | 
					
						
							|  |  |  |     escaped? off
 | 
					
						
							|  |  |  |     delegate-end-escaped? off t ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : mark-token-loop ( -- )
 | 
					
						
							|  |  |  |     position get line get length < [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             [ check-end-delegate ] | 
					
						
							|  |  |  |             [ check-every-rule ] | 
					
						
							|  |  |  |             [ check-word-break ] | 
					
						
							| 
									
										
										
										
											2008-06-10 21:42:55 -04:00
										 |  |  |         } 0|| drop
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         position inc
 | 
					
						
							|  |  |  |         mark-token-loop | 
					
						
							|  |  |  |     ] when ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : mark-remaining ( -- )
 | 
					
						
							|  |  |  |     line get length position set
 | 
					
						
							|  |  |  |     check-rule ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : unwind-no-line-break ( -- )
 | 
					
						
							| 
									
										
										
										
											2008-08-30 21:32:26 -04:00
										 |  |  |     context get parent>> [ | 
					
						
							|  |  |  |         in-rule>> [ | 
					
						
							|  |  |  |             no-line-break?>> [ | 
					
						
							| 
									
										
										
										
											2007-12-10 02:20:36 -05:00
										 |  |  |                 pop-context | 
					
						
							|  |  |  |                 unwind-no-line-break | 
					
						
							|  |  |  |             ] when
 | 
					
						
							|  |  |  |         ] when*
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  |     ] when* ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : tokenize-line ( line-context line rules -- line-context' seq )
 | 
					
						
							|  |  |  |     [ | 
					
						
							| 
									
										
										
										
											2013-03-23 17:35:01 -04:00
										 |  |  |         "MAIN" of -rot
 | 
					
						
							| 
									
										
										
										
											2007-11-28 23:34:11 -05:00
										 |  |  |         init-token-marker | 
					
						
							|  |  |  |         mark-token-loop | 
					
						
							|  |  |  |         mark-remaining | 
					
						
							|  |  |  |         unwind-no-line-break | 
					
						
							|  |  |  |         context get
 | 
					
						
							|  |  |  |     ] { } make ;
 |