]> gitweb.factorcode.org Git - factor.git/blob - basis/xmode/rules/rules.factor
xmode: fix handling of HASH_CHAR and always rules
[factor.git] / basis / xmode / rules / rules.factor
1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs kernel regexp sequences unicode
4 xmode.keyword-map ;
5 IN: xmode.rules
6
7 TUPLE: string-matcher string ignore-case? ;
8
9 C: <string-matcher> string-matcher
10
11 ! Based on org.gjt.sp.jedit.syntax.ParserRuleSet
12 TUPLE: rule-set
13 name
14 props
15 keywords
16 rules
17 imports
18 terminate-char
19 ignore-case?
20 default
21 escape-rule
22 highlight-digits?
23 digit-re
24 no-word-sep
25 finalized?
26 ;
27
28 : <rule-set> ( -- ruleset )
29     rule-set new
30         H{ } clone >>rules
31         H{ } clone >>props
32         V{ } clone >>imports ;
33
34 MEMO: standard-rule-set ( id -- ruleset )
35     <rule-set> swap >>default ;
36
37 : import-rule-set ( import ruleset -- )
38     imports>> push ;
39
40 : inverted-index ( hashes key index -- )
41     [ [ { f } ] when-empty ] 2dip
42     [ swapd push-at ] 2curry each ;
43
44 : rule-set-no-word-sep* ( ruleset -- str )
45     [ no-word-sep>> ] [ keywords>> ] bi
46     dup [ keyword-map-no-word-sep* ] when
47     "_" 3append ;
48
49 ! Match restrictions
50 TUPLE: matcher text at-line-start? at-whitespace-end? at-word-start? ;
51
52 C: <matcher> matcher
53
54 ! Based on org.gjt.sp.jedit.syntax.ParserRule
55 TUPLE: rule
56 no-line-break?
57 no-word-break?
58 start
59 end
60 match-token
61 body-token
62 delegate
63 chars
64 escape-rule
65 ;
66
67 TUPLE: seq-rule < rule ;
68
69 TUPLE: span-rule < rule ;
70
71 TUPLE: eol-span-rule < rule ;
72
73 : init-span ( rule -- )
74     dup delegate>> [ drop ] [
75         dup body-token>> standard-rule-set
76         swap delegate<<
77     ] if ;
78
79 : init-eol-span ( rule -- )
80     dup init-span
81     t >>no-line-break? drop ;
82
83 TUPLE: mark-following-rule < rule ;
84
85 TUPLE: mark-previous-rule < rule ;
86
87 TUPLE: escape-rule < rule ;
88
89 : <escape-rule> ( string -- rule )
90     f <string-matcher> f f f <matcher>
91     escape-rule new swap >>start ;
92
93 GENERIC: text-hash-char ( text -- ch )
94
95 M: f text-hash-char ;
96
97 M: string-matcher text-hash-char string>> first ;
98
99 M: regexp text-hash-char drop f ;
100
101 : rule-chars* ( rule -- string )
102     [ chars>> ] [ start>> ] bi text>>
103     text-hash-char [ suffix ] when* ;
104
105 : add-rule ( rule ruleset -- )
106     [ dup rule-chars* >upper swap ] dip rules>> inverted-index ;
107
108 : add-escape-rule ( string ruleset -- )
109     '[
110         <escape-rule> _ [ escape-rule<< ] [ add-rule ] 2bi
111     ] unless-empty ;