]> gitweb.factorcode.org Git - factor.git/blob - misc/vim/syntax/factor.vim
6f72171d49569556fdea7cb93a9f03255c1e13aa
[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 incompatibile 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 factorClusterNoComment  contains=factorWord,@factorMultilineComment,@factorClusterValue,factorBoolean,factorBreakpoint,factorDeclaration,factorCallQuotation,factorExecute,factorCallNextMethod,@factorWordOps,factorAlien,factorSlot,factorTuple,factorErrorSyn,factorStruct
62 syn cluster factorCluster           contains=@factorComment,@factorClusterNoComment
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 cluster factorComment           contains=factorComment
111 syn cluster factorCommentContents   contains=factorTodo,@Spell
112 syn match   factorTodo              /\v(TODO|FIXME|XXX):=/ contained
113
114 syn cluster factorDefnContents      contains=@factorCluster
115
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
124
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
133
134 syn region  factorPrivate matchgroup=factorPrivate start=/\v<\<PRIVATE>/ end=/\v<PRIVATE\>>/ contains=@factorDefnContents,factorPDefn,factorPMethod,factorPLocalsMethod,factorPGeneric,factorPGenericN skipempty keepend
135
136 syn cluster factorClusterValue      contains=factorBreakpoint,factorBoolean,factorFrySpecifier,factorChar,@factorString,@factorNumber,factorBackslash,factorMBackslash,factorLiteral,factorLiteralBlock,@factorStackEffect,@factorQuotation,@factorArray
137
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
145
146 syn region  factorChar        start=/\v<CHAR:>/ end=/\v\S+>/
147
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
154
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
167
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|,)*>/
175 endif
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|,)*)?)>/
181 endif
182 syn cluster factorFloat                 contains=factorFloat
183 " exponent is followed by valid integer of radix 10
184 " float of
185 "   {valid integer,
186 "     {"[eE]" exponent}
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|,)*)?)>/
194 endif
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|,)*)?)>/
201 endif
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|,)*)?)>/
208 endif
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|,)*)?)>/
217 endif
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
221
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
226
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
230
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
264
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
268
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
282
283 syn cluster factorWordOps   contains=factorConstant,factorAlias,factorSingleton,factorSingletons,factorSymbol,factorSymbols,factorPostpone,factorDefer,factorForget,factorMixin,factorInstance,factorHook,factorMain,factorConstructor
284
285 "TODO:
286 "misc:
287 " HELP:
288 " ARTICLE:
289 "literals:
290 " PRIMITIVE:
291
292 "C interface:
293 " C-ENUM:
294 " FUNCTION:
295 " TYPEDEF:
296 " LIBRARY:
297 "#\ "
298
299 if !exists('g:factor_syn_no_error')
300   syn match   factorStackEffectRequired /\v<\V(\@!\v\S+>/    contained
301 endif
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
325 endif
326
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
331 else
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
343 endif
344
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
348 else
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
360 endif
361
362 if !exists('g:factor_syn_no_error')
363   syn match   factorBracketError    /\v<\]>/
364   syn match   factorBracketError    /\v<\}>/
365 endif
366
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+/
372   endif
373 endfunction
374
375 if !exists('g:factor_syn_no_comment')
376   call FactorSynDefineComment()
377 endif
378
379 " Syntax that bypasses comment lexing.
380 function! FactorSynDefineAfterComment() abort
381 endfunction
382
383 if !exists('g:factor_syn_no_after_comment')
384   call FactorSynDefineAfterComment()
385 endif
386
387 syn sync lines=100
388
389 if !exists('g:factor_syn_no_init')
390   command -nargs=+ -bar HiLink hi def link <args>
391
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
404   endif
405
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
522
523   if &bg == 'dark'
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
534   else
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
545   endif
546 endif
547 delcommand HiLink
548
549 let b:current_syntax = 'factor'
550
551 " vim: set ft=vim et sw=2 isk+=/,\\ :