factor/misc/vim/syntax/factor.vim

513 lines
33 KiB
VimL

" Vim syntax file
" Language: Factor
" Maintainer: Alex Chapman <chapman.alex@gmail.com>
" Last Change: 2020 Jun 05
" Minimum Version: 600
" Factor |syntax| file guide & conventions:
"
" Inside |:comment|s, words in |bars| contain |:help| keywords.
" |K| looks these up.
"
" Alignment columns should normally occur on multiples of 4.
" Align Vim syntax alternatives naturally. E.g.:
" "syn match ..."
" "syn cluster ..."
" "syn region ..."
" Align |:syn-start|, |:syn-skip|, and |:syn-end| on their patterns.
" ":echo (col('.') - 1) % 4" is handy here.
"
" All syntax patterns (|:syn-pattern|) are "very magic" (|/\v|).
" Escape all literal [^0-9a-zA-Z_-!:;] characters in these patterns.
" (Not escaping [-!:;] characters risks forward-incompatibility,
" but fixes if an incompatibile Vim arises would be trivial,
" and Factor likes these characters.)
"
" Syntax groups ending in "Error" match errors via |:syn-priority|,
" and should normally |:hi-link| to "Error".
"
" Syntax groups named "{group-name}Trans" are |:syn-transparent|.
"
" |:syn-cluster|s named "{group-name}" mean to allow |:syn-contains| use of
" |:syn-priority|-based error-detection.
" This still applies to clusters named "{group-name}Trans".
"
" Syntax groups "{group-name}Skip" have the form:
" "syn match {group-name}Skip /\v%(\_\s+%(!>.*)?)*/ nextgroup={group-name} transparent contained"
" Specifying "nextgroup={group-name}Skip" works like a Factor-aware
" "nextgroup={group-name} skipwhite skipempty"
" with required initial space (not optional).
" "{cluster-name}Skip" works similarly, but with "nextgroup=@{cluster-name}".
"
" Vim's syntax highlighting freaks at paired "/\v\(" and "/\v\)". ☹
" Switching into very nomagic (with "/\V(\v/" or "/\V)\v") averts that,
" as non-escaped parentheses don't extend pattern regions.
if exists('b:current_syntax')
finish
endif
" Factor is case sensitive.
syn case match
" Make all of these characters part of a word (useful for skipping over words with w, e, and b)
let s:iskeyword = '!,@,33-35,%,$,38-64,A-Z,91-96,a-z,123-126,128-255'
let s:set_iskeyword = has('patch-7.4.1142') ? 'syn iskeyword ' :
\ 'setlocal iskeyword='
execute s:set_iskeyword . s:iskeyword
syn match factorWord /\v<\S+>/ contains=@factorWord transparent display
syn cluster factorClusterNoComment contains=factorWord,@factorMultilineComment,@factorClusterValue,factorBoolean,factorBreakpoint,factorDeclaration,factorCallQuotation,factorExecute,factorCallNextMethod,@factorWordOps,factorAlien,factorSlot,factorTuple,factorErrorSyn,factorStruct
syn cluster factorCluster contains=@factorComment,@factorClusterNoComment
" A crash course on Factor's lexer:
"
" The "lexer" vocabulary parses lines (arrays of strings) into tokens.
" Tokens are non-space strings, effectively words.
" "[ f skip ] call( i seq -- n )" finds the next space, erroring on tabs.
" "t skip" finds the next non-space.
" The "lexer" class holds lex state.
" Lexer method "skip-word" advances to the next space (via "f skip"),
" while also counting leading double quotation marks as their own words.
" I.e., this advances to the end of the current token
" (if currently at a token, otherwise nothing changes).
" Method "skip-blank" advances to the next non-space (via "t skip"),
" while also skipping shebangs at the beginning of the first line.
" I.e., this advances to the start of the next token
" (if one is present, otherwise it advances to the line's end).
" "(parse-raw)" advances a lexer through an immediate token via "skip-word",
" and returns the (sub)token advanced through.
" Note that this will not advance a lexer at space,
" and an empty string will be returned.
" "next-line" advances a lexer to the start of the next line,
" adding an effectively empty line to the end (as an EOF state).
" "parse-raw" advances a lexer through the next token,
" first via alternating "skip-blank" & "next-line" if the line ended,
" then via "(parse-raw)",
" and returns it if found, otherwise (i.e. upon EOF) returning "f".
" Note that the lexer will be advanced to EOF if "f" is returned.
" Comments are (unprocessed) remainders of lines, after a "!" word.
" "parse-token" advances a lexer though the next token via "parse-raw",
" then returns it if found, otherwise returning "f".
" while also advancing through comments
" via mutual recursion with "skip-comment".
" "[ skip-comment ] call( lexer str -- str' )" tests if a token is "!",
" returning that token if so,
" otherwise first advancing a lexer to the next line via "next-line"
" (i.e. discarding the rest of the current line)
" and then advancing it via "parse-token" & returning that token,
" ensuring the return of "parse-token"'s desired non-comment token.
" The "lexer" dynamic variable holds the ambient lexer.
" "?scan-token" advances the ambient lexer through the next token
" via "parse-token",
" and returns it if found, otherwise returning "f".
" "scan-token" advances the ambient lexer through the next token
" via "?scan-token",
" and returns it if found, otherwise throwing an exception.
" All other words in the "lexer" vocabulary read via "scan-token", if at all.
" So! To know when double quotes & exclamation marks aren't special,
" grep for "parse-raw". (Mostly. To be certain, grep for "lexer".)
syn cluster factorComment contains=factorComment
syn cluster factorCommentContents contains=factorTodo,@Spell
syn match factorTodo /\v(TODO|FIXME|XXX):=/ contained
syn cluster factorDefnContents contains=@factorCluster
syn region factorDefn start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ skip=/\v<!>/ matchgroup=factorDefnDelims end=/\v<;>/ contains=factorDefnDelims,@factorDefnContents
syn region factorMethod start=/\v<M::?>/ skip=/\v<!>/ matchgroup=factorDefnDelims end=/\v<;>/ contains=factorMethodDelims,@factorDefnContents
syn region factorGeneric start=/\v<%(GENERIC|MATH|PRIMITIVE):>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip
syn region factorGenericN start=/\v<GENERIC\#:>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\d+>/ contains=@factorComment nextgroup=factorStackEffectSkip
syn region factorPDefn start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ skip=/\v<!>/ matchgroup=factorPDefnDelims end=/\v<;>/ contains=factorPDefnDelims,@factorDefnContents contained
syn region factorPMethod start=/\v<M::?>/ skip=/\v<!>/ matchgroup=factorPDefnDelims end=/\v<;>/ contains=factorPMethodDelims,@factorDefnContents contained
syn region factorPGeneric start=/\v<%(GENERIC|MATH|PRIMITIVE):>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip contained
syn region factorPGenericN start=/\v<GENERIC\#:>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\d+>/ contains=@factorComment nextgroup=factorStackEffectSkip contained
syn region factorDefnDelims start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip contained
syn region factorMethodDelims start=/\v<M::?>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip contained
syn region factorPDefnDelims start=/\v<%(SYNTAX|%(MACRO|MEMO|TYPED)?:?):>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip contained
syn region factorPMethodDelims start=/\v<M::?>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip contained
syn region None matchgroup=factorPrivate start=/\v<\<PRIVATE>/ end=/\v<PRIVATE\>>/ contains=@factorDefnContents,factorPrivateDefn,factorPrivateMethod,factorPGeneric,factorPGenericN
syn cluster factorClusterValue contains=factorBreakpoint,factorBoolean,factorFrySpecifier,factorChar,@factorString,@factorNumber,factorBackslash,factorMBackslash,factorLiteral,factorLiteralBlock,@factorStackEffect,@factorQuotation,@factorArray
syn match factorClusterValueSkip /\v%(\_\s+%(!>.*)?)*/ nextgroup=@factorClusterValue transparent contained
syn keyword factorBoolean f t
syn keyword factorBreakpoint B
syn keyword factorFrySpecifier @ _ contained
syn keyword factorDeclaration delimiter deprecated final flushable foldable inline recursive
syn match factorCallQuotation /\vcall\V(\v/me=e-1 nextgroup=@factorStackEffect
syn match factorExecute /\vexecute\V(\v/me=e-1 nextgroup=@factorStackEffect
syn keyword factorCallNextMethod call-next-method
syn region factorChar start=/\v<CHAR:>/ end=/\v\S+>/
syn cluster factorString contains=factorString,factorTriString,factorPrefixedString
syn match factorEscape /\v\\([\\astnrbvf0e\"]|u\x{6}|u\{\S+}|x\x{2})/ contained display
syn region factorString matchgroup=factorStringDelims start=/\v<"/ skip=/\v\\"/ end=/\v"/ contains=factorEscape
syn region factorTriString matchgroup=factorTriStringDelims start=/\v<"""/ skip=/\v\\"/ end=/\v"""/ contains=factorEscape
syn region factorPrefixedString matchgroup=factorPrefixedStringDelims start=/\v<[^[:blank:]"]+">/ skip=/\v\\"/ end=/\v"/ contains=factorEscape
" Vocabulary: multiline
" This vocabulary reads the ambient lexer without "parse-raw".
syn cluster factorString add=factorMultilineString,factorHereDocString,factorPrefixedMultilineString
syn region factorMultilineString matchgroup=factorMultilineStringDelims start=/\v<\[\z(\={0,6})\[>/ end=/\v\]\z1\]/
syn region factorHereDoc matchgroup=factorMultilineStringDelims start=/\v<STRING:\s+\S+>/ end=/\v^;$/
syn region factorHereDocString matchgroup=factorMultilineStringDelims start=/\v<HEREDOC:\s+\z(.*)>/ end=/\v^\z1$/
syn region factorPrefixedMultilineString matchgroup=factorPrefixedMultilineStringDelims start=/\v<[^[\][:blank:]]+\[\z(\={0,6})\[>/ end=/\v\]\z1\]/
" These comments are normal syntax words, so no lexer privilege for them.
" (Hence, no "syn cluster factorComment" membership.)
syn cluster factorMultilineComment contains=factorMultilineComment,factorMultilineCComment
syn region factorMultilineComment matchgroup=factorMultilineCommentDelims start=/\v<!\[\z(\={0,6})\[>/ end=/\v\]\z1\]/ contains=@factorCommentContents keepend
syn region factorMultilineCComment matchgroup=factorMultilineCCommentDelims start=/\v<\/\*>/ end=/\v\*\// contains=@factorCommentContents keepend
syn cluster factorReal contains=factorInt,factorFloat,factorPosRatio,factorNegRatio,@factorBin,@factorHex,@factorOct,factorNan
syn cluster factorNumber contains=@factorReal,factorComplex
syn match factorInt /\v<[+-]=[0-9]%([0-9,]*[0-9])?%([eE]%([+-])?[0-9]+)?>/
syn match factorFloat /\v<[+-]=[0-9]%([0-9,]*[0-9])?%(\.%(%([0-9,]*[0-9]+)?%([eE]%([+-])?[0-9]%([0-9,]*[0-9])?)?)?)?>/
syn match factorPosRatio /\v<\+=[0-9]%([0-9,]*[0-9])?%(\+[0-9]%([0-9,]*[0-9]+)?)?\/-=[0-9]%([0-9,]*[0-9]+)?\.?>/
syn match factorNegRatio /\v<\-[0-9]%([0-9,]*[0-9])?%(\-[0-9]%([0-9,]*[0-9]+)?)?\/-=[0-9]%([0-9,]*[0-9]+)?\.?>/
syn region factorComplex start=/\v<C\{>/ end=/\v<\}>/ contains=@factorReal
syn cluster factorBin contains=factorBin
syn match factorBin /\v<[+-]=0b[01,]+>/
if !exists('g:factor_syn_no_error')
syn match factorBinError /\v<[+-]=0b[01,]*[^01 ]\S*>/
syn cluster factorBin add=factorBinError
endif
syn cluster factorHexNoRadixTrans contains=factorHexNoRadixTrans
syn match factorHexNoRadixTrans /\v<[0-9a-fA-F]%([0-9a-fA-F,]*[0-9a-fA-F])?%(\.[0-9a-fA-F]%([0-9a-fA-F,]*[0-9a-fA-F])?)?%(p-=[0-9]%([0-9,]*[0-9])?)?>/ contained transparent
syn cluster factorHex contains=factorHex
syn match factorHex /\v<[+-]=0x[0-9a-fA-F]%([0-9a-fA-F,]*[0-9a-fA-F])?%(\.[0-9a-fA-F]%([0-9a-fA-F,]*[0-9a-fA-F])?)?%(p-=[0-9]%([0-9,]*[0-9])?)?>/
if !exists('g:factor_syn_no_error')
syn match factorHexNoRadixError /\v<%(,\S*|\S*,|[-0-9a-fA-Fp,]*[^-0-9a-fA-Fp, ]\S*)>/ contained
syn cluster factorHexNoRadixTrans add=factorHexNoRadixError
syn match factorHexError /\v<[+-]=0x%(,\S*|\S*,|[-0-9a-fA-Fp,]*[^-0-9a-fA-Fp, ]\S*)>/
syn cluster factorHex add=factorHexError
endif
syn cluster factorOct contains=factorOct
syn match factorOct /\v<[+-]=0o[0-7,]+>/
if !exists('g:factor_syn_no_error')
syn match factorOctError /\v<[+-]=0o%(,\S*|\S*,|[0-7,]*[^0-7, ]\S*)>/
syn cluster factorOct add=factorOctError
endif
syn match factorOct /\v<[+-]=0o[0-7,]+>/
syn region factorNan matchgroup=factorNan start=/\v<NAN:>/ matchgroup=NONE end=/\v<\S+>/ contains=@factorComment,@factorHexNoRadixTrans
syn region factorBackslash start=/\v<\\>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
syn region factorMBackslash start=/\v<M\\>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment
syn region factorLiteral start=/\v<\$>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
syn region factorLiteralBlock start=/\v<\$\[>/ end=/\v<\]>/ contains=@factorComment
syn region factorIn start=/\v<IN:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
syn region factorUse start=/\v<USE:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
syn region factorUnuse start=/\v<UNUSE:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
syn region factorUsing start=/\v<USING:>/ end=/\v<;>/ contains=@factorComment
syn region factorQualified start=/\v<QUALIFIED:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
syn region factorQualifiedWith start=/\v<QUALIFIED-WITH:>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment
syn region factorExclude start=/\v<EXCLUDE:>/ end=/\v<;>/ contains=@factorComment
syn region factorFrom start=/\v<FROM:>/ end=/\v<;>/ contains=@factorComment
syn region factorRename start=/\v<RENAME:>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+%(\_\s+%(!>.*)?)+\=\>%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment
syn region factorSingletons start=/\v<SINGLETONS:>/ end=/\v<;>/ contains=@factorComment
syn region factorSymbol start=/\v<SYMBOL:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
syn region factorSymbols start=/\v<SYMBOLS:>/ end=/\v<;>/ contains=@factorComment
syn region factorConstructor2 start=/\v<CONSTRUCTOR:?/ end=/\v<;>/ contains=@factorComment
syn region factorIntersection start=/\v<INTERSECTION:>/ end=/\v<;>/ contains=@factorComment
syn cluster factorSlotAttr contains=factorSlotAttrInitial,factorSlotAttrReadOnly
syn cluster factorTupleSlotAttr contains=@factorSlotAttr
syn match factorTupleSlotName /\v<\S+>/ nextgroup=factorTupleSlotClassSkip contained
syn match factorTupleSlotNameSkip /\v%(\_\s+%(!>.*)?)*/ nextgroup=factorTupleSlotName transparent contained
syn match factorTupleSlotClass /\v<\S+>/ contained
" a class is optional, so let an attribute take priority if present
syn match factorTupleSlotClassSkip /\v%(\_\s+%(!>.*)?)*/ nextgroup=factorTupleSlotClass,@factorTupleSlotAttr transparent contained
syn region factorTupleSlot matchgroup=factorTupleSlotDelims start=/\v<\{>/ end=/\v<\}>/ contains=@factorComment,factorTupleSlotName,@factorTupleSlotAttr contained
syn region factorTuple matchgroup=factorTupleDelims start=/\v<%(TUPLE|BUILTIN):>/ end=/\v<;>/ contains=@factorComment,factorTupleSlotName,factorTupleSlot
" Abnormally named because factor*Error is reserved for syntax errors.
syn region factorErrorSyn start=/\v<ERROR:>/ end=/\v<;>/ contains=@factorComment
syn region factorUnion start=/\v<UNION:>/ end=/\v<;>/ contains=@factorComment
syn cluster factorStructSlotAttr contains=@factorSlotAttr,factorStructSlotAttrBits
syn match factorStructSlotName /\v<\S+>/ nextgroup=factorStructSlotTypeSkip contained
syn match factorStructSlotNameSkip /\v%(\_\s+%(!>.*)?)*/ nextgroup=factorStructSlotName contained transparent
syn match factorStructSlotType /\v<\S+>/ contained
syn match factorStructSlotTypeSkip /\v%(\_\s+%(!>.*)?)*/ nextgroup=factorStructSlotType contained transparent
syn region factorStructSlot matchgroup=factorStructSlotDelims start=/\v<\{>/ end=/\v<\}>/ contains=@factorComment,factorStructSlotName,@factorStructSlotAttr contained
syn region factorStruct matchgroup=factorStructDelims start=/\v<%(UNION-STRUCT|STRUCT):>/ end=/\v<;>/ contains=@factorComment,factorStructSlot
syn match factorSlotAttrReadOnly /\v<read-only>/ contained
syn match factorSlotAttrInitial /\v<initial:>%(\_\s+%(!>.*)?)+/ contains=@factorComment nextgroup=factorWord,@factorClusterValue contained
syn match factorStructSlotAttrBits /\v<bits:>%(\_\s+%(!>.*)?)+/ contains=@factorComment nextgroup=factorWord,@factorReal contained
syn region factorConstant start=/\v<CONSTANT:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
syn region factorAlias start=/\v<ALIAS:>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment
syn region factorSingleton start=/\v<SINGLETON:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
syn region factorPostpone start=/\v<POSTPONE:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
syn region factorDefer start=/\v<DEFER:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
syn region factorForget start=/\v<FORGET:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
syn region factorMixin start=/\v<MIXIN:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
syn region factorInstance start=/\v<INSTANCE:>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment
syn region factorHook start=/\v<HOOK:>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment nextgroup=factorStackEffectSkip
syn region factorMain start=/\v<MAIN:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
syn region factorConstructor start=/\v<C:>/ skip=/\v<!>/ end=/\v<\S+%(\_\s+%(!>.*)?)+\S+>/ contains=@factorComment
syn region factorAlien matchgroup=factorAlien start=/\v<ALIEN:>/ matchgroup=NONE skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment,@factorHexNoRadixTrans
syn region factorSlot start=/\v<SLOT:>/ skip=/\v<!>/ end=/\v<\S+>/ contains=@factorComment
syn cluster factorWordOps contains=factorConstant,factorAlias,factorSingleton,factorSingletons,factorSymbol,factorSymbols,factorPostpone,factorDefer,factorForget,factorMixin,factorInstance,factorHook,factorMain,factorConstructor
"TODO:
"misc:
" HELP:
" ARTICLE:
"literals:
" PRIMITIVE:
"C interface:
" C-ENUM:
" FUNCTION:
" TYPEDEF:
" LIBRARY:
"#\ "
if !exists('g:factor_syn_no_error')
syn match factorStackEffectRequired /\v<\V(\@!\v\S+>/ contained
endif
syn cluster factorStackEffectContents contains=@factorComment,factorStackEffectDelims,factorStackEffectVar,factorStackEffectType,factorStackEffectRowVar
syn cluster factorStackEffect contains=factorStackEffect
" Erroring on stack effects without a "--" separator would be nice.
" Unfortunately, that sort of vacuous detection is above Vim's pay-grade,
" especially when stack effects can be nested arbitrarily via types.
syn match factorStackEffectSkip /\v%(\_\s+%(!>.*)?)*/ nextgroup=factorStackEffectRequired,@factorStackEffect transparent contained
syn region factorStackEffect matchgroup=factorStackEffectDelims start=/\v\V(\v>/ end=/\v<\V)\v>/ contains=@factorStackEffectContents
syn match factorStackEffectVar /\v<\S+>/ contained
" Note that ":!" parses to the "!" word and doesn't lex as a comment.
" Also, even though we take any value, the leading ":" breaking the word
" boundary means a lot of our nicer syntax patterns don't match on
" "factorStackEffectType".
" syn cluster factorStackEffectType contains=factorWord,@factorStackEffect
syn cluster factorStackEffectType contains=@factorClusterValue
syn region factorStackEffectVar matchgroup=factorStackEffectVar start=/\v<\S+:>/ matchgroup=NONE end=/\v%(\_\s+%(!>.*)?)+/ contains=@factorComment nextgroup=@factorStackEffectType transparent contained
syn match factorStackEffectType /\v<:/ contained nextgroup=@factorStackEffectType
syn match factorStackEffectRowVar /\v<\.\.\S+>/ contained
syn region factorStackEffectRowVar matchgroup=factorStackEffectRowVar start=/\v<\.\.\S+:>/ matchgroup=NONE end=/\v%(\_\s+%(!>.*)?)+/ contains=@factorComment nextgroup=@factorStackEffectType transparent contained
syn match factorStackEffectDelims /\v<-->/ contained
if !exists('g:factor_syn_no_error')
syn cluster factorStackEffectContents add=factorStackEffectError
syn keyword factorStackEffectError ( contained
endif
" adapted from lisp.vim
if exists('g:factor_syn_no_rainbow')
syn cluster factorQuotation contains=factorQuotation
syn region factorQuotation matchgroup=factorDelimiter start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=ALL
else
syn cluster factorQuotation contains=factorQuotation0
syn region factorQuotation0 matchgroup=hlLevel0 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation1,factorArray1
syn region factorQuotation1 contained matchgroup=hlLevel1 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation2,factorArray2
syn region factorQuotation2 contained matchgroup=hlLevel2 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation3,factorArray3
syn region factorQuotation3 contained matchgroup=hlLevel3 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation4,factorArray4
syn region factorQuotation4 contained matchgroup=hlLevel4 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation5,factorArray5
syn region factorQuotation5 contained matchgroup=hlLevel5 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation6,factorArray6
syn region factorQuotation6 contained matchgroup=hlLevel6 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation7,factorArray7
syn region factorQuotation7 contained matchgroup=hlLevel7 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation8,factorArray8
syn region factorQuotation8 contained matchgroup=hlLevel8 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation9,factorArray9
syn region factorQuotation9 contained matchgroup=hlLevel9 start=/\v<%(%(%('|\$|)\[)|\[%(let|\|))>/ end=/\v<\]>/ contains=@factorCluster,factorQuotation0,factorArray0
endif
if exists('g:factor_syn_no_rainbow')
syn cluster factorArray contains=factorArray
syn region factorArray matchgroup=factorDelimiter start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=ALL
else
syn cluster factorArray contains=factorArray0
syn region factorArray0 matchgroup=hlLevel0 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray1,factorQuotation1
syn region factorArray1 contained matchgroup=hlLevel1 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray2,factorQuotation2
syn region factorArray2 contained matchgroup=hlLevel2 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray3,factorQuotation3
syn region factorArray3 contained matchgroup=hlLevel3 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray4,factorQuotation4
syn region factorArray4 contained matchgroup=hlLevel4 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray5,factorQuotation5
syn region factorArray5 contained matchgroup=hlLevel5 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray6,factorQuotation6
syn region factorArray6 contained matchgroup=hlLevel6 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray7,factorQuotation7
syn region factorArray7 contained matchgroup=hlLevel7 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray8,factorQuotation8
syn region factorArray8 contained matchgroup=hlLevel8 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray9,factorQuotation9
syn region factorArray9 contained matchgroup=hlLevel9 start=/\v<%(\$|[-a-zA-Z0-9]+)?\{>/ end=/\v<\}>/ contains=@factorCluster,factorArray0,factorQuotation0
endif
if !exists('g:factor_syn_no_error')
syn match factorBracketError /\v<\]>/
syn match factorBracketError /\v<\}>/
endif
function! FactorSynDefineComment() abort
syn region factorComment start=/\v<!>/ end=/\v$/ keepend oneline contains=@factorCommentContents
syn match factorShebang /\v%^\#!.*$/ display
if !exists('g:factor_syn_no_error')
syn match factorShebangError /\v%^\#!\S+/
endif
endfunction
if !exists('g:factor_syn_no_comment')
call FactorSynDefineComment()
endif
" Syntax that bypasses comment lexing.
function! FactorSynDefineAfterComment() abort
endfunction
if !exists('g:factor_syn_no_after_comment')
call FactorSynDefineAfterComment()
endif
syn sync lines=100
if !exists('g:factor_syn_no_init')
command -nargs=+ -bar HiLink hi def link <args>
if !exists('g:factor_syn_no_error')
HiLink factorShebangError Error
HiLink factorBracketError Error
HiLink factorBinError Error
HiLink factorHexNoRadixError Error
HiLink factorHexError Error
HiLink factorOctError Error
HiLink factorStackEffectRequired Error
HiLink factorStackEffectError Error
endif
HiLink factorComment Comment
HiLink factorMultilineComment factorComment
HiLink factorMultilineCComment factorComment
HiLink factorShebang PreProc
HiLink factorStackEffect Type
HiLink factorStackEffectDelims Delimiter
HiLink factorStackEffectVar Identifier
HiLink factorStackEffectRowVar factorStackEffectVar
HiLink factorStackEffectType Type
HiLink factorTodo Todo
HiLink factorInclude Include
HiLink factorWord Keyword
HiLink factorCallQuotation Keyword
HiLink factorExecute Keyword
HiLink factorCallNextMethod Keyword
HiLink factorOperator Operator
HiLink factorFrySpecifier Operator
HiLink factorBoolean Boolean
HiLink factorBreakpoint Debug
HiLink factorDefnDelims Typedef
HiLink factorMethodDelims Typedef
HiLink factorGeneric Typedef
HiLink factorGenericN Typedef
HiLink factorConstructor Typedef
HiLink factorConstructor2 Typedef
HiLink factorPrivate Special
HiLink factorPDefnDelims Special
HiLink factorPMethodDelims Special
HiLink factorPGenericDelims Special
HiLink factorPGenericNDelims Special
HiLink factorEscape SpecialChar
HiLink factorString String
HiLink factorStringDelims factorString
HiLink factorTriString factorString
HiLink factorTriStringDelims factorTriString
HiLink factorPrefixedString factorString
HiLink factorPrefixedStringDelims factorPrefixedString
HiLink factorMultilineString factorString
HiLink factorMultilineStringDelims Typedef
HiLink factorHereDocString factorMultilineString
HiLink factorHereDocStringDelims factorMultilineStringDelims
HiLink factorPrefixedMultilineString factorString
HiLink factorPrefixedMultilineStringDelims factorMultilineStringDelims
HiLink factorComplex Number
HiLink factorPosRatio Number
HiLink factorNegRatio Number
HiLink factorBin Number
HiLink factorHex Number
HiLink factorNan Number
HiLink factorOct Number
HiLink factorFloat Float
HiLink factorInt Number
HiLink factorUsing Include
HiLink factorQualified Include
HiLink factorQualifiedWith Include
HiLink factorExclude Include
HiLink factorFrom Include
HiLink factorRename Include
HiLink factorUse Include
HiLink factorUnuse Include
HiLink factorIn Define
HiLink factorChar Character
HiLink factorDelimiter Delimiter
HiLink factorBackslash Special
HiLink factorMBackslash Special
HiLink factorLiteral Special
HiLink factorLiteralBlock Special
HiLink factorDeclaration Typedef
HiLink factorSymbol Define
HiLink factorSymbols Define
HiLink factorConstant Define
HiLink factorAlias Define
HiLink factorSingleton Define
HiLink factorSingletons Define
HiLink factorMixin Typedef
HiLink factorInstance Typedef
HiLink factorHook Typedef
HiLink factorMain Define
HiLink factorPostpone Define
HiLink factorDefer Define
HiLink factorForget Define
HiLink factorAlien Define
HiLink factorSlot Define
HiLink factorIntersection Typedef
HiLink factorSlot Typedef
HiLink factorSlotDelims factorSlot
HiLink factorSlotName Identifier
HiLink factorSlotClass Type
HiLink factorSlotType factorSlotClass
HiLink factorSlotAttr Special
HiLink factorSlotAttrInitial factorSlotAttr
HiLink factorSlotAttrReadOnly factorSlotAttr
HiLink factorStructSlotAttr factorSlotAttr
HiLink factorStructSlotAttrBits factorStructSlotAttr
HiLink factorTuple Typedef
HiLink factorTupleDelims factorTuple
HiLink factorTupleSlot factorSlot
HiLink factorTupleSlotDelims factorSlotDelims
HiLink factorTupleSlotName factorSlotName
HiLink factorTupleSlotClass factorSlotClass
HiLink factorErrorSyn Typedef
HiLink factorUnion Typedef
HiLink factorStruct Typedef
HiLink factorStructDelims factorStruct
HiLink factorStructSlot factorSlot
HiLink factorStructSlotDelims factorSlotDelims
HiLink factorStructSlotName factorSlotName
HiLink factorStructSlotType factorSlotType
if &bg == 'dark'
hi hlLevel0 ctermfg=red guifg=red1
hi hlLevel1 ctermfg=yellow guifg=orange1
hi hlLevel2 ctermfg=green guifg=yellow1
hi hlLevel3 ctermfg=cyan guifg=greenyellow
hi hlLevel4 ctermfg=magenta guifg=green1
hi hlLevel5 ctermfg=red guifg=springgreen1
hi hlLevel6 ctermfg=yellow guifg=cyan1
hi hlLevel7 ctermfg=green guifg=slateblue1
hi hlLevel8 ctermfg=cyan guifg=magenta1
hi hlLevel9 ctermfg=magenta guifg=purple1
else
hi hlLevel0 ctermfg=red guifg=red3
hi hlLevel1 ctermfg=darkyellow guifg=orangered3
hi hlLevel2 ctermfg=darkgreen guifg=orange2
hi hlLevel3 ctermfg=blue guifg=yellow3
hi hlLevel4 ctermfg=darkmagenta guifg=olivedrab4
hi hlLevel5 ctermfg=red guifg=green4
hi hlLevel6 ctermfg=darkyellow guifg=paleturquoise3
hi hlLevel7 ctermfg=darkgreen guifg=deepskyblue4
hi hlLevel8 ctermfg=blue guifg=darkslateblue
hi hlLevel9 ctermfg=darkmagenta guifg=darkviolet
endif
endif
delcommand HiLink
let b:current_syntax = 'factor'
" vim: set ft=vim et sw=2 isk+=/,\\ :