" Vim syntax file
" Language: Pike
" Maintainer: Francesco Chemolli <[email protected]>
" Last Change: 2001 May 10
" For version 5.x: Clear all syntax items
" For version 6.x: Quit when a syntax file was already loaded
if version < 600
syntax clear
elseif exists("b:current_syntax")
finish
endif
" A bunch of useful C keywords
syn keyword pikeStatement goto break return continue
syn keyword pikeLabel case default
syn keyword pikeConditional if else switch
syn keyword pikeRepeat while for foreach do
syn keyword pikeStatement gauge destruct lambda inherit import typeof
syn keyword pikeException catch
syn keyword pikeType inline nomask private protected public static
syn keyword pikeTodo contained TODO FIXME XXX
" String and Character constants
" Highlight special characters (those which have a backslash) differently
syn match pikeSpecial contained "\\[0-7][0-7][0-7]\=\|\\."
syn region pikeString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=pikeSpecial
syn match pikeCharacter "'[^\\]'"
syn match pikeSpecialCharacter "'\\.'"
syn match pikeSpecialCharacter "'\\[0-7][0-7]'"
syn match pikeSpecialCharacter "'\\[0-7][0-7][0-7]'"
" Compound data types
syn region pikeCompoundType start='({' contains=pikeString,pikeCompoundType,pikeNumber,pikeFloat end='})'
syn region pikeCompoundType start='(\[' contains=pikeString,pikeCompoundType,pikeNumber,pikeFloat end='\])'
syn region pikeCompoundType start='(<' contains=pikeString,pikeCompoundType,pikeNumber,pikeFloat end='>)'
"catch errors caused by wrong parenthesis
syn region pikeParen transparent start='([^{[<(]' end=')' contains=ALLBUT,pikeParenError,pikeIncluded,pikeSpecial,pikeTodo,pikeUserLabel,pikeBitField
syn match pikeParenError ")"
syn match pikeInParen contained "[^(][{}][^)]"
"integer number, or floating point number without a dot and with "f".
syn case ignore
syn match pikeNumber "\<\d\+\(u\=l\=\|lu\|f\)\>"
"floating point number, with dot, optional exponent
syn match pikeFloat "\<\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\=\>"
"floating point number, starting with a dot, optional exponent
syn match pikeFloat "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
"floating point number, without dot, with exponent
syn match pikeFloat "\<\d\+e[-+]\=\d\+[fl]\=\>"
"hex number
syn match pikeNumber "\<0x[0-9a-f]\+\(u\=l\=\|lu\)\>"
"syn match pikeIdentifier "\<[a-z_][a-z0-9_]*\>"
syn case match
" flag an octal number with wrong digits
syn match pikeOctalError "\<0[0-7]*[89]"
if exists("c_comment_strings")
" A comment can contain pikeString, pikeCharacter and pikeNumber.
" But a "*/" inside a pikeString in a pikeComment DOES end the comment! So we
" need to use a special type of pikeString: pikeCommentString, which also ends on
" "*/", and sees a "*" at the start of the line as comment again.
" Unfortunately this doesn't very well work for // type of comments :-(
syntax match pikeCommentSkip contained "^\s*\*\($\|\s\+\)"
syntax region pikeCommentString contained start=+"+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=pikeSpecial,pikeCommentSkip
syntax region pikeComment2String contained start=+"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=pikeSpecial
syntax region pikeComment start="/\*" end="\*/" contains=pikeTodo,pikeCommentString,pikeCharacter,pikeNumber,pikeFloat
syntax match pikeComment "//.*" contains=pikeTodo,pikeComment2String,pikeCharacter,pikeNumber
syntax match pikeComment "#\!.*" contains=pikeTodo,pikeComment2String,pikeCharacter,pikeNumber
else
syn region pikeComment start="/\*" end="\*/" contains=pikeTodo
syn match pikeComment "//.*" contains=pikeTodo
syn match pikeComment "#!.*" contains=pikeTodo
endif
syntax match pikeCommentError "\*/"
syn keyword pikeOperator sizeof
syn keyword pikeType int string void float mapping array multiset mixed
syn keyword pikeType program object function
syn region pikePreCondit start="^\s*#\s*\(if\>\|ifdef\>\|ifndef\>\|elif\>\|else\>\|endif\>\)" skip="\\$" end="$" contains=pikeComment,pikeString,pikeCharacter,pikeNumber,pikeCommentError
syn region pikeIncluded contained start=+"+ skip=+\\\\\|\\"+ end=+"+
syn match pikeIncluded contained "<[^>]*>"
syn match pikeInclude "^\s*#\s*include\>\s*["<]" contains=pikeIncluded
"syn match pikeLineSkip "\\$"
syn region pikeDefine start="^\s*#\s*\(define\>\|undef\>\)" skip="\\$" end="$" contains=ALLBUT,pikePreCondit,pikeIncluded,pikeInclude,pikeDefine,pikeInParen
syn region pikePreProc start="^\s*#\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" contains=ALLBUT,pikePreCondit,pikeIncluded,pikeInclude,pikeDefine,pikeInParen
" Highlight User Labels
syn region pikeMulti transparent start='?' end=':' contains=ALLBUT,pikeIncluded,pikeSpecial,pikeTodo,pikeUserLabel,pikeBitField
" Avoid matching foo::bar() in C++ by requiring that the next char is not ':'
syn match pikeUserLabel "^\s*\I\i*\s*:$"
syn match pikeUserLabel ";\s*\I\i*\s*:$"ms=s+1
syn match pikeUserLabel "^\s*\I\i*\s*:[^:]"me=e-1
syn match pikeUserLabel ";\s*\I\i*\s*:[^:]"ms=s+1,me=e-1
" Avoid recognizing most bitfields as labels
syn match pikeBitField "^\s*\I\i*\s*:\s*[1-9]"me=e-1
syn match pikeBitField ";\s*\I\i*\s*:\s*[1-9]"me=e-1
syn sync ccomment pikeComment minlines=10
" Define the default highlighting.
" For version 5.7 and earlier: only when not done already
" For version 5.8 and later: only when an item doesn't have highlighting yet
if version >= 508 || !exists("did_pike_syntax_inits")
if version < 508
let did_pike_syntax_inits = 1
command -nargs=+ HiLink hi link <args>
else
command -nargs=+ HiLink hi def link <args>
endif
HiLink pikeLabel Label
HiLink pikeUserLabel Label
HiLink pikeConditional Conditional
HiLink pikeRepeat Repeat
HiLink pikeCharacter Character
HiLink pikeSpecialCharacter pikeSpecial
HiLink pikeNumber Number
HiLink pikeFloat Float
HiLink pikeOctalError pikeError
HiLink pikeParenError pikeError
HiLink pikeInParen pikeError
HiLink pikeCommentError pikeError
HiLink pikeOperator Operator
HiLink pikeInclude Include
HiLink pikePreProc PreProc
HiLink pikeDefine Macro
HiLink pikeIncluded pikeString
HiLink pikeError Error
HiLink pikeStatement Statement
HiLink pikePreCondit PreCondit
HiLink pikeType Type
HiLink pikeCommentError pikeError
HiLink pikeCommentString pikeString
HiLink pikeComment2String pikeString
HiLink pikeCommentSkip pikeComment
HiLink pikeString String
HiLink pikeComment Comment
HiLink pikeSpecial SpecialChar
HiLink pikeTodo Todo
HiLink pikeException pikeStatement
HiLink pikeCompoundType Constant
"HiLink pikeIdentifier Identifier
delcommand HiLink
endif
let b:current_syntax = "pike"
" vim: ts=8
|