3 " Maintainer: Francesco Chemolli <kinkie@kame.usr.dsi.unimi.it>
4 " Last Change: 2001 May 10
6 " For version 5.x: Clear all syntax items
7 " For version 6.x: Quit when a syntax file was already loaded
10 elseif exists("b:current_syntax")
14 " A bunch of useful C keywords
15 syn keyword pikeStatement goto break return continue
16 syn keyword pikeLabel case default
17 syn keyword pikeConditional if else switch
18 syn keyword pikeRepeat while for foreach do
19 syn keyword pikeStatement gauge destruct lambda inherit import typeof
20 syn keyword pikeException catch
21 syn keyword pikeType inline nomask private protected public static
24 syn keyword pikeTodo contained TODO FIXME XXX
26 " String and Character constants
27 " Highlight special characters (those which have a backslash) differently
28 syn match pikeSpecial contained "\\[0-7][0-7][0-7]\=\|\\."
29 syn region pikeString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=pikeSpecial
30 syn match pikeCharacter "'[^\\]'"
31 syn match pikeSpecialCharacter "'\\.'"
32 syn match pikeSpecialCharacter "'\\[0-7][0-7]'"
33 syn match pikeSpecialCharacter "'\\[0-7][0-7][0-7]'"
36 syn region pikeCompoundType start='({' contains=pikeString,pikeCompoundType,pikeNumber,pikeFloat end='})'
37 syn region pikeCompoundType start='(\[' contains=pikeString,pikeCompoundType,pikeNumber,pikeFloat end='\])'
38 syn region pikeCompoundType start='(<' contains=pikeString,pikeCompoundType,pikeNumber,pikeFloat end='>)'
40 "catch errors caused by wrong parenthesis
41 syn region pikeParen transparent start='([^{[<(]' end=')' contains=ALLBUT,pikeParenError,pikeIncluded,pikeSpecial,pikeTodo,pikeUserLabel,pikeBitField
42 syn match pikeParenError ")"
43 syn match pikeInParen contained "[^(][{}][^)]"
45 "integer number, or floating point number without a dot and with "f".
47 syn match pikeNumber "\<\d\+\(u\=l\=\|lu\|f\)\>"
48 "floating point number, with dot, optional exponent
49 syn match pikeFloat "\<\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\=\>"
50 "floating point number, starting with a dot, optional exponent
51 syn match pikeFloat "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
52 "floating point number, without dot, with exponent
53 syn match pikeFloat "\<\d\+e[-+]\=\d\+[fl]\=\>"
55 syn match pikeNumber "\<0x[0-9a-f]\+\(u\=l\=\|lu\)\>"
56 "syn match pikeIdentifier "\<[a-z_][a-z0-9_]*\>"
58 " flag an octal number with wrong digits
59 syn match pikeOctalError "\<0[0-7]*[89]"
61 if exists("c_comment_strings")
62 " A comment can contain pikeString, pikeCharacter and pikeNumber.
63 " But a "*/" inside a pikeString in a pikeComment DOES end the comment! So we
64 " need to use a special type of pikeString: pikeCommentString, which also ends on
65 " "*/", and sees a "*" at the start of the line as comment again.
66 " Unfortunately this doesn't very well work for // type of comments :-(
67 syntax match pikeCommentSkip contained "^\s*\*\($\|\s\+\)"
68 syntax region pikeCommentString contained start=+"+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=pikeSpecial,pikeCommentSkip
69 syntax region pikeComment2String contained start=+"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=pikeSpecial
70 syntax region pikeComment start="/\*" end="\*/" contains=pikeTodo,pikeCommentString,pikeCharacter,pikeNumber,pikeFloat
71 syntax match pikeComment "//.*" contains=pikeTodo,pikeComment2String,pikeCharacter,pikeNumber
72 syntax match pikeComment "#\!.*" contains=pikeTodo,pikeComment2String,pikeCharacter,pikeNumber
74 syn region pikeComment start="/\*" end="\*/" contains=pikeTodo
75 syn match pikeComment "//.*" contains=pikeTodo
76 syn match pikeComment "#!.*" contains=pikeTodo
78 syntax match pikeCommentError "\*/"
80 syn keyword pikeOperator sizeof
81 syn keyword pikeType int string void float mapping array multiset mixed
82 syn keyword pikeType program object function
84 syn region pikePreCondit start="^\s*#\s*\(if\>\|ifdef\>\|ifndef\>\|elif\>\|else\>\|endif\>\)" skip="\\$" end="$" contains=pikeComment,pikeString,pikeCharacter,pikeNumber,pikeCommentError
85 syn region pikeIncluded contained start=+"+ skip=+\\\\\|\\"+ end=+"+
86 syn match pikeIncluded contained "<[^>]*>"
87 syn match pikeInclude "^\s*#\s*include\>\s*["<]" contains=pikeIncluded
88 "syn match pikeLineSkip "\\$"
89 syn region pikeDefine start="^\s*#\s*\(define\>\|undef\>\)" skip="\\$" end="$" contains=ALLBUT,pikePreCondit,pikeIncluded,pikeInclude,pikeDefine,pikeInParen
90 syn region pikePreProc start="^\s*#\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" contains=ALLBUT,pikePreCondit,pikeIncluded,pikeInclude,pikeDefine,pikeInParen
92 " Highlight User Labels
93 syn region pikeMulti transparent start='?' end=':' contains=ALLBUT,pikeIncluded,pikeSpecial,pikeTodo,pikeUserLabel,pikeBitField
94 " Avoid matching foo::bar() in C++ by requiring that the next char is not ':'
95 syn match pikeUserLabel "^\s*\I\i*\s*:$"
96 syn match pikeUserLabel ";\s*\I\i*\s*:$"ms=s+1
97 syn match pikeUserLabel "^\s*\I\i*\s*:[^:]"me=e-1
98 syn match pikeUserLabel ";\s*\I\i*\s*:[^:]"ms=s+1,me=e-1
100 " Avoid recognizing most bitfields as labels
101 syn match pikeBitField "^\s*\I\i*\s*:\s*[1-9]"me=e-1
102 syn match pikeBitField ";\s*\I\i*\s*:\s*[1-9]"me=e-1
104 syn sync ccomment pikeComment minlines=10
106 " Define the default highlighting.
107 " For version 5.7 and earlier: only when not done already
108 " For version 5.8 and later: only when an item doesn't have highlighting yet
109 if version >= 508 || !exists("did_pike_syntax_inits")
111 let did_pike_syntax_inits = 1
112 command -nargs=+ HiLink hi link <args>
114 command -nargs=+ HiLink hi def link <args>
117 HiLink pikeLabel Label
118 HiLink pikeUserLabel Label
119 HiLink pikeConditional Conditional
120 HiLink pikeRepeat Repeat
121 HiLink pikeCharacter Character
122 HiLink pikeSpecialCharacter pikeSpecial
123 HiLink pikeNumber Number
124 HiLink pikeFloat Float
125 HiLink pikeOctalError pikeError
126 HiLink pikeParenError pikeError
127 HiLink pikeInParen pikeError
128 HiLink pikeCommentError pikeError
129 HiLink pikeOperator Operator
130 HiLink pikeInclude Include
131 HiLink pikePreProc PreProc
132 HiLink pikeDefine Macro
133 HiLink pikeIncluded pikeString
134 HiLink pikeError Error
135 HiLink pikeStatement Statement
136 HiLink pikePreCondit PreCondit
138 HiLink pikeCommentError pikeError
139 HiLink pikeCommentString pikeString
140 HiLink pikeComment2String pikeString
141 HiLink pikeCommentSkip pikeComment
142 HiLink pikeString String
143 HiLink pikeComment Comment
144 HiLink pikeSpecial SpecialChar
146 HiLink pikeException pikeStatement
147 HiLink pikeCompoundType Constant
148 "HiLink pikeIdentifier Identifier
153 let b:current_syntax = "pike"