3 " Maintainer: Alex Chapman <chapman.alex@gmail.com>
4 " Last Change: 2020 Sep 30
7 " Factor |syntax| file guide & conventions:
9 " Inside |:comment|s, words in |bars| contain |:help| keywords.
12 " Alignment columns should normally occur on multiples of 4.
13 " Align Vim syntax alternatives naturally. E.g.:
17 " Align |:syn-start|, |:syn-skip|, and |:syn-end| on their patterns.
18 " ":echo (col('.') - 1) % 4" is handy here.
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 incompatibile Vim arises would be trivial,
24 " and Factor likes these characters.)
26 " Syntax groups ending in "Error" match errors via |:syn-priority|,
27 " and should normally |:hi-link| to "Error".
29 " Syntax groups named "{group-name}Trans" are |:syn-transparent|.
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".
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}".
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.
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<...>":
50 " "trans": transparent syntax group (if not applicable, same as "hi")
51 " "lo": highlight group
53 if exists('b:current_syntax')
57 " Factor is case sensitive.
60 syn match factorWord /\v<\S+>/ contains=@factorWord transparent display
61 syn cluster factorClusterNoComment contains=factorWord,@factorMultilineComment,@factorClusterValue,factorBoolean,factorBreakpoint,factorDeclaration,factorCallQuotation,factorExecute,factorCallNextMethod,@factorWordOps,factorAlien,factorSlot,factorTuple,factorErrorSyn,factorStruct
62 syn cluster factorCluster contains=@factorComment,@factorClusterNoComment
64 " A crash course on Factor's lexer:
66 " The "lexer" vocabulary parses lines (arrays of strings) into tokens.
67 " Tokens are non-space strings, effectively words.
68 " "[ f skip ] call( i seq -- n )" finds the next space, erroring on tabs.
69 " "t skip" finds the next non-space.
70 " The "lexer" class holds lex state.
71 " Lexer method "skip-word" advances to the next space (via "f skip"),
72 " while also counting leading double quotation marks as their own words.
73 " I.e., this advances to the end of the current token
74 " (if currently at a token, otherwise nothing changes).
75 " Method "skip-blank" advances to the next non-space (via "t skip"),
76 " while also skipping shebangs at the beginning of the first line.
77 " I.e., this advances to the start of the next token
78 " (if one is present, otherwise it advances to the line's end).
79 " "(parse-raw)" advances a lexer through an immediate token via "skip-word",
80 " and returns the (sub)token advanced through.
81 " Note that this will not advance a lexer at space,
82 " and an empty string will be returned.
83 " "next-line" advances a lexer to the start of the next line,
84 " adding an effectively empty line to the end (as an EOF state).
85 " "parse-raw" advances a lexer through the next token,
86 " first via alternating "skip-blank" & "next-line" if the line ended,
87 " then via "(parse-raw)",
88 " and returns it if found, otherwise (i.e. upon EOF) returning "f".
89 " Note that the lexer will be advanced to EOF if "f" is returned.
90 " Comments are (unprocessed) remainders of lines, after a "!" word.
91 " "parse-token" advances a lexer though the next token via "parse-raw",
92 " then returns it if found, otherwise returning "f".
93 " while also advancing through comments
94 " via mutual recursion with "skip-comment".
95 " "[ skip-comment ] call( lexer str -- str' )" tests if a token is "!",
96 " returning that token if so,
97 " otherwise first advancing a lexer to the next line via "next-line"
98 " (i.e. discarding the rest of the current line)
99 " and then advancing it via "parse-token" & returning that token,
100 " ensuring the return of "parse-token"'s desired non-comment token.
101 " The "lexer" dynamic variable holds the ambient lexer.
102 " "?scan-token" advances the ambient lexer through the next token
104 " and returns it if found, otherwise returning "f".
105 " "scan-token" advances the ambient lexer through the next token
107 " and returns it if found, otherwise throwing an exception.
108 " All other words in the "lexer" vocabulary read via "scan-token", if at all.
109 " So! To know when double quotes & exclamation marks aren't special,
110 " grep for "parse-raw". (Mostly. To be certain, grep for "lexer".)
112 syn cluster factorComment contains=factorComment
113 syn cluster factorCommentContents contains=factorTodo,@Spell
114 syn match factorTodo /\v(TODO|FIXME|XXX):=/ contained
116 syn cluster factorDefnContents contains=@factorCluster
118 syn region factorDefn start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ matchgroup=factorDefnDelims end=/\v<;>/ contains=factorDefnDelims,@factorDefnContents
119 syn region factorDefnDelims start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty contained
120 syn region factorMethod start=/\v<M:>/ matchgroup=factorMethodDelims end=/\v<;>/ contains=factorMethodDelims,@factorDefnContents
121 syn region factorMethodDelims start=/\v<M:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment skipempty keepend contained
122 syn region factorLocalsMethod start=/\v<M::>/ matchgroup=factorLocalsMethodDelims end=/\v<;>/ contains=factorLocalsMethodDelims,@factorDefnContents
123 syn region factorLocalsMethodDelims start=/\v<M::>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend contained
124 syn region factorGeneric start=/\v<%(GENERIC|MATH|PRIMITIVE):>/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty
125 syn region factorGenericN matchgroup=factorGenericN start=/\v<GENERIC\#:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\d+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend
127 syn region factorPDefn start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ matchgroup=factorPDefnDelims end=/\v<;>/ contains=factorPDefnDelims,@factorDefnContents 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,@factorDefnContents 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,@factorDefnContents 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):>/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty contained
134 syn region factorPGenericN matchgroup=factorPGenericN start=/\v<GENERIC\#:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\d+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend contained
136 syn region factorPrivate matchgroup=factorPrivate start=/\v<\<PRIVATE>/ end=/\v<PRIVATE\>>/ contains=@factorDefnContents,factorPDefn,factorPMethod,factorPLocalsMethod,factorPGeneric,factorPGenericN skipempty keepend
138 syn cluster factorClusterValue contains=factorBreakpoint,factorBoolean,factorFrySpecifier,factorChar,@factorString,@factorNumber,factorBackslash,factorMBackslash,factorLiteral,factorLiteralBlock,@factorStackEffect,@factorQuotation,@factorArray
140 syn keyword factorBoolean f t
141 syn keyword factorBreakpoint B
142 syn keyword factorFrySpecifier @ _ contained
143 syn keyword factorDeclaration delimiter deprecated final flushable foldable inline recursive
144 syn match factorCallQuotation /\v<call\V(\v/me=e-1 nextgroup=@factorStackEffect
145 syn match factorExecute /\v<execute\V(\v/me=e-1 nextgroup=@factorStackEffect
146 syn keyword factorCallNextMethod call-next-method
148 syn region factorChar start=/\v<CHAR:>/ end=/\v\S+>/
150 syn cluster factorString contains=factorString,factorTriString,factorPrefixedString
151 syn match factorEscape /\v\\([\\astnrbvf0e\"]|u\x{6}|u\{\S+}|x\x{2})/ contained display
152 syn region factorString matchgroup=factorStringDelims start=/\v<"/ skip=/\v\\"/ end=/\v"/ contains=factorEscape
153 " Removed Factor syntax.
154 syn region factorTriString matchgroup=factorTriStringDelims start=/\v<"""/ skip=/\v\\"/ end=/\v"""/ contains=factorEscape
155 syn region factorPrefixedString matchgroup=factorPrefixedStringDelims start=/\v<[^[:blank:]"]+">/ skip=/\v\\"/ end=/\v"/ contains=factorEscape
157 " Vocabulary: multiline
158 " This vocabulary reads the ambient lexer without "parse-raw".
159 syn cluster factorString add=factorMultilineString,factorHereDocString,factorPrefixedMultilineString
160 syn region factorMultilineString matchgroup=factorMultilineStringDelims start=/\v<\[\z(\={0,6})\[>/ end=/\v\]\z1\]/
161 syn region factorHereDoc matchgroup=factorHereDocDelims start=/\v<STRING:\s+\S+>/ end=/\v^;$/
162 syn region factorHereDocString matchgroup=factorHereDocStringDelims start=/\v<HEREDOC:\s+\z(.*)>/ end=/\v^\z1$/
163 syn region factorPrefixedMultilineString matchgroup=factorPrefixedMultilineStringDelims start=/\v<[^[\][:blank:]]+\[\z(\={0,6})\[>/ end=/\v\]\z1\]/
164 " These comments are normal syntax words, so no lexer privilege for them.
165 " (Hence, no "syn cluster factorComment" membership.)
166 syn cluster factorMultilineComment contains=factorMultilineComment,factorMultilineCComment
167 syn region factorMultilineComment matchgroup=factorMultilineCommentDelims start=/\v<!\[\z(\={0,6})\[>/ end=/\v\]\z1\]/ contains=@factorCommentContents keepend
168 syn region factorMultilineCComment matchgroup=factorMultilineCCommentDelims start=/\v<\/\*>/ end=/\v\*\// contains=@factorCommentContents keepend
170 syn cluster factorReal contains=@factorInteger,@factorFloat,@factorRatio,@factorBin,@factorOct,@factorHex,factorNan
171 syn cluster factorNumber contains=@factorReal,factorComplex
172 syn cluster factorInteger contains=factorInteger
173 if !exists('g:factor_syn_no_error') " more general
174 syn cluster factorInteger add=factorIntegerError
175 " + "\d|," with contained "\d"
176 syn match factorIntegerError /\v<[+-]=%(\d|,){-}\d%(\d|,)*>/
178 " + "\d|," with leading "\d" and no trailing ","
179 syn match factorInteger /\v<[+-]=\d%(\d|,)*,@1<!>/
180 if !exists('g:factor_syn_no_error') " more general
181 syn cluster factorFloat add=factorFloatError
182 syn match factorFloatError /\v<[+-]=%(\S{-}\d&%(\d|,)*%([eE][+-]=%(\d|,)*|\.%(\d|,)*%([eE][+-]=%(\d|,)*)?)|\.%(\d|,)+%([eE][+-]=%(\d|,)*)?)>/
184 syn cluster factorFloat contains=factorFloat
185 " exponent is followed by valid integer of radix 10
189 " or {"." mantissa sep, ? "[eE]" exponent}}
190 " or {"." mantissa sep, ? "[eE]" exponent}
191 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<!)?)>/
192 syn cluster factorRatio contains=factorRatio
193 if !exists('g:factor_syn_no_error') " more general
194 syn cluster factorRatio add=factorRatioError
195 syn match factorRatioError /\v<[+-]=%(\S{-}\d.{-}\/&%(\d|,)*\.?%(\d|,)*%([+-]%(\d|,)*)?)\/[+-]=%(\S{-}\d&%(\d|,)*\.?%(\d|,)*%([eE][+-]=%(\d|,)*)?)>/
197 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<!>/
198 syn region factorComplex start=/\v<C\{>/ end=/\v<\}>/ contains=@factorReal
199 syn cluster factorBin contains=factorBin
200 if !exists('g:factor_syn_no_error')
201 syn cluster factorBin add=factorBinError
202 syn match factorBinError /\v<[+-]=0[bB]%(\S{-}\w&%(\w|,)*\.?%(\w|,)*%([pP][+-]=%(\w|,)*)?)>/
204 " basically a float, but with a radix and no integer case to not match
205 syn match factorBin /\v<[+-]=0[bB]%([01][01,]*,@1<!%(\.%([01][01,]*,@1<!)?)?|\.[01][01,]*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/
206 syn cluster factorOct contains=factorOct
207 if !exists('g:factor_syn_no_error')
208 syn cluster factorOct add=factorOctError
209 syn match factorOctError /\v<[+-]=0[oO]%(\S{-}\o&%(\w|,)*\.?(\w|,)*%([pP][+-]=%(\w|,)*)?)>/
211 syn match factorOct /\v<[+-]=0[oO]%(\o%(\o|,)*,@1<!%(\.%(\o%(\o|,)*,@1<!)?)?|\.\o%(\o|,)*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/
212 syn cluster factorHexNoRadix contains=factorHexNoRadix
213 syn cluster factorHex contains=factorHex
214 if !exists('g:factor_syn_no_error')
215 syn cluster factorHexNoRadix add=factorHexNoRadixError
216 syn cluster factorHex add=factorHexError
217 syn match factorHexNoRadixError /\v<[+-]=%(\S{-}\x&%(\w|,)*\.?(\w|,)*%([pP][+-]=%(\w|,)*)?)>/ contained
218 syn match factorHexError /\v<[+-]=0[xX]%(\S{-}\x&%(\x|,)*\.?(\x|,)*%([pP][+-]=%(\w|,)*)?)>/
220 syn match factorHexNoRadix /\v<[+-]=%(\x%(\x|,)*,@1<!%(\.%(\x%(\x|,)*,@1<!)?)?|\.\x%(\x|,)*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/ contained
221 syn match factorHex /\v<[+-]=0[xX]%(\x%(\x|,)*,@1<!%(\.%(\x%(\x|,)*,@1<!)?)?|\.\x%(\x|,)*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/
222 syn region factorNan matchgroup=factorNan start=/\v<NAN:>/ matchgroup=NONE skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment,@factorHexNoRadix keepend
224 syn region factorBackslash start=/\v<\\>/ end=/\v<\S+>/ contains=@factorComment
225 syn region factorMBackslash start=/\v<M\\>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
226 syn region factorLiteral start=/\v<\$>/ end=/\v<\S+>/ contains=@factorComment
227 syn region factorLiteralBlock start=/\v<\$\[>/ end=/\v<\]>/ contains=@factorComment
229 syn region factorIn start=/\v<IN:>/ end=/\v<\S+>/ contains=@factorComment
230 syn region factorUse start=/\v<USE:>/ end=/\v<\S+>/ contains=@factorComment
231 syn region factorUnuse start=/\v<UNUSE:>/ end=/\v<\S+>/ contains=@factorComment
233 syn region factorUsing start=/\v<USING:>/ end=/\v<;>/ contains=@factorComment
234 syn region factorQualified start=/\v<QUALIFIED:>/ end=/\v<\S+>/ contains=@factorComment
235 syn region factorQualifiedWith start=/\v<QUALIFIED-WITH:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
236 syn region factorExclude start=/\v<EXCLUDE:>/ end=/\v<;>/ contains=@factorComment
237 syn region factorFrom start=/\v<FROM:>/ end=/\v<;>/ contains=@factorComment
238 syn region factorRename start=/\v<RENAME:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+%(\_\s+%(!>.*)?)+\=\>%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
239 syn region factorSingletons start=/\v<SINGLETONS:>/ end=/\v<;>/ contains=@factorComment
240 syn region factorSymbol start=/\v<SYMBOL:>/ end=/\v<\S+>/ contains=@factorComment
241 syn region factorSymbols start=/\v<SYMBOLS:>/ end=/\v<;>/ contains=@factorComment
242 syn region factorConstructor2 start=/\v<CONSTRUCTOR:>/ end=/\v<;>/ contains=@factorComment,factorStackEffect
243 syn region factorIntersection start=/\v<INTERSECTION:>/ end=/\v<;>/ contains=@factorComment
244 syn cluster factorSlotAttr contains=factorSlotAttrInitial,factorSlotAttrReadOnly
245 syn cluster factorTupleSlotAttr contains=@factorSlotAttr
246 syn match factorTupleSlotName /\v<\S+;@1<!>/ nextgroup=factorTupleSlotClassSkip skipempty contained
247 syn match factorTupleSlotNameSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorTupleSlotName transparent contained
248 syn match factorTupleSlotClass /\v<\S+>/ nextgroup=factorTupleSlotAttrSkip skipempty contained
249 " a class is optional, so let an attribute take priority if present
250 syn match factorTupleSlotClassSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorTupleSlotClass,@factorTupleSlotAttr transparent contained
251 syn region factorTupleSlot matchgroup=factorTupleSlotDelims start=/\v<\{>/ end=/\v<\}>/ contains=@factorComment,factorTupleSlotName,@factorTupleSlotAttr contained
252 syn match factorTupleHeader /\v%(\_\s+%(!>.*)?)*\S+%(%(\_\s+%(!>.*)?)+\<%(\_\s+%(!>.*)?)+\S+)?>/ contains=@factorComment,@factorWord contained transparent
253 syn match factorTupleDelims /\v<%(TUPLE|BUILTIN):>/ nextgroup=factorTupleHeader skipempty contained
254 syn region factorTuple start=/\v<%(TUPLE|BUILTIN):>/ end=/\v<;>/ contains=@factorComment,factorTupleSlotName,factorTupleSlot,factorTupleDelims
255 syn region factorPredicate matchgroup=factorPredicateDelims start=/\v<%(PREDICATE):>/ end=/\v<;>/ contains=@factorComment,factorTupleSlotName
256 " Abnormally named because factor*Error is reserved for syntax errors.
257 syn region factorErrorSyn start=/\v<ERROR:>/ end=/\v<;>/ contains=@factorComment
258 syn region factorUnion start=/\v<UNION:>/ end=/\v<;>/ contains=@factorComment
259 syn cluster factorStructSlotAttr contains=@factorSlotAttr,factorStructSlotAttrBits
260 syn match factorStructSlotName /\v<\S+>/ nextgroup=factorStructSlotTypeSkip skipempty contained
261 syn match factorStructSlotNameSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorStructSlotName contained transparent
262 syn match factorStructSlotType /\v<\S+>/ contained
263 syn match factorStructSlotTypeSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorStructSlotType contained transparent
264 syn region factorStructSlot matchgroup=factorStructSlotDelims start=/\v<\{>/ end=/\v<\}>/ contains=@factorComment,factorStructSlotName,@factorStructSlotAttr contained
265 syn region factorStruct matchgroup=factorStructDelims start=/\v<%(UNION-STRUCT|STRUCT):>/ end=/\v<;>/ contains=@factorComment,factorStructSlot
267 syn match factorSlotAttrReadOnly /\v<read-only>/ contained
268 syn match factorSlotAttrInitial /\v<initial:>%(\_\s+%(!>.*)?)+/ contains=@factorComment nextgroup=factorWord,@factorClusterValue contained
269 syn match factorStructSlotAttrBits /\v<bits:>%(\_\s+%(!>.*)?)+/ contains=@factorComment nextgroup=factorWord,@factorReal contained
271 syn region factorConstant start=/\v<CONSTANT:>/ end=/\v<\S+>/ contains=@factorComment
272 syn region factorAlias start=/\v<ALIAS:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
273 syn region factorSingleton start=/\v<SINGLETON:>/ end=/\v<\S+>/ contains=@factorComment
274 syn region factorPostpone start=/\v<POSTPONE:>/ end=/\v<\S+>/ contains=@factorComment
275 syn region factorDefer start=/\v<DEFER:>/ end=/\v<\S+>/ contains=@factorComment
276 syn region factorForget start=/\v<FORGET:>/ end=/\v<\S+>/ contains=@factorComment
277 syn region factorMixin start=/\v<MIXIN:>/ end=/\v<\S+>/ contains=@factorComment
278 syn region factorInstance start=/\v<INSTANCE:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
279 syn region factorHook start=/\v<HOOK:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend
280 syn region factorMain start=/\v<MAIN:>/ end=/\v<\S+>/ contains=@factorComment
281 syn region factorConstructor start=/\v<C:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
282 syn region factorAlien matchgroup=factorAlien start=/\v<ALIEN:>/ matchgroup=NONE end=/\v<\S+>/ contains=@factorComment,@factorHexNoRadix
283 syn region factorSlot start=/\v<SLOT:>/ end=/\v<\S+>/ contains=@factorComment
285 syn cluster factorWordOps contains=factorConstant,factorAlias,factorSingleton,factorSingletons,factorSymbol,factorSymbols,factorPostpone,factorDefer,factorForget,factorMixin,factorInstance,factorHook,factorMain,factorConstructor
301 if !exists('g:factor_syn_no_error')
302 syn match factorStackEffectRequired /\v<\V(\@!\v\S+>/ contained
304 syn cluster factorStackEffectContents contains=@factorComment,factorStackEffectDelims,factorStackEffectVar,factorStackEffectType,factorStackEffectRowVar
305 syn cluster factorStackEffect contains=factorStackEffect
306 " Erroring on stack effects without a "--" separator would be nice.
307 " Unfortunately, that sort of vacuous detection is above Vim's pay-grade,
308 " especially when stack effects can be nested arbitrarily via types.
309 syn match factorStackEffectSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorStackEffectRequired,@factorStackEffect transparent contained
310 syn region factorStackEffect matchgroup=factorStackEffectDelims start=/\v\V(\v>/ end=/\v<\V)\v>/ contains=@factorStackEffectContents
311 syn match factorStackEffectVar /\v<\S+>/ contained
312 " Note that ":!" parses to the "!" word and doesn't lex as a comment.
313 " Also, even though we take any value, the leading ":" breaking the word
314 " boundary means a lot of our nicer syntax patterns don't match on
315 " "factorStackEffectType".
316 " syn cluster factorStackEffectType contains=factorWord,@factorStackEffect
317 syn cluster factorStackEffectType contains=factorWord,@factorClusterValue
318 syn match factorStackEffectTypeSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=@factorStackEffectType transparent contained
319 syn match factorStackEffectVar /\v<\S+:>/ nextgroup=factorStackEffectTypeSkip skipempty contained
320 syn match factorStackEffectType /\v<:/ nextgroup=@factorStackEffectType contained
321 syn match factorStackEffectRowVar /\v<\.\.\S+>/ contained
322 syn match factorStackEffectRowVar /\v<\.\.\S+:>/ nextgroup=factorStackEffectTypeSkip skipempty contained
323 syn match factorStackEffectDelims /\v<-->/ contained
324 if !exists('g:factor_syn_no_error')
325 syn cluster factorStackEffectContents add=factorStackEffectError
326 syn keyword factorStackEffectError ( contained
329 " adapted from lisp.vim
330 if exists('g:factor_syn_no_rainbow')
331 syn cluster factorQuotation contains=factorQuotation
332 syn region factorQuotation matchgroup=factorDelimiter start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=ALL
334 syn cluster factorQuotation contains=factorQuotation0
335 syn region factorQuotation0 matchgroup=hlLevel0 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation1,factorArray1
336 syn region factorQuotation1 contained matchgroup=hlLevel1 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation2,factorArray2
337 syn region factorQuotation2 contained matchgroup=hlLevel2 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation3,factorArray3
338 syn region factorQuotation3 contained matchgroup=hlLevel3 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation4,factorArray4
339 syn region factorQuotation4 contained matchgroup=hlLevel4 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation5,factorArray5
340 syn region factorQuotation5 contained matchgroup=hlLevel5 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation6,factorArray6
341 syn region factorQuotation6 contained matchgroup=hlLevel6 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation7,factorArray7
342 syn region factorQuotation7 contained matchgroup=hlLevel7 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation8,factorArray8
343 syn region factorQuotation8 contained matchgroup=hlLevel8 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation9,factorArray9
344 syn region factorQuotation9 contained matchgroup=hlLevel9 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation0,factorArray0
347 if exists('g:factor_syn_no_rainbow')
348 syn cluster factorArray contains=factorArray
349 syn region factorArray matchgroup=factorDelimiter start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=ALL
351 syn cluster factorArray contains=factorArray0
352 syn region factorArray0 matchgroup=hlLevel0 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray1,factorQuotation1
353 syn region factorArray1 contained matchgroup=hlLevel1 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray2,factorQuotation2
354 syn region factorArray2 contained matchgroup=hlLevel2 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray3,factorQuotation3
355 syn region factorArray3 contained matchgroup=hlLevel3 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray4,factorQuotation4
356 syn region factorArray4 contained matchgroup=hlLevel4 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray5,factorQuotation5
357 syn region factorArray5 contained matchgroup=hlLevel5 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray6,factorQuotation6
358 syn region factorArray6 contained matchgroup=hlLevel6 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray7,factorQuotation7
359 syn region factorArray7 contained matchgroup=hlLevel7 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray8,factorQuotation8
360 syn region factorArray8 contained matchgroup=hlLevel8 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray9,factorQuotation9
361 syn region factorArray9 contained matchgroup=hlLevel9 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray0,factorQuotation0
364 if !exists('g:factor_syn_no_error')
365 syn match factorBracketError /\v<\]>/
366 syn match factorBracketError /\v<\}>/
369 function! FactorSynDefineComment() abort
370 syn match factorComment /\v<!>.*$/ contains=@factorCommentContents
371 syn match factorShebang /\v%^\#!.*$/ display
372 if !exists('g:factor_syn_no_error')
373 syn match factorShebangError /\v%^\#!\S+/
377 if !exists('g:factor_syn_no_comment')
378 call FactorSynDefineComment()
381 " Syntax that bypasses comment lexing.
382 function! FactorSynDefineAfterComment() abort
385 if !exists('g:factor_syn_no_after_comment')
386 call FactorSynDefineAfterComment()
391 if !exists('g:factor_syn_no_init')
392 command -nargs=+ -bar HiLink hi def link <args>
394 if !exists('g:factor_syn_no_error')
395 HiLink factorShebangError Error
396 HiLink factorBracketError Error
397 HiLink factorIntegerError Error
398 HiLink factorFloatError Error
399 HiLink factorRatioError Error
400 HiLink factorBinError Error
401 HiLink factorHexNoRadixError Error
402 HiLink factorHexError Error
403 HiLink factorOctError Error
404 HiLink factorStackEffectRequired Error
405 HiLink factorStackEffectError Error
408 HiLink factorComment Comment
409 HiLink factorMultilineComment factorComment
410 HiLink factorMultilineCommentDelims factorMultilineComment
411 HiLink factorMultilineCComment factorComment
412 HiLink factorMultilineCCommentDelims factorMultilineCComment
413 HiLink factorShebang PreProc
414 HiLink factorStackEffect Type
415 HiLink factorStackEffectDelims Delimiter
416 HiLink factorStackEffectVar Identifier
417 HiLink factorStackEffectRowVar factorStackEffectVar
418 HiLink factorStackEffectType Type
419 HiLink factorTodo Todo
420 HiLink factorInclude Include
421 HiLink factorWord Keyword
422 HiLink factorCallQuotation Keyword
423 HiLink factorExecute Keyword
424 HiLink factorCallNextMethod Keyword
425 HiLink factorOperator Operator
426 HiLink factorFrySpecifier Operator
427 HiLink factorBoolean Boolean
428 HiLink factorBreakpoint Debug
429 HiLink factorDefnDelims Typedef
430 HiLink factorMethodDelims Typedef
431 HiLink factorLocalsMethodDelims Typedef
432 HiLink factorGeneric Typedef
433 HiLink factorGenericN Typedef
434 HiLink factorConstructor Typedef
435 HiLink factorConstructor2 Typedef
436 HiLink factorPrivate Special
437 HiLink factorPDefnDelims Special
438 HiLink factorPMethodDelims Special
439 HiLink factorPLocalsMethodDelims Special
440 HiLink factorPGeneric Special
441 HiLink factorPGenericN Special
442 HiLink factorEscape SpecialChar
443 HiLink factorString String
444 HiLink factorStringDelims factorString
445 HiLink factorTriString factorString
446 HiLink factorTriStringDelims factorTriString
447 HiLink factorPrefixedString factorString
448 HiLink factorPrefixedStringDelims factorPrefixedString
449 HiLink factorMultilineString factorString
450 HiLink factorMultilineStringDelims Typedef
451 HiLink factorHereDoc factorMultilineString
452 HiLink factorHereDocDelims factorMultilineStringDelims
453 HiLink factorHereDocString factorMultilineString
454 HiLink factorHereDocStringDelims factorMultilineStringDelims
455 HiLink factorPrefixedMultilineString factorString
456 HiLink factorPrefixedMultilineStringDelims factorMultilineStringDelims
457 HiLink factorComplex Number
458 HiLink factorRatio Number
459 HiLink factorBin Number
460 HiLink factorHexNoRadix Number
461 HiLink factorHex Number
462 HiLink factorNan Number
463 HiLink factorOct Number
464 HiLink factorFloat Float
465 HiLink factorInteger Number
466 HiLink factorUsing Include
467 HiLink factorQualified Include
468 HiLink factorQualifiedWith Include
469 HiLink factorExclude Include
470 HiLink factorFrom Include
471 HiLink factorRename Include
472 HiLink factorUse Include
473 HiLink factorUnuse Include
474 HiLink factorIn Define
475 HiLink factorChar Character
476 HiLink factorDelimiter Delimiter
477 HiLink factorBackslash Special
478 HiLink factorMBackslash Special
479 HiLink factorLiteral Special
480 HiLink factorLiteralBlock Special
481 HiLink factorDeclaration Typedef
482 HiLink factorSymbol Define
483 HiLink factorSymbols Define
484 HiLink factorConstant Define
485 HiLink factorAlias Define
486 HiLink factorSingleton Typedef
487 HiLink factorSingletons Typedef
488 HiLink factorMixin Typedef
489 HiLink factorInstance Typedef
490 HiLink factorHook Typedef
491 HiLink factorMain Define
492 HiLink factorPostpone Define
493 HiLink factorDefer Define
494 HiLink factorForget Define
495 HiLink factorAlien Define
496 HiLink factorSlot Define
497 HiLink factorIntersection Typedef
498 HiLink factorSlot Typedef
499 HiLink factorSlotDelims factorSlot
500 HiLink factorSlotName Identifier
501 HiLink factorSlotClass Type
502 HiLink factorSlotType factorSlotClass
503 HiLink factorSlotAttr Special
504 HiLink factorSlotAttrInitial factorSlotAttr
505 HiLink factorSlotAttrReadOnly factorSlotAttr
506 HiLink factorStructSlotAttr factorSlotAttr
507 HiLink factorStructSlotAttrBits factorStructSlotAttr
508 HiLink factorPredicate Typedef
509 HiLink factorPredicateDelims factorTuple
510 HiLink factorTuple Typedef
511 HiLink factorTupleDelims factorTuple
512 HiLink factorTupleSlot factorSlot
513 HiLink factorTupleSlotDelims factorSlotDelims
514 HiLink factorTupleSlotName factorSlotName
515 HiLink factorTupleSlotClass factorSlotClass
516 HiLink factorErrorSyn Typedef
517 HiLink factorUnion Typedef
518 HiLink factorStruct Typedef
519 HiLink factorStructDelims factorStruct
520 HiLink factorStructSlot factorSlot
521 HiLink factorStructSlotDelims factorSlotDelims
522 HiLink factorStructSlotName factorSlotName
523 HiLink factorStructSlotType factorSlotType
526 hi hlLevel0 ctermfg=red guifg=red1
527 hi hlLevel1 ctermfg=yellow guifg=orange1
528 hi hlLevel2 ctermfg=green guifg=yellow1
529 hi hlLevel3 ctermfg=cyan guifg=greenyellow
530 hi hlLevel4 ctermfg=magenta guifg=green1
531 hi hlLevel5 ctermfg=red guifg=springgreen1
532 hi hlLevel6 ctermfg=yellow guifg=cyan1
533 hi hlLevel7 ctermfg=green guifg=slateblue1
534 hi hlLevel8 ctermfg=cyan guifg=magenta1
535 hi hlLevel9 ctermfg=magenta guifg=purple1
537 hi hlLevel0 ctermfg=red guifg=red3
538 hi hlLevel1 ctermfg=darkyellow guifg=orangered3
539 hi hlLevel2 ctermfg=darkgreen guifg=orange2
540 hi hlLevel3 ctermfg=blue guifg=yellow3
541 hi hlLevel4 ctermfg=darkmagenta guifg=olivedrab4
542 hi hlLevel5 ctermfg=red guifg=green4
543 hi hlLevel6 ctermfg=darkyellow guifg=paleturquoise3
544 hi hlLevel7 ctermfg=darkgreen guifg=deepskyblue4
545 hi hlLevel8 ctermfg=blue guifg=darkslateblue
546 hi hlLevel9 ctermfg=darkmagenta guifg=darkviolet
551 let b:current_syntax = 'factor'
553 " vim: set ft=vim et sw=2 isk+=/,\\ :