]> gitweb.factorcode.org Git - factor.git/blob - extra/xmode/loader/syntax/syntax.factor
Fixing everything for mandatory stack effects
[factor.git] / extra / xmode / loader / syntax / syntax.factor
1 USING: xmode.tokens xmode.rules xmode.keyword-map xml.data
2 xml.utilities xml assocs kernel combinators sequences
3 math.parser namespaces parser xmode.utilities regexp io.files ;
4 IN: xmode.loader.syntax
5
6 SYMBOL: ignore-case?
7
8 ! Rule tag parsing utilities
9 : (parse-rule-tag) ( rule-set tag specs class -- )
10     construct-rule swap init-from-tag swap add-rule ; inline
11
12 : RULE:
13     scan scan-word
14     parse-definition { } make
15     swap [ (parse-rule-tag) ] 2curry (TAG:) ; parsing
16
17 ! Attribute utilities
18 : string>boolean ( string -- ? ) "TRUE" = ;
19
20 : string>match-type ( string -- obj )
21     {
22         { "RULE" [ f ] }
23         { "CONTEXT" [ t ] }
24         [ string>token ]
25     } case ;
26
27 : string>rule-set-name ( string -- name ) "MAIN" or ;
28
29 ! PROP, PROPS
30 : parse-prop-tag ( tag -- key value )
31     "NAME" over at "VALUE" rot at ;
32
33 : parse-props-tag ( tag -- assoc )
34     child-tags
35     [ parse-prop-tag ] H{ } map>assoc ;
36
37 : position-attrs ( tag -- at-line-start? at-whitespace-end? at-word-start? )
38     ! XXX Wrong logic!
39     { "AT_LINE_START" "AT_WHITESPACE_END" "AT_WORD_START" }
40     swap [ at string>boolean ] curry map first3 ;
41
42 : parse-literal-matcher ( tag -- matcher )
43     dup children>string
44     ignore-case? get <string-matcher>
45     swap position-attrs <matcher> ;
46
47 : parse-regexp-matcher ( tag -- matcher )
48     dup children>string ignore-case? get <regexp>
49     swap position-attrs <matcher> ;
50
51 : shared-tag-attrs ( -- )
52     { "TYPE" string>token set-rule-body-token } , ; inline
53
54 : delegate-attr ( -- )
55     { "DELEGATE" f set-rule-delegate } , ;
56
57 : regexp-attr ( -- )
58     { "HASH_CHAR" f set-rule-chars } , ;
59
60 : match-type-attr ( -- )
61     { "MATCH_TYPE" string>match-type set-rule-match-token } , ;
62
63 : span-attrs ( -- )
64     { "NO_LINE_BREAK" string>boolean set-rule-no-line-break? } ,
65     { "NO_WORD_BREAK" string>boolean set-rule-no-word-break? } ,
66     { "NO_ESCAPE" string>boolean set-rule-no-escape? } , ;
67
68 : literal-start ( -- )
69     [ parse-literal-matcher swap set-rule-start ] , ;
70
71 : regexp-start ( -- )
72     [ parse-regexp-matcher swap set-rule-start ] , ;
73
74 : literal-end ( -- )
75     [ parse-literal-matcher swap set-rule-end ] , ;
76
77 ! SPAN's children
78 <TAGS: parse-begin/end-tag
79
80 TAG: BEGIN
81     ! XXX
82     parse-literal-matcher swap set-rule-start ;
83
84 TAG: END
85     ! XXX
86     parse-literal-matcher swap set-rule-end ;
87
88 TAGS>
89
90 : parse-begin/end-tags ( -- )
91     [
92         ! XXX: handle position attrs on span tag itself
93         child-tags [ parse-begin/end-tag ] with each
94     ] , ;
95
96 : init-span-tag ( -- ) [ drop init-span ] , ;
97
98 : init-eol-span-tag ( -- ) [ drop init-eol-span ] , ;
99
100 : parse-keyword-tag ( tag keyword-map -- )
101     >r dup name-tag string>token swap children>string r> set-at ;