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 " 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
102 " and returns it if found, otherwise returning "f".
103 " "scan-token" advances the ambient lexer through the next 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".)
110 syn cluster factorComment contains=factorComment
111 syn cluster factorCommentContents contains=factorTodo,@Spell
112 syn match factorTodo /\v(TODO|FIXME|XXX):=/ contained
114 syn cluster factorDefnContents contains=@factorCluster
116 syn region factorDefn start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ matchgroup=factorDefnDelims end=/\v<;>/ contains=factorDefnDelims,@factorDefnContents
117 syn region factorDefnDelims start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty contained
118 syn region factorMethod start=/\v<M:>/ matchgroup=factorMethodDelims end=/\v<;>/ contains=factorMethodDelims,@factorDefnContents
119 syn region factorMethodDelims start=/\v<M:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment skipempty keepend contained
120 syn region factorLocalsMethod start=/\v<M::>/ matchgroup=factorLocalsMethodDelims end=/\v<;>/ contains=factorLocalsMethodDelims,@factorDefnContents
121 syn region factorLocalsMethodDelims start=/\v<M::>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend contained
122 syn region factorGeneric start=/\v<%(GENERIC|MATH|PRIMITIVE):>/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty
123 syn region factorGenericN matchgroup=factorGenericN start=/\v<GENERIC\#:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\d+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend
125 syn region factorPDefn start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ matchgroup=factorPDefnDelims end=/\v<;>/ contains=factorPDefnDelims,@factorDefnContents contained
126 syn region factorPDefnDelims start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty contained
127 syn region factorPMethod start=/\v<M:>/ matchgroup=factorPMethodDelims end=/\v<;>/ contains=factorPMethodDelims,@factorDefnContents contained
128 syn region factorPMethodDelims start=/\v<M:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment skipempty keepend contained
129 syn region factorPLocalsMethod start=/\v<M::>/ matchgroup=factorPLocalsMethodDelims end=/\v<;>/ contains=factorPLocalsMethodDelims,@factorDefnContents contained
130 syn region factorPLocalsMethodDelims start=/\v<M::>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend contained
131 syn region factorPGeneric start=/\v<%(GENERIC|MATH|PRIMITIVE):>/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty contained
132 syn region factorPGenericN matchgroup=factorPGenericN start=/\v<GENERIC\#:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\d+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend contained
134 syn region factorPrivate matchgroup=factorPrivate start=/\v<\<PRIVATE>/ end=/\v<PRIVATE\>>/ contains=@factorDefnContents,factorPDefn,factorPMethod,factorPLocalsMethod,factorPGeneric,factorPGenericN skipempty keepend
136 syn cluster factorClusterValue contains=factorBreakpoint,factorBoolean,factorFrySpecifier,factorChar,@factorString,@factorNumber,factorBackslash,factorMBackslash,factorLiteral,factorLiteralBlock,@factorStackEffect,@factorQuotation,@factorArray
138 syn keyword factorBoolean f t
139 syn keyword factorBreakpoint B
140 syn keyword factorFrySpecifier @ _ contained
141 syn keyword factorDeclaration delimiter deprecated final flushable foldable inline recursive
142 syn match factorCallQuotation /\v<call\V(\v/me=e-1 nextgroup=@factorStackEffect
143 syn match factorExecute /\v<execute\V(\v/me=e-1 nextgroup=@factorStackEffect
144 syn keyword factorCallNextMethod call-next-method
146 syn region factorChar start=/\v<CHAR:>/ end=/\v\S+>/
148 syn cluster factorString contains=factorString,factorTriString,factorPrefixedString
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 " Removed Factor syntax.
152 syn region factorTriString matchgroup=factorTriStringDelims start=/\v<"""/ skip=/\v\\"/ end=/\v"""/ contains=factorEscape
153 syn region factorPrefixedString matchgroup=factorPrefixedStringDelims start=/\v<[^[:blank:]"]+"/ skip=/\v\\"/ end=/\v"/ contains=factorEscape
155 " Vocabulary: multiline
156 " This vocabulary reads the ambient lexer without "parse-raw".
157 syn cluster factorString add=factorMultilineString,factorHereDocString,factorPrefixedMultilineString
158 syn region factorMultilineString matchgroup=factorMultilineStringDelims start=/\v<\[\z(\={0,6})\[>/ end=/\v\]\z1\]/
159 syn region factorHereDoc matchgroup=factorHereDocDelims start=/\v<STRING:\s+\S+>/ end=/\v^;$/
160 syn region factorHereDocString matchgroup=factorHereDocStringDelims start=/\v<HEREDOC:\s+\z(.*)>/ end=/\v^\z1$/
161 syn region factorPrefixedMultilineString matchgroup=factorPrefixedMultilineStringDelims start=/\v<[^[\][:blank:]]+\[\z(\={0,6})\[>/ end=/\v\]\z1\]/
162 " These comments are normal syntax words, so no lexer privilege for them.
163 " (Hence, no "syn cluster factorComment" membership.)
164 syn cluster factorMultilineComment contains=factorMultilineComment,factorMultilineCComment
165 syn region factorMultilineComment matchgroup=factorMultilineCommentDelims start=/\v<!\[\z(\={0,6})\[>/ end=/\v\]\z1\]/ contains=@factorCommentContents keepend
166 syn region factorMultilineCComment matchgroup=factorMultilineCCommentDelims start=/\v<\/\*>/ end=/\v\*\// contains=@factorCommentContents keepend
168 syn cluster factorReal contains=@factorInteger,@factorFloat,@factorRatio,@factorBin,@factorOct,@factorHex,factorNan
169 syn cluster factorNumber contains=@factorReal,factorComplex
170 syn cluster factorInteger contains=factorInteger
171 if !exists('g:factor_syn_no_error') " more general
172 syn cluster factorInteger add=factorIntegerError
173 " + "\d|," with contained "\d"
174 syn match factorIntegerError /\v<[+-]=%(\d|,){-}\d%(\d|,)*>/
176 " + "\d|," with leading "\d" and no trailing ","
177 syn match factorInteger /\v<[+-]=\d%(\d|,)*,@1<!>/
178 if !exists('g:factor_syn_no_error') " more general
179 syn cluster factorFloat add=factorFloatError
180 syn match factorFloatError /\v<[+-]=%(\S{-}\d&%(\d|,)*%([eE][+-]=%(\d|,)*|\.%(\d|,)*%([eE][+-]=%(\d|,)*)?)|\.%(\d|,)+%([eE][+-]=%(\d|,)*)?)>/
182 syn cluster factorFloat contains=factorFloat
183 " exponent is followed by valid integer of radix 10
187 " or {"." mantissa sep, ? "[eE]" exponent}}
188 " or {"." mantissa sep, ? "[eE]" exponent}
189 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<!)?)>/
190 syn cluster factorRatio contains=factorRatio
191 if !exists('g:factor_syn_no_error') " more general
192 syn cluster factorRatio add=factorRatioError
193 syn match factorRatioError /\v<[+-]=%(\S{-}\d.{-}\/&%(\d|,)*\.?%(\d|,)*%([+-]%(\d|,)*)?)\/[+-]=%(\S{-}\d&%(\d|,)*\.?%(\d|,)*%([eE][+-]=%(\d|,)*)?)>/
195 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<!>/
196 syn region factorComplex start=/\v<C\{>/ end=/\v<\}>/ contains=@factorReal
197 syn cluster factorBin contains=factorBin
198 if !exists('g:factor_syn_no_error')
199 syn cluster factorBin add=factorBinError
200 syn match factorBinError /\v<[+-]=0[bB]%(\S{-}\w&%(\w|,)*\.?%(\w|,)*%([pP][+-]=%(\w|,)*)?)>/
202 " basically a float, but with a radix and no integer case to not match
203 syn match factorBin /\v<[+-]=0[bB]%([01][01,]*,@1<!%(\.%([01][01,]*,@1<!)?)?|\.[01][01,]*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/
204 syn cluster factorOct contains=factorOct
205 if !exists('g:factor_syn_no_error')
206 syn cluster factorOct add=factorOctError
207 syn match factorOctError /\v<[+-]=0[oO]%(\S{-}\o&%(\w|,)*\.?(\w|,)*%([pP][+-]=%(\w|,)*)?)>/
209 syn match factorOct /\v<[+-]=0[oO]%(\o%(\o|,)*,@1<!%(\.%(\o%(\o|,)*,@1<!)?)?|\.\o%(\o|,)*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/
210 syn cluster factorHexNoRadix contains=factorHexNoRadix
211 syn cluster factorHex contains=factorHex
212 if !exists('g:factor_syn_no_error')
213 syn cluster factorHexNoRadix add=factorHexNoRadixError
214 syn cluster factorHex add=factorHexError
215 syn match factorHexNoRadixError /\v<[+-]=%(\S{-}\x&%(\w|,)*\.?(\w|,)*%([pP][+-]=%(\w|,)*)?)>/ contained
216 syn match factorHexError /\v<[+-]=0[xX]%(\S{-}\x&%(\x|,)*\.?(\x|,)*%([pP][+-]=%(\w|,)*)?)>/
218 syn match factorHexNoRadix /\v<[+-]=%(\x%(\x|,)*,@1<!%(\.%(\x%(\x|,)*,@1<!)?)?|\.\x%(\x|,)*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/ contained
219 syn match factorHex /\v<[+-]=0[xX]%(\x%(\x|,)*,@1<!%(\.%(\x%(\x|,)*,@1<!)?)?|\.\x%(\x|,)*,@1<!)%([pP][+-]=\d%(\d|,)*,@1<!)?>/
220 syn region factorNan matchgroup=factorNan start=/\v<NAN:>/ matchgroup=NONE skip=/\v<!>.*/ end=/\v<\S+>/ contains=@factorComment,@factorHexNoRadix keepend
222 syn region factorBackslash start=/\v<\\>/ end=/\v<\S+>/ contains=@factorComment
223 syn region factorMBackslash start=/\v<M\\>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
224 syn region factorLiteral start=/\v<\$>/ end=/\v<\S+>/ contains=@factorComment
225 syn region factorLiteralBlock start=/\v<\$\[>/ end=/\v<\]>/ contains=@factorComment
227 syn region factorIn start=/\v<IN:>/ end=/\v<\S+>/ contains=@factorComment
228 syn region factorUse start=/\v<USE:>/ end=/\v<\S+>/ contains=@factorComment
229 syn region factorUnuse start=/\v<UNUSE:>/ end=/\v<\S+>/ contains=@factorComment
231 syn region factorUsing start=/\v<USING:>/ end=/\v<;>/ contains=@factorComment
232 syn region factorQualified start=/\v<QUALIFIED:>/ end=/\v<\S+>/ contains=@factorComment
233 syn region factorQualifiedWith start=/\v<QUALIFIED-WITH:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
234 syn region factorExclude start=/\v<EXCLUDE:>/ end=/\v<;>/ contains=@factorComment
235 syn region factorFrom start=/\v<FROM:>/ end=/\v<;>/ contains=@factorComment
236 syn region factorRename start=/\v<RENAME:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+%(\_\s+%(!>.*)?)+\=\>%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
237 syn region factorSingletons start=/\v<SINGLETONS:>/ end=/\v<;>/ contains=@factorComment
238 syn region factorSymbol start=/\v<SYMBOL:>/ end=/\v<\S+>/ contains=@factorComment
239 syn region factorSymbols start=/\v<SYMBOLS:>/ end=/\v<;>/ contains=@factorComment
240 syn region factorConstructor2 start=/\v<CONSTRUCTOR:>/ end=/\v<;>/ contains=@factorComment,factorStackEffect
241 syn region factorIntersection start=/\v<INTERSECTION:>/ end=/\v<;>/ contains=@factorComment
242 syn cluster factorSlotAttr contains=factorSlotAttrInitial,factorSlotAttrReadOnly
243 syn cluster factorTupleSlotAttr contains=@factorSlotAttr
244 syn match factorTupleSlotName /\v<\S+;@1<!>/ nextgroup=factorTupleSlotClassSkip skipempty contained
245 syn match factorTupleSlotNameSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorTupleSlotName transparent contained
246 syn match factorTupleSlotClass /\v<\S+>/ nextgroup=factorTupleSlotAttrSkip skipempty contained
247 " a class is optional, so let an attribute take priority if present
248 syn match factorTupleSlotClassSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorTupleSlotClass,@factorTupleSlotAttr transparent contained
249 syn region factorTupleSlot matchgroup=factorTupleSlotDelims start=/\v<\{>/ end=/\v<\}>/ contains=@factorComment,factorTupleSlotName,@factorTupleSlotAttr contained
250 syn match factorTupleHeader /\v%(\_\s+%(!>.*)?)*\S+%(%(\_\s+%(!>.*)?)+\<%(\_\s+%(!>.*)?)+\S+)?>/ contains=@factorComment,@factorWord contained transparent
251 syn match factorTupleDelims /\v<%(TUPLE|BUILTIN):>/ nextgroup=factorTupleHeader skipempty contained
252 syn region factorTuple start=/\v<%(TUPLE|BUILTIN):>/ end=/\v<;>/ contains=@factorComment,factorTupleSlotName,factorTupleSlot,factorTupleDelims
253 syn region factorPredicate matchgroup=factorPredicateDelims start=/\v<%(PREDICATE):>/ end=/\v<;>/ contains=@factorComment,factorTupleSlotName
254 " Abnormally named because factor*Error is reserved for syntax errors.
255 syn region factorErrorSyn start=/\v<ERROR:>/ end=/\v<;>/ contains=@factorComment
256 syn region factorUnion start=/\v<UNION:>/ end=/\v<;>/ contains=@factorComment
257 syn cluster factorStructSlotAttr contains=@factorSlotAttr,factorStructSlotAttrBits
258 syn match factorStructSlotName /\v<\S+>/ nextgroup=factorStructSlotTypeSkip skipempty contained
259 syn match factorStructSlotNameSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorStructSlotName contained transparent
260 syn match factorStructSlotType /\v<\S+>/ contained
261 syn match factorStructSlotTypeSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorStructSlotType contained transparent
262 syn region factorStructSlot matchgroup=factorStructSlotDelims start=/\v<\{>/ end=/\v<\}>/ contains=@factorComment,factorStructSlotName,@factorStructSlotAttr contained
263 syn region factorStruct matchgroup=factorStructDelims start=/\v<%(UNION-STRUCT|STRUCT):>/ end=/\v<;>/ contains=@factorComment,factorStructSlot
265 syn match factorSlotAttrReadOnly /\v<read-only>/ contained
266 syn match factorSlotAttrInitial /\v<initial:>%(\_\s+%(!>.*)?)+/ contains=@factorComment nextgroup=factorWord,@factorClusterValue contained
267 syn match factorStructSlotAttrBits /\v<bits:>%(\_\s+%(!>.*)?)+/ contains=@factorComment nextgroup=factorWord,@factorReal contained
269 syn region factorConstant start=/\v<CONSTANT:>/ end=/\v<\S+>/ contains=@factorComment
270 syn region factorAlias start=/\v<ALIAS:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
271 syn region factorSingleton start=/\v<SINGLETON:>/ end=/\v<\S+>/ contains=@factorComment
272 syn region factorPostpone start=/\v<POSTPONE:>/ end=/\v<\S+>/ contains=@factorComment
273 syn region factorDefer start=/\v<DEFER:>/ end=/\v<\S+>/ contains=@factorComment
274 syn region factorForget start=/\v<FORGET:>/ end=/\v<\S+>/ contains=@factorComment
275 syn region factorMixin start=/\v<MIXIN:>/ end=/\v<\S+>/ contains=@factorComment
276 syn region factorInstance start=/\v<INSTANCE:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
277 syn region factorHook start=/\v<HOOK:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip skipempty keepend
278 syn region factorMain start=/\v<MAIN:>/ end=/\v<\S+>/ contains=@factorComment
279 syn region factorConstructor start=/\v<C:>/ skip=/\v<!>.*/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment keepend
280 syn region factorAlien matchgroup=factorAlien start=/\v<ALIEN:>/ matchgroup=NONE end=/\v<\S+>/ contains=@factorComment,@factorHexNoRadix
281 syn region factorSlot start=/\v<SLOT:>/ end=/\v<\S+>/ contains=@factorComment
283 syn cluster factorWordOps contains=factorConstant,factorAlias,factorSingleton,factorSingletons,factorSymbol,factorSymbols,factorPostpone,factorDefer,factorForget,factorMixin,factorInstance,factorHook,factorMain,factorConstructor
299 if !exists('g:factor_syn_no_error')
300 syn match factorStackEffectRequired /\v<\V(\@!\v\S+>/ contained
302 syn cluster factorStackEffectContents contains=@factorComment,factorStackEffectDelims,factorStackEffectVar,factorStackEffectType,factorStackEffectRowVar
303 syn cluster factorStackEffect contains=factorStackEffect
304 " Erroring on stack effects without a "--" separator would be nice.
305 " Unfortunately, that sort of vacuous detection is above Vim's pay-grade,
306 " especially when stack effects can be nested arbitrarily via types.
307 syn match factorStackEffectSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=factorStackEffectRequired,@factorStackEffect transparent contained
308 syn region factorStackEffect matchgroup=factorStackEffectDelims start=/\v\V(\v>/ end=/\v<\V)\v>/ contains=@factorStackEffectContents
309 syn match factorStackEffectVar /\v<\S+>/ contained
310 " Note that ":!" parses to the "!" word and doesn't lex as a comment.
311 " Also, even though we take any value, the leading ":" breaking the word
312 " boundary means a lot of our nicer syntax patterns don't match on
313 " "factorStackEffectType".
314 " syn cluster factorStackEffectType contains=factorWord,@factorStackEffect
315 syn cluster factorStackEffectType contains=factorWord,@factorClusterValue
316 syn match factorStackEffectTypeSkip /\v%(\_\s+%(!>.*)?)*/ contains=@factorComment nextgroup=@factorStackEffectType transparent contained
317 syn match factorStackEffectVar /\v<\S+:>/ nextgroup=factorStackEffectTypeSkip skipempty contained
318 syn match factorStackEffectType /\v<:/ nextgroup=@factorStackEffectType contained
319 syn match factorStackEffectRowVar /\v<\.\.\S+>/ contained
320 syn match factorStackEffectRowVar /\v<\.\.\S+:>/ nextgroup=factorStackEffectTypeSkip skipempty contained
321 syn match factorStackEffectDelims /\v<-->/ contained
322 if !exists('g:factor_syn_no_error')
323 syn cluster factorStackEffectContents add=factorStackEffectError
324 syn keyword factorStackEffectError ( contained
327 " adapted from lisp.vim
328 if exists('g:factor_syn_no_rainbow')
329 syn cluster factorQuotation contains=factorQuotation
330 syn region factorQuotation matchgroup=factorDelimiter start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=ALL
332 syn cluster factorQuotation contains=factorQuotation0
333 syn region factorQuotation0 matchgroup=hlLevel0 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation1,factorArray1
334 syn region factorQuotation1 contained matchgroup=hlLevel1 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation2,factorArray2
335 syn region factorQuotation2 contained matchgroup=hlLevel2 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation3,factorArray3
336 syn region factorQuotation3 contained matchgroup=hlLevel3 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation4,factorArray4
337 syn region factorQuotation4 contained matchgroup=hlLevel4 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation5,factorArray5
338 syn region factorQuotation5 contained matchgroup=hlLevel5 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation6,factorArray6
339 syn region factorQuotation6 contained matchgroup=hlLevel6 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation7,factorArray7
340 syn region factorQuotation7 contained matchgroup=hlLevel7 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation8,factorArray8
341 syn region factorQuotation8 contained matchgroup=hlLevel8 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation9,factorArray9
342 syn region factorQuotation9 contained matchgroup=hlLevel9 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation0,factorArray0
345 if exists('g:factor_syn_no_rainbow')
346 syn cluster factorArray contains=factorArray
347 syn region factorArray matchgroup=factorDelimiter start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=ALL
349 syn cluster factorArray contains=factorArray0
350 syn region factorArray0 matchgroup=hlLevel0 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray1,factorQuotation1
351 syn region factorArray1 contained matchgroup=hlLevel1 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray2,factorQuotation2
352 syn region factorArray2 contained matchgroup=hlLevel2 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray3,factorQuotation3
353 syn region factorArray3 contained matchgroup=hlLevel3 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray4,factorQuotation4
354 syn region factorArray4 contained matchgroup=hlLevel4 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray5,factorQuotation5
355 syn region factorArray5 contained matchgroup=hlLevel5 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray6,factorQuotation6
356 syn region factorArray6 contained matchgroup=hlLevel6 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray7,factorQuotation7
357 syn region factorArray7 contained matchgroup=hlLevel7 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray8,factorQuotation8
358 syn region factorArray8 contained matchgroup=hlLevel8 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray9,factorQuotation9
359 syn region factorArray9 contained matchgroup=hlLevel9 start=/\v<%(\$|[-[:alnum:]]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray0,factorQuotation0
362 if !exists('g:factor_syn_no_error')
363 syn match factorBracketError /\v<\]>/
364 syn match factorBracketError /\v<\}>/
367 function! FactorSynDefineComment() abort
368 syn match factorComment /\v<!>.*$/ contains=@factorCommentContents
369 syn match factorShebang /\v%^\#!.*$/ display
370 if !exists('g:factor_syn_no_error')
371 syn match factorShebangError /\v%^\#!\S+/
375 if !exists('g:factor_syn_no_comment')
376 call FactorSynDefineComment()
379 " Syntax that bypasses comment lexing.
380 function! FactorSynDefineAfterComment() abort
383 if !exists('g:factor_syn_no_after_comment')
384 call FactorSynDefineAfterComment()
389 if !exists('g:factor_syn_no_init')
390 command -nargs=+ -bar HiLink hi def link <args>
392 if !exists('g:factor_syn_no_error')
393 HiLink factorShebangError Error
394 HiLink factorBracketError Error
395 HiLink factorIntegerError Error
396 HiLink factorFloatError Error
397 HiLink factorRatioError Error
398 HiLink factorBinError Error
399 HiLink factorHexNoRadixError Error
400 HiLink factorHexError Error
401 HiLink factorOctError Error
402 HiLink factorStackEffectRequired Error
403 HiLink factorStackEffectError Error
406 HiLink factorComment Comment
407 HiLink factorMultilineComment factorComment
408 HiLink factorMultilineCommentDelims factorMultilineComment
409 HiLink factorMultilineCComment factorComment
410 HiLink factorMultilineCCommentDelims factorMultilineCComment
411 HiLink factorShebang PreProc
412 HiLink factorStackEffect Type
413 HiLink factorStackEffectDelims Delimiter
414 HiLink factorStackEffectVar Identifier
415 HiLink factorStackEffectRowVar factorStackEffectVar
416 HiLink factorStackEffectType Type
417 HiLink factorTodo Todo
418 HiLink factorInclude Include
419 HiLink factorWord Keyword
420 HiLink factorCallQuotation Keyword
421 HiLink factorExecute Keyword
422 HiLink factorCallNextMethod Keyword
423 HiLink factorOperator Operator
424 HiLink factorFrySpecifier Operator
425 HiLink factorBoolean Boolean
426 HiLink factorBreakpoint Debug
427 HiLink factorDefnDelims Typedef
428 HiLink factorMethodDelims Typedef
429 HiLink factorLocalsMethodDelims Typedef
430 HiLink factorGeneric Typedef
431 HiLink factorGenericN Typedef
432 HiLink factorConstructor Typedef
433 HiLink factorConstructor2 Typedef
434 HiLink factorPrivate Special
435 HiLink factorPDefnDelims Special
436 HiLink factorPMethodDelims Special
437 HiLink factorPLocalsMethodDelims Special
438 HiLink factorPGeneric Special
439 HiLink factorPGenericN Special
440 HiLink factorEscape SpecialChar
441 HiLink factorString String
442 HiLink factorStringDelims factorString
443 HiLink factorTriString factorString
444 HiLink factorTriStringDelims factorTriString
445 HiLink factorPrefixedString factorString
446 HiLink factorPrefixedStringDelims factorPrefixedString
447 HiLink factorMultilineString factorString
448 HiLink factorMultilineStringDelims Typedef
449 HiLink factorHereDoc factorMultilineString
450 HiLink factorHereDocDelims factorMultilineStringDelims
451 HiLink factorHereDocString factorMultilineString
452 HiLink factorHereDocStringDelims factorMultilineStringDelims
453 HiLink factorPrefixedMultilineString factorString
454 HiLink factorPrefixedMultilineStringDelims factorMultilineStringDelims
455 HiLink factorComplex Number
456 HiLink factorRatio Number
457 HiLink factorBin Number
458 HiLink factorHexNoRadix Number
459 HiLink factorHex Number
460 HiLink factorNan Number
461 HiLink factorOct Number
462 HiLink factorFloat Float
463 HiLink factorInteger Number
464 HiLink factorUsing Include
465 HiLink factorQualified Include
466 HiLink factorQualifiedWith Include
467 HiLink factorExclude Include
468 HiLink factorFrom Include
469 HiLink factorRename Include
470 HiLink factorUse Include
471 HiLink factorUnuse Include
472 HiLink factorIn Define
473 HiLink factorChar Character
474 HiLink factorDelimiter Delimiter
475 HiLink factorBackslash Special
476 HiLink factorMBackslash Special
477 HiLink factorLiteral Special
478 HiLink factorLiteralBlock Special
479 HiLink factorDeclaration Typedef
480 HiLink factorSymbol Define
481 HiLink factorSymbols Define
482 HiLink factorConstant Define
483 HiLink factorAlias Define
484 HiLink factorSingleton Typedef
485 HiLink factorSingletons Typedef
486 HiLink factorMixin Typedef
487 HiLink factorInstance Typedef
488 HiLink factorHook Typedef
489 HiLink factorMain Define
490 HiLink factorPostpone Define
491 HiLink factorDefer Define
492 HiLink factorForget Define
493 HiLink factorAlien Define
494 HiLink factorSlot Define
495 HiLink factorIntersection Typedef
496 HiLink factorSlot Typedef
497 HiLink factorSlotDelims factorSlot
498 HiLink factorSlotName Identifier
499 HiLink factorSlotClass Type
500 HiLink factorSlotType factorSlotClass
501 HiLink factorSlotAttr Special
502 HiLink factorSlotAttrInitial factorSlotAttr
503 HiLink factorSlotAttrReadOnly factorSlotAttr
504 HiLink factorStructSlotAttr factorSlotAttr
505 HiLink factorStructSlotAttrBits factorStructSlotAttr
506 HiLink factorPredicate Typedef
507 HiLink factorPredicateDelims factorTuple
508 HiLink factorTuple Typedef
509 HiLink factorTupleDelims factorTuple
510 HiLink factorTupleSlot factorSlot
511 HiLink factorTupleSlotDelims factorSlotDelims
512 HiLink factorTupleSlotName factorSlotName
513 HiLink factorTupleSlotClass factorSlotClass
514 HiLink factorErrorSyn Typedef
515 HiLink factorUnion Typedef
516 HiLink factorStruct Typedef
517 HiLink factorStructDelims factorStruct
518 HiLink factorStructSlot factorSlot
519 HiLink factorStructSlotDelims factorSlotDelims
520 HiLink factorStructSlotName factorSlotName
521 HiLink factorStructSlotType factorSlotType
524 hi hlLevel0 ctermfg=red guifg=red1
525 hi hlLevel1 ctermfg=yellow guifg=orange1
526 hi hlLevel2 ctermfg=green guifg=yellow1
527 hi hlLevel3 ctermfg=cyan guifg=greenyellow
528 hi hlLevel4 ctermfg=magenta guifg=green1
529 hi hlLevel5 ctermfg=red guifg=springgreen1
530 hi hlLevel6 ctermfg=yellow guifg=cyan1
531 hi hlLevel7 ctermfg=green guifg=slateblue1
532 hi hlLevel8 ctermfg=cyan guifg=magenta1
533 hi hlLevel9 ctermfg=magenta guifg=purple1
535 hi hlLevel0 ctermfg=red guifg=red3
536 hi hlLevel1 ctermfg=darkyellow guifg=orangered3
537 hi hlLevel2 ctermfg=darkgreen guifg=orange2
538 hi hlLevel3 ctermfg=blue guifg=yellow3
539 hi hlLevel4 ctermfg=darkmagenta guifg=olivedrab4
540 hi hlLevel5 ctermfg=red guifg=green4
541 hi hlLevel6 ctermfg=darkyellow guifg=paleturquoise3
542 hi hlLevel7 ctermfg=darkgreen guifg=deepskyblue4
543 hi hlLevel8 ctermfg=blue guifg=darkslateblue
544 hi hlLevel9 ctermfg=darkmagenta guifg=darkviolet
549 let b:current_syntax = 'factor'
551 " vim: set ft=vim et sw=2 isk+=/,\\ :