]> gitweb.factorcode.org Git - factor.git/blob - misc/vim/syntax/factor.vim
misc/vim: more private fixes.
[factor.git] / misc / vim / syntax / factor.vim
1 " Vim syntax file
2 " Language: Factor
3 " Maintainer: Alex Chapman <chapman.alex@gmail.com>
4 " Last Change: 2020 Sep 30
5 " Minimum Version: 600
6
7 " Factor |syntax| file guide & conventions:
8 "
9 " Inside |:comment|s, words in |bars| contain |:help| keywords.
10 "   |K| looks these up.
11 "
12 " Alignment columns should normally occur on multiples of 4.
13 " Align Vim syntax alternatives naturally. E.g.:
14 "   "syn match   ..."
15 "   "syn cluster ..."
16 "   "syn region  ..."
17 " Align |:syn-start|, |:syn-skip|, and |:syn-end| on their patterns.
18 " ":echo (col('.') - 1) % 4" is handy here.
19 "
20 " All syntax patterns (|:syn-pattern|) are "very magic" (|/\v|).
21 " Escape all literal [^[:alnum:]_-!:;] characters in these patterns.
22 " (Not escaping [-!:;] characters risks forward-incompatibility,
23 "   but fixes if an incompatible Vim arises would be trivial,
24 "   and Factor likes these characters.)
25 "
26 " Syntax groups ending in "Error" match errors via |:syn-priority|,
27 "   and should normally |:hi-link| to "Error".
28 "
29 " Syntax groups named "{group-name}Trans" are |:syn-transparent|.
30 "
31 " |:syn-cluster|s named "{group-name}" mean to allow |:syn-contains| use of
32 "   |:syn-priority|-based error-detection.
33 " This still applies to clusters named "{group-name}Trans".
34 "
35 " Syntax groups "{group-name}Skip" have the form:
36 " "syn match {group-name}Skip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup={group-name} transparent contained"
37 " Specifying "nextgroup={group-name}Skip skipempty" works like a Factor-aware
38 "   "nextgroup={group-name} skipwhite skipempty"
39 "   with required initial space (not optional).
40 " "{cluster-name}Skip" works similarly, but with "nextgroup=@{cluster-name}".
41 "
42 " Vim's syntax highlighting freaks at paired "/\v\(" and "/\v\)". ☹
43 " Switching into very nomagic (with "/\V(\v/" or "/\V)\v") averts that,
44 "   as non-escaped parentheses don't extend pattern regions.
45 "
46 " A handy testing command:
47 " "echo join(map(synstack(line('.'),col('.')),{sn->{i,s->{t->sn(s).(s==t?'':' ('.sn(t).')')}(synIDtrans(s))}}({s->synIDattr(s,'name')})),' -> ')"
48 "   Outputs in the form "hi<...> trans<...> lo<...>":
49 "     "hi": syntax group
50 "     "trans": transparent syntax group (if not applicable, same as "hi")
51 "     "lo": highlight group
52
53 if exists('b:current_syntax')
54   finish
55 endif
56
57 " Factor is case sensitive.
58 syn case match
59
60 syn match   factorWord   /\v<\S+>/  contains=@factorWord transparent display
61 syn cluster factorCluster           contains=factorWord,factorComment,factorMultilineComment,@factorClusterValue,factorDeclaration,factorCall,factorCallNextMethod,@factorWordOps,factorAlien,factorSlot,factorTuple,factorStruct
62 syn cluster factorClusterValue      contains=factorBreakpoint,factorBoolean,factorFrySpecifier,factorChar,@factorString,@factorNumber,factorBackslash,factorMBackslash,factorLiteral,@factorStackEffect,@factorQuotation,@factorArray,factorRegexp
63
64 " A crash course on Factor's lexer:
65 "
66 " The "lexer" vocabulary parses lines (arrays of strings) into tokens.
67 " Tokens are non-space strings, effectively words.
68 " The "lexer" class holds lex state.
69 " Lexer method "skip-word" advances to the next space
70 "     while also counting leading double quotation marks as their own words.
71 "   I.e., this advances to the end of the current token
72 "     (if currently at a token, otherwise nothing changes).
73 " Method "skip-blank" advances to the next non-space
74 "     while also skipping shebangs at the beginning of the first line.
75 "   I.e., this advances to the start of the next token
76 "     (if one is present, otherwise it advances to the line's end).
77 " "(parse-raw)" advances a lexer through an immediate token via "skip-word",
78 "   and returns the (sub)token advanced through.
79 "   Note that this will not advance a lexer at space,
80 "     and an empty string will be returned.
81 " "next-line" advances a lexer to the start of the next line,
82 "   adding an effectively empty line to the end (as an EOF state).
83 " "parse-raw" advances a lexer through the next token,
84 "   first via alternating "skip-blank" & "next-line" if the line ended,
85 "     then via "(parse-raw)",
86 "   and returns it if found, otherwise (i.e. upon EOF) returning "f".
87 "     Note that the lexer will be advanced to EOF if "f" is returned.
88 " Comments are (unprocessed) remainders of lines, after a "!" word.
89 " "parse-token" advances a lexer though the next token via "parse-raw",
90 "   then returns it if found, otherwise returning "f".
91 "   while also advancing through comments
92 "     via mutual recursion with "skip-comment".
93 "   "[ skip-comment ] call( lexer str -- str' )" tests if a token is "!",
94 "     returning that token if so,
95 "     otherwise first advancing a lexer to the next line via "next-line"
96 "         (i.e. discarding the rest of the current line)
97 "       and then advancing it via "parse-token" & returning that token,
98 "     ensuring the return of "parse-token"'s desired non-comment token.
99 " The "lexer" dynamic variable holds the ambient lexer.
100 " "?scan-token" advances the ambient lexer through the next token
101 "     via "parse-token",
102 "   and returns it if found, otherwise returning "f".
103 " "scan-token" advances the ambient lexer through the next token
104 "     via "?scan-token",
105 "   and returns it if found, otherwise throwing an exception.
106 " All other words in the "lexer" vocabulary read via "scan-token", if at all.
107 " So! To know when double quotes & exclamation marks aren't special,
108 "   grep for "parse-raw". (Mostly. To be certain, grep for "lexer".)
109
110 syn match   factorShebang         /\v%^\#!.*$/ display
111
112 syn cluster factorComment           contains=factorComment
113 syn match   factorComment           /\v<!>.*$/ contains=@factorCommentContents
114 syn cluster factorCommentContents   contains=factorTodo,@Spell
115 syn match   factorTodo              /\v(TODO|FIXME|XXX):=/ contained
116
117 syn region  factorDefn            start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/                 matchgroup=factorDefnDelims     end=/\v<;>/ contains=factorDefnDelims,@factorCluster
118 syn region  factorDefnDelims      start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ end=/\v<\S+>/   contains=@factorComment nextgroup=factorStackEffectSkip skipempty contained
119 syn region  factorMethod          start=/\v<M:>/                                                matchgroup=factorMethodDelims   end=/\v<;>/ contains=factorMethodDelims,@factorCluster
120 syn region  factorMethodDelims    start=/\v<M:>/               skip=/\v<!>.*/   end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment skipempty keepend contained
121 syn region  factorLocalsMethod    start=/\v<M::>/                                               matchgroup=factorLocalsMethodDelims     end=/\v<;>/ contains=factorLocalsMethodDelims,@factorCluster
122 syn region  factorLocalsMethodDelims    start=/\v<M::>/        skip=/\v<!>.*/   end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend contained
123 syn region  factorGeneric         start=/\v<%(GENERIC|MATH|PRIMITIVE):>/                        end=/\v<\S+>/   contains=@factorComment nextgroup=factorStackEffectSkip skipempty
124 syn region  factorGenericN        start=/\v<GENERIC\#:>/   skip=/\v<!>.*/   end=/\v<\S+%(\_\s+%(!>.*)?)+\d+>/   contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend
125 syn region  factorHook            start=/\v<HOOK:>/            skip=/\v<!>.*/   end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend
126
127 syn region  factorPDefn           start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ skip=/\v<!>.*/  matchgroup=factorPDefnDelims    end=/\v<;>/ contains=factorPDefnDelims,@factorCluster contained
128 syn region  factorPDefnDelims     start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ end=/\v<\S+>/   contains=@factorComment nextgroup=factorStackEffectSkip skipempty contained
129 syn region  factorPMethod         start=/\v<M:>/                                                matchgroup=factorPMethodDelims  end=/\v<;>/ contains=factorPMethodDelims,@factorCluster contained
130 syn region  factorPMethodDelims   start=/\v<M:>/               skip=/\v<!>.*/   end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment skipempty keepend contained
131 syn region  factorPLocalsMethod   start=/\v<M::>/                                               matchgroup=factorPLocalsMethodDelims    end=/\v<;>/ contains=factorPLocalsMethodDelims,@factorCluster contained
132 syn region  factorPLocalsMethodDelims   start=/\v<M::>/        skip=/\v<!>.*/   end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend contained
133 syn region  factorPGeneric        start=/\v<%(GENERIC|MATH|PRIMITIVE):>/        skip=/\v<!>.*/  end=/\v<\S+>/   contains=@factorComment nextgroup=factorStackEffectSkip skipempty contained
134 syn region  factorPGenericN       start=/\v<GENERIC\#:>/       skip=/\v<!>.*/   end=/\v<\S+%(\_\s+%(!>.*)?)+\d+>/   contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend contained
135 syn region  factorPHook           start=/\v<HOOK:>/            skip=/\v<!>.*/   end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend contained
136
137 syn region  factorPrivate         start=/\v<\<PRIVATE>/ end=/\v<PRIVATE\>>/ contains=@factorCluster,factorPDefn,factorPMethod,factorPLocalsMethod,factorPGeneric,factorPGenericN,factorPHook skipempty keepend
138
139 syn keyword factorBoolean           f t
140 syn keyword factorBreakpoint        B
141 syn keyword factorFrySpecifier      @ _ contained
142 syn keyword factorDeclaration       delimiter deprecated final flushable foldable inline recursive
143 syn region  factorCall matchgroup=factorCallDelims start=/\v<%(call|execute)\V(\v>/  end=/\v<\V)\v>/ contains=@factorStackEffectContents
144 syn keyword factorCallNextMethod    call-next-method
145
146 syn region  factorChar              start=/\v<CHAR:>/  end=/\v\S+>/
147 syn region  factorColor             start=/\v<COLOR:>/ end=/\v\S+>/
148
149 syn match   factorEscape            /\v\\([\\astnrbvf0e\"]|u\x{6}|u\{\S+}|x\x{2})/  contained display
150 syn region  factorString            matchgroup=factorStringDelims   start=/\v<"/                 skip=/\v\\"/ end=/\v"/           contains=factorEscape
151 syn region  factorString            matchgroup=factorStringDelims   start=/\v<"""/               skip=/\v\\"/ end=/\v"""/         contains=factorEscape
152 syn region  factorString            matchgroup=factorStringDelims   start=/\v<[^[:blank:]"]+"/   skip=/\v\\"/ end=/\v"/           contains=factorEscape
153 syn region  factorString            matchgroup=factorStringDelims   start=/\v\[\z(\=*)\[/                     end=/\]\z1\]/       contains=factorEscape
154 syn region  factorString            matchgroup=factorStringDelims   start=/\v<HEREDOC:\s+\z(.*)$>/            end=/\v^\z1$>/
155 syn region  factorString            matchgroup=factorStringDelims   start=/\v<[^[\][:blank:]]+\[\z(\=*)\[>/   end=/\v\]\z1\]/
156
157 syn region  factorNamedString       matchgroup=factorNamedStringDelims   start=/\v<STRING:\s+\S+$>/   end=/\v^<;>$/  contains=factorEscape
158
159 syn region  factorMultilineComment  start=/\v<\/\*>/              end=/\v\*\//       contains=@factorCommentContents keepend
160 syn region  factorMultilineComment  start=/\v<!\[\z(\=*)\[/       end=/\v\]\z1\]/    contains=@factorCommentContents keepend
161
162 syn region factorRegexp             start=/\v<%(R\/\s)/  skip=/\v%(\\\/)/  end=/\v%(\/\S*)>/
163
164 syn cluster factorReal                  contains=@factorInteger,@factorFloat,@factorRatio,@factorBin,@factorOct,@factorHex,factorNan
165 syn cluster factorNumber                contains=@factorReal,factorComplex
166
167 syn cluster factorInteger               contains=factorInteger
168 if !exists('g:factor_syn_no_error') " more general
169   syn cluster factorInteger             add=factorIntegerError
170   syn match   factorIntegerError        /\v<[+-]=%(\d|,){-}\d%(\d|,)*>/
171 endif
172 syn match   factorInteger               /\v<[+-]=\d%(\d|,)*,@1<!>/
173
174 syn cluster factorFloat                 contains=factorFloat
175 if !exists('g:factor_syn_no_error') " more general
176   syn cluster factorFloat               add=factorFloatError
177   syn match   factorFloatError          /\v<[+-]=%(\S{-}\d&%(\d|,)*%([eE][+-]=%(\d|,)*|\.%(\d|,)*%([eE][+-]=%(\d|,)*)?)|\.%(\d|,)+%([eE][+-]=%(\d|,)*)?)>/
178 endif
179 syn match   factorFloat                 /\v<[+-]=%(\d%(\d|,)*,@1<!%([eE][+-]=\d%(\d|,)*,@1<!|\.%(\d%(\d|,)*,@1<!)?%([eE][+-]=\d%(\d|,)*,@1<!)?)|\.\d%(\d|,)*,@1<!%([eE][+-]=\d%(\d|,)*,@1<!)?)>/
180
181 syn cluster factorRatio                 contains=factorRatio
182 if !exists('g:factor_syn_no_error') " more general
183   syn cluster factorRatio               add=factorRatioError
184   syn match   factorRatioError          /\v<[+-]=%(\S{-}\d.{-}\/&%(\d|,)*\.?%(\d|,)*%([+-]%(\d|,)*)?)\/[+-]=%(\S{-}\d&%(\d|,)*\.?%(\d|,)*%([eE][+-]=%(\d|,)*)?)>/
185 endif
186 syn match   factorRatio                 /\v<([+-]=)\d%(\d|,)*,@1<!%(\1@=[+-](\d%(\d|,)*,@1<!)\/\2@!\d%(\d|,)*,@1<!|\/%(\d%(\d|,)*,@1<!%(\.%(\d%(\d|,)*,@1<!)?)?|\.\d%(\d|,)*,@1<!)%([eE][+-]=\d%(\d|,)*,@1<!)?)%(\/0)@2<!>/
187
188 syn region  factorComplex         start=/\v<C\{>/   skip=/\v<!>.*/ end=/\v<\}>/    contains=@factorComment,@factorReal
189
190 syn cluster factorBin                   contains=factorBin
191 if !exists('g:factor_syn_no_error')
192   syn cluster factorBin                 add=factorBinError
193   syn match   factorBinError            /\v<[+-]=0[bB]%(\S{-}\w&%(\w|,)*\.?%(\w|,)*%([pP][+-]=%(\w|,)*)?)>/
194 endif
195 syn match   factorBin                   /\v<[+-]=0[bB]%([01][01,]*,@1<!%(\.%([01][01,]*,@1<!)?)?|\.[01][01,]*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/
196
197 syn cluster factorOct                   contains=factorOct
198 if !exists('g:factor_syn_no_error')
199   syn cluster factorOct                 add=factorOctError
200   syn match   factorOctError            /\v<[+-]=0[oO]%(\S{-}\o&%(\w|,)*\.?(\w|,)*%([pP][+-]=%(\w|,)*)?)>/
201 endif
202 syn match   factorOct                   /\v<[+-]=0[oO]%(\o%(\o|,)*,@1<!%(\.%(\o%(\o|,)*,@1<!)?)?|\.\o%(\o|,)*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/
203
204 syn cluster factorHex                   contains=factorHex
205 syn cluster factorHexNoRadix            contains=factorHexNoRadix
206 if !exists('g:factor_syn_no_error')
207   syn cluster factorHex                 add=factorHexError
208   syn match   factorHexError            /\v<[+-]=0[xX]%(\S{-}\x&%(\x|,)*\.?(\x|,)*%([pP][+-]=%(\w|,)*)?)>/
209   syn cluster factorHexNoRadix          add=factorHexNoRadixError
210   syn match   factorHexNoRadixError     /\v<[+-]=%(\S{-}\x&%(\w|,)*\.?(\w|,)*%([pP][+-]=%(\w|,)*)?)>/   contained
211 endif
212 syn match   factorHex                   /\v<[+-]=0[xX]%(\x%(\x|,)*,@1<!%(\.%(\x%(\x|,)*,@1<!)?)?|\.\x%(\x|,)*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/
213 syn match   factorHexNoRadix            /\v<[+-]=%(\x%(\x|,)*,@1<!%(\.%(\x%(\x|,)*,@1<!)?)?|\.\x%(\x|,)*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/  contained
214
215 syn region  factorNan matchgroup=factorNan    start=/\v<NAN:>/ matchgroup=NONE skip=/\v<!>.*/   end=/\v<\S+>/   contains=@factorComment,@factorHexNoRadix keepend
216
217 syn region  factorBackslash       start=/\v<\\>/     skip=/\v<!>.*/       end=/\v<\S+>/   contains=@factorComment
218 syn region  factorMBackslash      start=/\v<M\\>/    skip=/\v<!>.*/       end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment keepend
219 syn region  factorLiteral         start=/\v<\$>/     skip=/\v<!>.*/       end=/\v<\S+>/   contains=@factorComment
220
221 syn match   factorSlotAttrReadOnly      /\v<read-only>/ contained
222 syn match   factorSlotAttrInitial       /\v<initial:>%(\_\s+%(!>.*)?)+/ contains=@factorComment nextgroup=factorWord,@factorClusterValue contained
223 syn cluster factorSlotAttr              contains=factorSlotAttrInitial,factorSlotAttrReadOnly
224
225 syn cluster factorTupleSlotAttr         contains=@factorSlotAttr
226 syn match   factorTupleSlotAttrSkip     /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=@factorTupleSlotAttr contained transparent
227 syn match   factorTupleSlotName         /\v<\S+>/ nextgroup=factorTupleSlotClassSkip skipempty contained
228 syn match   factorTupleSlotNameSkip     /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorTupleSlotName transparent contained
229 syn match   factorTupleSlotClass        /\v<\S+>/ nextgroup=factorTupleSlotAttrSkip skipempty contained
230 syn match   factorTupleSlotClassSkip    /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=@factorTupleSlotAttr,factorTupleSlotClass transparent contained
231 syn region  factorTupleSlot   matchgroup=factorTupleSlotDelims  start=/\v<\{>/                end=/\v<\}>/    contains=@factorComment,factorTupleSlotName,@factorTupleSlotAttr contained
232 "syn match   factorTupleClass            /\v<\S+>/ nextgroup=factorTupleSuperClass,factorTupleSlot contained
233 "syn region  factorTupleSuperClass  matchgroup=NONE     start=/\v%(\s+\<\s+)/     matchgroup=Identifier end=/\v<\S+>/   contains=@factorComment contained nextgroup=factorTupleSlot
234 syn region  factorTuple   matchgroup=factorTupleDelims          start=/\v<%(TUPLE|BUILTIN|ERROR):>/ end=/\v<;>/     contains=@factorComment,factorTupleSlot
235 syn region  factorPredicate   matchgroup=factorPredicateDelims  start=/\v<%(PREDICATE):>/     end=/\v<;>/     contains=@factorComment,factorTupleSlot
236
237 syn match   factorStructSlotAttrBits    /\v<bits:>%(\_\s+%(!>.*)?)+/    contains=@factorComment nextgroup=factorWord,@factorReal contained
238 syn cluster factorStructSlotAttr        contains=@factorSlotAttr,factorStructSlotAttrBits
239 syn match   factorStructSlotName        /\v<\S+>/ nextgroup=factorStructSlotTypeSkip skipempty contained
240 syn match   factorStructSlotNameSkip    /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorStructSlotName contained transparent
241 syn match   factorStructSlotType        /\v<\S+>/ contained
242 syn match   factorStructSlotTypeSkip    /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorStructSlotType contained transparent
243 syn region  factorStructSlot      matchgroup=factorStructSlotDelims start=/\v<\{>/                   skip=/\v<!>.*/  end=/\v<\}>/ contains=@factorComment,factorStructSlotName,@factorStructSlotAttr contained
244 syn region  factorStruct          matchgroup=factorStructDelims     start=/\v<%(%(UNION-)?STRUCT):>/ skip=/\v<!>.*/  end=/\v<;>/  contains=@factorComment,factorStructSlot
245
246 syn region  factorAlias           start=/\v<ALIAS:>/           skip=/\v<!>.*/     end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment keepend
247 syn region  factorAlien           start=/\v<ALIEN:>/           skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment,@factorHexNoRadix
248 syn region  factorConstant        start=/\v<CONSTANT:>/        skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
249 syn region  factorConstructor     start=/\v<C:>/               skip=/\v<!>.*/     end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment keepend
250 syn region  factorConstructor2    start=/\v<CONSTRUCTOR:>/     skip=/\v<!>.*/     end=/\v<;>/     contains=@factorComment,@factorStackEffect
251 syn region  factorDefer           start=/\v<DEFER:>/           skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
252 syn region  factorExclude         start=/\v<EXCLUDE:>/         skip=/\v<!>.*/     end=/\v<;>/     contains=@factorComment
253 syn region  factorForget          start=/\v<FORGET:>/          skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
254 syn region  factorFrom            start=/\v<FROM:>/            skip=/\v<!>.*/     end=/\v<;>/     contains=@factorComment
255 syn region  factorIn              start=/\v<IN:>/              skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
256 syn region  factorInstance        start=/\v<INSTANCE:>/        skip=/\v<!>.*/     end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment keepend
257 syn region  factorIntersection    start=/\v<INTERSECTION:>/    skip=/\v<!>.*/     end=/\v<;>/     contains=@factorComment
258 syn region  factorMain            start=/\v<MAIN:>/            skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
259 syn region  factorMixin           start=/\v<MIXIN:>/           skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
260 syn region  factorPostpone        start=/\v<POSTPONE:>/        skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
261 syn region  factorQualified       start=/\v<QUALIFIED:>/       skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
262 syn region  factorQualifiedWith   start=/\v<QUALIFIED-WITH:>/  skip=/\v<!>.*/     end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/   contains=@factorComment keepend
263 syn region  factorRename          start=/\v<RENAME:>/          skip=/\v<!>.*/     end=/\v<\S+%(\_\s+%(!>.*)?)+\S+%(\_\s+%(!>.*)?)+\=\>%(\_\s+%(!>.*)?)+\S+>/  contains=@factorComment keepend
264 syn region  factorSingleton       start=/\v<SINGLETON:>/       skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
265 syn region  factorSingletons      start=/\v<SINGLETONS:>/      skip=/\v<!>.*/     end=/\v<;>/     contains=@factorComment
266 syn region  factorSlot            start=/\v<SLOT:>/            skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
267 syn region  factorSymbol          start=/\v<SYMBOL:>/          skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
268 syn region  factorSymbols         start=/\v<SYMBOLS:>/         skip=/\v<!>.*/     end=/\v<;>/     contains=@factorComment
269 syn region  factorUnion           start=/\v<UNION:>/           skip=/\v<!>.*/     end=/\v<;>/     contains=@factorComment
270 syn region  factorUnuse           start=/\v<UNUSE:>/           skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
271 syn region  factorUse             start=/\v<USE:>/             skip=/\v<!>.*/     end=/\v<\S+>/   contains=@factorComment
272 syn region  factorUsing           start=/\v<USING:>/           skip=/\v<!>.*/     end=/\v<;>/     contains=@factorComment
273
274 syn cluster factorWordOps   contains=factorConstant,factorAlias,factorSingleton,factorSingletons,factorSymbol,factorSymbols,factorPostpone,factorDefer,factorForget,factorMixin,factorInstance,factorHook,factorMain,factorConstructor
275
276 " HELP:
277 " ARTICLE:
278 " C-ENUM:
279 " FUNCTION:
280 " TYPEDEF:
281 " LIBRARY:
282
283 if !exists('g:factor_syn_no_error')
284   syn match   factorStackEffectRequired /\v<\V(\@!\v\S+>/    contained
285 endif
286 syn cluster factorStackEffectContents   contains=@factorComment,factorStackEffectDelims,factorStackEffectVar,factorStackEffectType,factorStackEffectRowVar
287 syn cluster factorStackEffect           contains=factorStackEffect
288 " Erroring on stack effects without a "--" separator would be nice.
289 " Unfortunately, that sort of vacuous detection is above Vim's pay-grade,
290 "   especially when stack effects can be nested arbitrarily via types.
291 syn match   factorStackEffectSkip       /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorStackEffectRequired,@factorStackEffect transparent contained
292 syn region  factorStackEffect       matchgroup=factorStackEffectDelims    start=/\v\V(\v>/  end=/\v<\V)\v>/ contains=@factorStackEffectContents
293 syn match   factorStackEffectVar        /\v<\S+>/           contained
294 " Note that ":!" parses to the "!" word and doesn't lex as a comment.
295 " Also, even though we take any value, the leading ":" breaking the word
296 "   boundary means a lot of our nicer syntax patterns don't match on
297 "   "factorStackEffectType".
298 " syn cluster factorStackEffectType contains=factorWord,@factorStackEffect
299 syn cluster factorStackEffectType       contains=factorWord,@factorClusterValue
300 syn match   factorStackEffectTypeSkip   /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=@factorStackEffectType transparent contained
301 syn match   factorStackEffectVar        /\v<\S+:>/          nextgroup=factorStackEffectTypeSkip skipempty contained
302 syn match   factorStackEffectType       /\v<:/              nextgroup=@factorStackEffectType contained
303 syn match   factorStackEffectRowVar     /\v<\.\.\S+>/       contained
304 syn match   factorStackEffectRowVar     /\v<\.\.\S+:>/      nextgroup=factorStackEffectTypeSkip skipempty contained
305 syn match   factorStackEffectDelims     /\v<-->/            contained
306 if !exists('g:factor_syn_no_error')
307   syn cluster factorStackEffectContents add=factorStackEffectError
308   syn keyword factorStackEffectError    (                   contained
309 endif
310
311 " adapted from lisp.vim
312 if exists('g:factor_syn_no_rainbow')
313   syn cluster factorQuotation   contains=factorQuotation
314   syn region  factorQuotation      matchgroup=factorDelimiter start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/  end=/\v<\]>/    contains=ALL
315 else
316   syn cluster factorQuotation   contains=factorQuotation0
317   syn region  factorQuotation0            matchgroup=hlLevel0 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/  end=/\v<\]>/    contains=@factorCluster,factorQuotation1,factorArray1
318   syn region  factorQuotation1 contained  matchgroup=hlLevel1 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/  end=/\v<\]>/    contains=@factorCluster,factorQuotation2,factorArray2
319   syn region  factorQuotation2 contained  matchgroup=hlLevel2 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/  end=/\v<\]>/    contains=@factorCluster,factorQuotation3,factorArray3
320   syn region  factorQuotation3 contained  matchgroup=hlLevel3 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/  end=/\v<\]>/    contains=@factorCluster,factorQuotation4,factorArray4
321   syn region  factorQuotation4 contained  matchgroup=hlLevel4 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/  end=/\v<\]>/    contains=@factorCluster,factorQuotation5,factorArray5
322   syn region  factorQuotation5 contained  matchgroup=hlLevel5 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/  end=/\v<\]>/    contains=@factorCluster,factorQuotation6,factorArray6
323   syn region  factorQuotation6 contained  matchgroup=hlLevel6 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/  end=/\v<\]>/    contains=@factorCluster,factorQuotation7,factorArray7
324   syn region  factorQuotation7 contained  matchgroup=hlLevel7 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/  end=/\v<\]>/    contains=@factorCluster,factorQuotation8,factorArray8
325   syn region  factorQuotation8 contained  matchgroup=hlLevel8 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/  end=/\v<\]>/    contains=@factorCluster,factorQuotation9,factorArray9
326   syn region  factorQuotation9 contained  matchgroup=hlLevel9 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/  end=/\v<\]>/    contains=@factorCluster,factorQuotation0,factorArray0
327 endif
328
329 if exists('g:factor_syn_no_rainbow')
330   syn cluster factorArray       contains=factorArray
331   syn region  factorArray         matchgroup=factorDelimiter start=/\v<\S*\{>/         end=/\v<\}>/    contains=ALL
332 else
333   syn cluster factorArray       contains=factorArray0
334   syn region  factorArray0               matchgroup=hlLevel0 start=/\v<\S*\{>/         end=/\v<\}>/    contains=@factorCluster,factorArray1,factorQuotation1
335   syn region  factorArray1     contained matchgroup=hlLevel1 start=/\v<\S*\{>/         end=/\v<\}>/    contains=@factorCluster,factorArray2,factorQuotation2
336   syn region  factorArray2     contained matchgroup=hlLevel2 start=/\v<\S*\{>/         end=/\v<\}>/    contains=@factorCluster,factorArray3,factorQuotation3
337   syn region  factorArray3     contained matchgroup=hlLevel3 start=/\v<\S*\{>/         end=/\v<\}>/    contains=@factorCluster,factorArray4,factorQuotation4
338   syn region  factorArray4     contained matchgroup=hlLevel4 start=/\v<\S*\{>/         end=/\v<\}>/    contains=@factorCluster,factorArray5,factorQuotation5
339   syn region  factorArray5     contained matchgroup=hlLevel5 start=/\v<\S*\{>/         end=/\v<\}>/    contains=@factorCluster,factorArray6,factorQuotation6
340   syn region  factorArray6     contained matchgroup=hlLevel6 start=/\v<\S*\{>/         end=/\v<\}>/    contains=@factorCluster,factorArray7,factorQuotation7
341   syn region  factorArray7     contained matchgroup=hlLevel7 start=/\v<\S*\{>/         end=/\v<\}>/    contains=@factorCluster,factorArray8,factorQuotation8
342   syn region  factorArray8     contained matchgroup=hlLevel8 start=/\v<\S*\{>/         end=/\v<\}>/    contains=@factorCluster,factorArray9,factorQuotation9
343   syn region  factorArray9     contained matchgroup=hlLevel9 start=/\v<\S*\{>/         end=/\v<\}>/    contains=@factorCluster,factorArray0,factorQuotation0
344 endif
345
346 if !exists('g:factor_syn_no_error')
347   syn match   factorBracketError    /\v<\]>/
348   syn match   factorBracketError    /\v<\}>/
349 endif
350
351 syn sync lines=100
352
353 if !exists('g:factor_syn_no_init')
354   command -nargs=+ -bar HiLink hi def link <args>
355
356   if !exists('g:factor_syn_no_error')
357     HiLink factorBracketError           Error
358     HiLink factorIntegerError           Error
359     HiLink factorFloatError             Error
360     HiLink factorRatioError             Error
361     HiLink factorBinError               Error
362     HiLink factorHexNoRadixError        Error
363     HiLink factorHexError               Error
364     HiLink factorOctError               Error
365     HiLink factorStackEffectRequired    Error
366     HiLink factorStackEffectError       Error
367   endif
368
369   HiLink   factorError                  Error
370   HiLink   factorShebang                PreProc
371   HiLink   factorComment                Comment
372   HiLink   factorMultilineComment       Comment
373   HiLink   factorTodo                   Todo
374   HiLink   factorStackEffect            Type
375   HiLink   factorStackEffectDelims      Delimiter
376   HiLink   factorStackEffectVar         Identifier
377   HiLink   factorStackEffectRowVar      factorStackEffectVar
378   HiLink   factorStackEffectType        Type
379   HiLink   factorInclude                Include
380   HiLink   factorWord                   Keyword
381   HiLink   factorCall                   Keyword
382   HiLink   factorCallDelims             Keyword
383   HiLink   factorCallNextMethod         Keyword
384   HiLink   factorOperator               Operator
385   HiLink   factorFrySpecifier           Operator
386   HiLink   factorBoolean                Boolean
387   HiLink   factorBreakpoint             Debug
388   HiLink   factorDefn                   Typedef
389   HiLink   factorDefnDelims             Typedef
390   HiLink   factorMethod                 Typedef
391   HiLink   factorMethodDelims           Typedef
392   HiLink   factorLocalsMethodDelims     Typedef
393   HiLink   factorGeneric                Typedef
394   HiLink   factorGenericN               Typedef
395   HiLink   factorConstructor            Typedef
396   HiLink   factorConstructor2           Typedef
397   HiLink   factorPrivate                Special
398   HiLink   factorPDefnDelims            Special
399   HiLink   factorPMethodDelims          Special
400   HiLink   factorPLocalsMethodDelims    Special
401   HiLink   factorPGeneric               Special
402   HiLink   factorPGenericN              Special
403   HiLink   factorPHook                  Special
404   HiLink   factorEscape                 SpecialChar
405   HiLink   factorString                 String
406   HiLink   factorStringDelims           factorString
407   HiLink   factorNamedString            String
408   HiLink   factorNamedStringDelims      Typedef
409   HiLink   factorComplex                Number
410   HiLink   factorRatio                  Number
411   HiLink   factorBin                    Number
412   HiLink   factorHexNoRadix             Number
413   HiLink   factorHex                    Number
414   HiLink   factorNan                    Number
415   HiLink   factorOct                    Number
416   HiLink   factorFloat                  Float
417   HiLink   factorInteger                Number
418   HiLink   factorUsing                  Include
419   HiLink   factorQualified              Include
420   HiLink   factorQualifiedWith          Include
421   HiLink   factorExclude                Include
422   HiLink   factorFrom                   Include
423   HiLink   factorRename                 Include
424   HiLink   factorUse                    Include
425   HiLink   factorUnuse                  Include
426   HiLink   factorIn                     Define
427   HiLink   factorChar                   Character
428   HiLink   factorColor                  Constant
429   HiLink   factorDelimiter              Delimiter
430   HiLink   factorBackslash              Special
431   HiLink   factorMBackslash             Special
432   HiLink   factorLiteral                Special
433   HiLink   factorDeclaration            Typedef
434   HiLink   factorSymbol                 Define
435   HiLink   factorSymbols                Define
436   HiLink   factorConstant               Define
437   HiLink   factorAlias                  Define
438   HiLink   factorSingleton              Typedef
439   HiLink   factorSingletons             Typedef
440   HiLink   factorMixin                  Typedef
441   HiLink   factorInstance               Typedef
442   HiLink   factorHook                   Typedef
443   HiLink   factorMain                   Define
444   HiLink   factorPostpone               Define
445   HiLink   factorDefer                  Define
446   HiLink   factorForget                 Define
447   HiLink   factorAlien                  Define
448   HiLink   factorSlot                   Define
449   HiLink   factorIntersection           Typedef
450   HiLink   factorRegexp                 Constant
451   HiLink   factorSlot                   Typedef
452   HiLink   factorSlotDelims             factorSlot
453   HiLink   factorSlotName               Identifier
454   HiLink   factorSlotClass              Type
455   HiLink   factorSlotType               factorSlotClass
456   HiLink   factorSlotAttr               Special
457   HiLink   factorSlotAttrInitial        factorSlotAttr
458   HiLink   factorSlotAttrReadOnly       factorSlotAttr
459   HiLink   factorStructSlotAttr         factorSlotAttr
460   HiLink   factorStructSlotAttrBits     factorStructSlotAttr
461   HiLink   factorPredicate              Typedef
462   HiLink   factorPredicateDelims        factorTuple
463   HiLink   factorTuple                  Typedef
464   HiLink   factorTupleDelims            factorTuple
465   HiLink   factorTupleSlot              factorSlot
466   HiLink   factorTupleClass             Identifier
467   HiLink   factorTupleSlotDelims        factorSlotDelims
468   HiLink   factorTupleSlotName          factorSlotName
469   HiLink   factorTupleSlotClass         factorSlotClass
470   HiLink   factorUnion                  Typedef
471   HiLink   factorStruct                 Typedef
472   HiLink   factorStructDelims           factorStruct
473   HiLink   factorStructSlot             factorSlot
474   HiLink   factorStructSlotDelims       factorSlotDelims
475   HiLink   factorStructSlotName         factorSlotName
476   HiLink   factorStructSlotType         factorSlotType
477
478   if &bg == 'dark'
479     hi   hlLevel0 ctermfg=red           guifg=red1
480     hi   hlLevel1 ctermfg=yellow        guifg=orange1
481     hi   hlLevel2 ctermfg=green         guifg=yellow1
482     hi   hlLevel3 ctermfg=cyan          guifg=greenyellow
483     hi   hlLevel4 ctermfg=magenta       guifg=green1
484     hi   hlLevel5 ctermfg=red           guifg=springgreen1
485     hi   hlLevel6 ctermfg=yellow        guifg=cyan1
486     hi   hlLevel7 ctermfg=green         guifg=slateblue1
487     hi   hlLevel8 ctermfg=cyan          guifg=magenta1
488     hi   hlLevel9 ctermfg=magenta       guifg=purple1
489   else
490     hi   hlLevel0 ctermfg=red           guifg=red3
491     hi   hlLevel1 ctermfg=darkyellow    guifg=orangered3
492     hi   hlLevel2 ctermfg=darkgreen     guifg=orange2
493     hi   hlLevel3 ctermfg=blue          guifg=yellow3
494     hi   hlLevel4 ctermfg=darkmagenta   guifg=olivedrab4
495     hi   hlLevel5 ctermfg=red           guifg=green4
496     hi   hlLevel6 ctermfg=darkyellow    guifg=paleturquoise3
497     hi   hlLevel7 ctermfg=darkgreen     guifg=deepskyblue4
498     hi   hlLevel8 ctermfg=blue          guifg=darkslateblue
499     hi   hlLevel9 ctermfg=darkmagenta   guifg=darkviolet
500   endif
501 endif
502 delcommand HiLink
503
504 let b:current_syntax = 'factor'
505
506 " vim: set ft=vim et sw=2 isk+=/,\\ :