1 USING: xmode.tokens xmode.keyword-map kernel
2 sequences vectors assocs strings memoize regexp ;
5 TUPLE: string-matcher string ignore-case? ;
7 C: <string-matcher> string-matcher
9 ! Based on org.gjt.sp.jedit.syntax.ParserRuleSet
26 : init-rule-set ( ruleset -- )
27 #! Call after constructor.
28 >r H{ } clone H{ } clone V{ } clone r>
35 : <rule-set> ( -- ruleset )
36 rule-set construct-empty dup init-rule-set ;
38 MEMO: standard-rule-set ( id -- ruleset )
39 <rule-set> [ set-rule-set-default ] keep ;
41 : import-rule-set ( import ruleset -- )
42 rule-set-imports push ;
44 : inverted-index ( hashes key index -- )
45 [ swapd [ ?push ] change-at ] 2curry each ;
47 : ?push-all ( seq1 seq2 -- seq1+seq2 )
49 over [ >r V{ } like r> over push-all ] [ nip ] if
52 : rule-set-no-word-sep* ( ruleset -- str )
53 dup rule-set-no-word-sep
54 swap rule-set-keywords dup [ keyword-map-no-word-sep* ] when
58 TUPLE: matcher text at-line-start? at-whitespace-end? at-word-start? ;
62 ! Based on org.gjt.sp.jedit.syntax.ParserRule
75 : construct-rule ( class -- rule )
76 >r rule construct-empty r> construct-delegate ; inline
82 TUPLE: eol-span-rule ;
84 : init-span ( rule -- )
85 dup rule-delegate [ drop ] [
86 dup rule-body-token standard-rule-set
87 swap set-rule-delegate
90 : init-eol-span ( rule -- )
92 t swap set-rule-no-line-break? ;
94 TUPLE: mark-following-rule ;
96 TUPLE: mark-previous-rule ;
100 : <escape-rule> ( string -- rule )
101 f <string-matcher> f f f <matcher>
102 escape-rule construct-rule
103 [ set-rule-start ] keep ;
105 GENERIC: text-hash-char ( text -- ch )
107 M: f text-hash-char ;
109 M: string-matcher text-hash-char string-matcher-string first ;
111 M: regexp text-hash-char drop f ;
113 : rule-chars* ( rule -- string )
115 swap rule-start matcher-text
116 text-hash-char [ add ] when* ;
118 : add-rule ( rule ruleset -- )
119 >r dup rule-chars* >upper swap
120 r> rule-set-rules inverted-index ;
122 : add-escape-rule ( string ruleset -- )
125 2dup set-rule-set-escape-rule