xref: /vim-8.2.3635/runtime/syntax/ocaml.vim (revision dfccaf0f)
1" Vim syntax file
2" Language:     OCaml
3" Filenames:    *.ml *.mli *.mll *.mly
4" Maintainers:  Markus Mottl      <[email protected]>
5"               Karl-Heinz Sylla  <[email protected]>
6"               Issac Trotts      <[email protected]>
7" URL:          http://www.oefai.at/~markus/vim/syntax/ocaml.vim
8" Last Change:  2004 Jul 26
9"               2003 Jan 19 - Added keyword "require" for scripting (MM)
10"               2002 Oct 30 - New variable "ocaml_revised" (MM)
11
12" For version 5.x: Clear all syntax items
13" For version 6.x: Quit when a syntax file was already loaded
14if version < 600
15  syntax clear
16elseif exists("b:current_syntax")
17  finish
18endif
19
20" OCaml is case sensitive.
21syn case match
22
23" Script headers highlighted like comments
24syn match    ocamlComment   "^#!.*"
25
26" Scripting directives
27syn match    ocamlScript "^#\<\(quit\|labels\|warnings\|directory\|cd\|load\|use\|install_printer\|remove_printer\|require\|trace\|untrace\|untrace_all\|print_depth\|print_length\)\>"
28
29" lowercase identifier - the standard way to match
30syn match    ocamlLCIdentifier /\<\(\l\|_\)\(\w\|'\)*\>/
31
32syn match    ocamlKeyChar    "|"
33
34" Errors
35syn match    ocamlBraceErr   "}"
36syn match    ocamlBrackErr   "\]"
37syn match    ocamlParenErr   ")"
38syn match    ocamlArrErr     "|]"
39
40syn match    ocamlCommentErr "\*)"
41
42syn match    ocamlCountErr   "\<downto\>"
43syn match    ocamlCountErr   "\<to\>"
44
45if !exists("ocaml_revised")
46  syn match    ocamlDoErr      "\<do\>"
47endif
48
49syn match    ocamlDoneErr    "\<done\>"
50syn match    ocamlThenErr    "\<then\>"
51
52" Error-highlighting of "end" without synchronization:
53" as keyword or as error (default)
54if exists("ocaml_noend_error")
55  syn match    ocamlKeyword    "\<end\>"
56else
57  syn match    ocamlEndErr     "\<end\>"
58endif
59
60" Some convenient clusters
61syn cluster  ocamlAllErrs contains=ocamlBraceErr,ocamlBrackErr,ocamlParenErr,ocamlCommentErr,ocamlCountErr,ocamlDoErr,ocamlDoneErr,ocamlEndErr,ocamlThenErr
62
63syn cluster  ocamlAENoParen contains=ocamlBraceErr,ocamlBrackErr,ocamlCommentErr,ocamlCountErr,ocamlDoErr,ocamlDoneErr,ocamlEndErr,ocamlThenErr
64
65syn cluster  ocamlContained contains=ocamlTodo,ocamlPreDef,ocamlModParam,ocamlModParam1,ocamlPreMPRestr,ocamlMPRestr,ocamlMPRestr1,ocamlMPRestr2,ocamlMPRestr3,ocamlModRHS,ocamlFuncWith,ocamlFuncStruct,ocamlModTypeRestr,ocamlModTRWith,ocamlWith,ocamlWithRest,ocamlModType,ocamlFullMod
66
67
68" Enclosing delimiters
69syn region   ocamlEncl transparent matchgroup=ocamlKeyword start="(" matchgroup=ocamlKeyword end=")" contains=ALLBUT,@ocamlContained,ocamlParenErr
70syn region   ocamlEncl transparent matchgroup=ocamlKeyword start="{" matchgroup=ocamlKeyword end="}"  contains=ALLBUT,@ocamlContained,ocamlBraceErr
71syn region   ocamlEncl transparent matchgroup=ocamlKeyword start="\[" matchgroup=ocamlKeyword end="\]" contains=ALLBUT,@ocamlContained,ocamlBrackErr
72syn region   ocamlEncl transparent matchgroup=ocamlKeyword start="\[|" matchgroup=ocamlKeyword end="|\]" contains=ALLBUT,@ocamlContained,ocamlArrErr
73
74
75" Comments
76syn region   ocamlComment start="(\*" end="\*)" contains=ocamlComment,ocamlTodo
77syn keyword  ocamlTodo contained TODO FIXME XXX
78
79
80" Objects
81syn region   ocamlEnd matchgroup=ocamlKeyword start="\<object\>" matchgroup=ocamlKeyword end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr
82
83
84" Blocks
85if !exists("ocaml_revised")
86  syn region   ocamlEnd matchgroup=ocamlKeyword start="\<begin\>" matchgroup=ocamlKeyword end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr
87endif
88
89
90" "for"
91syn region   ocamlNone matchgroup=ocamlKeyword start="\<for\>" matchgroup=ocamlKeyword end="\<\(to\|downto\)\>" contains=ALLBUT,@ocamlContained,ocamlCountErr
92
93
94" "do"
95if !exists("ocaml_revised")
96  syn region   ocamlDo matchgroup=ocamlKeyword start="\<do\>" matchgroup=ocamlKeyword end="\<done\>" contains=ALLBUT,@ocamlContained,ocamlDoneErr
97endif
98
99" "if"
100syn region   ocamlNone matchgroup=ocamlKeyword start="\<if\>" matchgroup=ocamlKeyword end="\<then\>" contains=ALLBUT,@ocamlContained,ocamlThenErr
101
102
103"" Modules
104
105" "struct"
106syn region   ocamlStruct matchgroup=ocamlModule start="\<struct\>" matchgroup=ocamlModule end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr
107
108" "sig"
109syn region   ocamlSig matchgroup=ocamlModule start="\<sig\>" matchgroup=ocamlModule end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr,ocamlModule
110syn region   ocamlModSpec matchgroup=ocamlKeyword start="\<module\>" matchgroup=ocamlModule end="\<\u\(\w\|'\)*\>" contained contains=@ocamlAllErrs,ocamlComment skipwhite skipempty nextgroup=ocamlModTRWith,ocamlMPRestr
111
112" "open"
113syn region   ocamlNone matchgroup=ocamlKeyword start="\<open\>" matchgroup=ocamlModule end="\<\u\(\w\|'\)*\(\.\u\(\w\|'\)*\)*\>" contains=@ocamlAllErrs,ocamlComment
114
115" "include"
116syn match    ocamlKeyword "\<include\>" contained skipwhite skipempty nextgroup=ocamlModParam,ocamlFullMod
117
118" "module" - somewhat complicated stuff ;-)
119syn region   ocamlModule matchgroup=ocamlKeyword start="\<module\>" matchgroup=ocamlModule end="\<\u\(\w\|'\)*\>" contains=@ocamlAllErrs,ocamlComment skipwhite skipempty nextgroup=ocamlPreDef
120syn region   ocamlPreDef start="."me=e-1 matchgroup=ocamlKeyword end="\l\|="me=e-1 contained contains=@ocamlAllErrs,ocamlComment,ocamlModParam,ocamlModTypeRestr,ocamlModTRWith nextgroup=ocamlModPreRHS
121syn region   ocamlModParam start="([^*]" end=")" contained contains=@ocamlAENoParen,ocamlModParam1
122syn match    ocamlModParam1 "\<\u\(\w\|'\)*\>" contained skipwhite skipempty nextgroup=ocamlPreMPRestr
123
124syn region   ocamlPreMPRestr start="."me=e-1 end=")"me=e-1 contained contains=@ocamlAllErrs,ocamlComment,ocamlMPRestr,ocamlModTypeRestr
125
126syn region   ocamlMPRestr start=":" end="."me=e-1 contained contains=@ocamlComment skipwhite skipempty nextgroup=ocamlMPRestr1,ocamlMPRestr2,ocamlMPRestr3
127syn region   ocamlMPRestr1 matchgroup=ocamlModule start="\ssig\s\=" matchgroup=ocamlModule end="\<end\>" contained contains=ALLBUT,@ocamlContained,ocamlEndErr,ocamlModule
128syn region   ocamlMPRestr2 start="\sfunctor\(\s\|(\)\="me=e-1 matchgroup=ocamlKeyword end="->" contained contains=@ocamlAllErrs,ocamlComment,ocamlModParam skipwhite skipempty nextgroup=ocamlFuncWith,ocamlMPRestr2
129syn match    ocamlMPRestr3 "\w\(\w\|'\)*\(\.\w\(\w\|'\)*\)*" contained
130syn match    ocamlModPreRHS "=" contained skipwhite skipempty nextgroup=ocamlModParam,ocamlFullMod
131syn region   ocamlModRHS start="." end=".\w\|([^*]"me=e-2 contained contains=ocamlComment skipwhite skipempty nextgroup=ocamlModParam,ocamlFullMod
132syn match    ocamlFullMod "\<\u\(\w\|'\)*\(\.\u\(\w\|'\)*\)*" contained skipwhite skipempty nextgroup=ocamlFuncWith
133
134syn region   ocamlFuncWith start="([^*]"me=e-1 end=")" contained contains=ocamlComment,ocamlWith,ocamlFuncStruct skipwhite skipempty nextgroup=ocamlFuncWith
135syn region   ocamlFuncStruct matchgroup=ocamlModule start="[^a-zA-Z]struct\>"hs=s+1 matchgroup=ocamlModule end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr
136
137syn match    ocamlModTypeRestr "\<\w\(\w\|'\)*\(\.\w\(\w\|'\)*\)*\>" contained
138syn region   ocamlModTRWith start=":\s*("hs=s+1 end=")" contained contains=@ocamlAENoParen,ocamlWith
139syn match    ocamlWith "\<\(\u\(\w\|'\)*\.\)*\w\(\w\|'\)*\>" contained skipwhite skipempty nextgroup=ocamlWithRest
140syn region   ocamlWithRest start="[^)]" end=")"me=e-1 contained contains=ALLBUT,@ocamlContained
141
142" "module type"
143syn region   ocamlKeyword start="\<module\>\s*\<type\>" matchgroup=ocamlModule end="\<\w\(\w\|'\)*\>" contains=ocamlComment skipwhite skipempty nextgroup=ocamlMTDef
144syn match    ocamlMTDef "=\s*\w\(\w\|'\)*\>"hs=s+1,me=s
145
146syn keyword  ocamlKeyword  and as assert class
147syn keyword  ocamlKeyword  constraint else
148syn keyword  ocamlKeyword  exception external fun
149
150syn keyword  ocamlKeyword  in inherit initializer
151syn keyword  ocamlKeyword  land lazy let match
152syn keyword  ocamlKeyword  method mutable new of
153syn keyword  ocamlKeyword  parser private raise rec
154syn keyword  ocamlKeyword  try type
155syn keyword  ocamlKeyword  val virtual when while with
156
157if exists("ocaml_revised")
158  syn keyword  ocamlKeyword  do value
159  syn keyword  ocamlBoolean  True False
160else
161  syn keyword  ocamlKeyword  function
162  syn keyword  ocamlBoolean  true false
163  syn match    ocamlKeyChar  "!"
164endif
165
166syn keyword  ocamlType     array bool char exn float format format4 int
167syn keyword  ocamlType     list option string unit
168
169syn keyword  ocamlOperator asr lor lsl lsr lxor mod not
170
171syn match    ocamlConstructor  "(\s*)"
172syn match    ocamlConstructor  "\[\s*\]"
173syn match    ocamlConstructor  "\[|\s*>|]"
174syn match    ocamlConstructor  "\[<\s*>\]"
175syn match    ocamlConstructor  "\u\(\w\|'\)*\>"
176
177" Polymorphic variants
178syn match    ocamlConstructor  "`\w\(\w\|'\)*\>"
179
180" Module prefix
181syn match    ocamlModPath      "\u\(\w\|'\)*\."he=e-1
182
183syn match    ocamlCharacter    "'\\\d\d\d'\|'\\[\'ntbr]'\|'.'"
184syn match    ocamlCharErr      "'\\\d\d'\|'\\\d'"
185syn match    ocamlCharErr      "'\\[^\'ntbr]'"
186syn region   ocamlString       start=+"+ skip=+\\\\\|\\"+ end=+"+
187
188syn match    ocamlFunDef       "->"
189syn match    ocamlRefAssign    ":="
190syn match    ocamlTopStop      ";;"
191syn match    ocamlOperator     "\^"
192syn match    ocamlOperator     "::"
193
194syn match    ocamlOperator     "&&"
195syn match    ocamlOperator     "<"
196syn match    ocamlOperator     ">"
197syn match    ocamlAnyVar       "\<_\>"
198syn match    ocamlKeyChar      "|[^\]]"me=e-1
199syn match    ocamlKeyChar      ";"
200syn match    ocamlKeyChar      "\~"
201syn match    ocamlKeyChar      "?"
202syn match    ocamlKeyChar      "\*"
203syn match    ocamlKeyChar      "="
204
205if exists("ocaml_revised")
206  syn match    ocamlErr		"<-"
207else
208  syn match    ocamlOperator	"<-"
209endif
210
211syn match    ocamlNumber	"\<-\=\d\+\>"
212syn match    ocamlNumber	"\<-\=0[x|X]\x\+\>"
213syn match    ocamlNumber	"\<-\=0[o|O]\o\+\>"
214syn match    ocamlNumber	"\<-\=0[b|B][01]\+\>"
215syn match    ocamlFloat		"\<-\=\d\+\.\d*\([eE][-+]\=\d\+\)\=[fl]\=\>"
216
217" Labels
218syn match    ocamlLabel		"\~\(\l\|_\)\(\w\|'\)*"lc=1
219syn match    ocamlLabel		"?\(\l\|_\)\(\w\|'\)*"lc=1
220syn region   ocamlLabel transparent matchgroup=ocamlLabel start="?(\(\l\|_\)\(\w\|'\)*"lc=2 end=")"me=e-1 contains=ALLBUT,@ocamlContained,ocamlParenErr
221
222
223" Synchronization
224syn sync minlines=50
225syn sync maxlines=500
226
227if !exists("ocaml_revised")
228  syn sync match ocamlDoSync      grouphere  ocamlDo      "\<do\>"
229  syn sync match ocamlDoSync      groupthere ocamlDo      "\<done\>"
230endif
231
232if exists("ocaml_revised")
233  syn sync match ocamlEndSync     grouphere  ocamlEnd     "\<\(object\)\>"
234else
235  syn sync match ocamlEndSync     grouphere  ocamlEnd     "\<\(begin\|object\)\>"
236endif
237
238syn sync match ocamlEndSync     groupthere ocamlEnd     "\<end\>"
239syn sync match ocamlStructSync  grouphere  ocamlStruct  "\<struct\>"
240syn sync match ocamlStructSync  groupthere ocamlStruct  "\<end\>"
241syn sync match ocamlSigSync     grouphere  ocamlSig     "\<sig\>"
242syn sync match ocamlSigSync     groupthere ocamlSig     "\<end\>"
243
244" Define the default highlighting.
245" For version 5.7 and earlier: only when not done already
246" For version 5.8 and later: only when an item doesn't have highlighting yet
247if version >= 508 || !exists("did_ocaml_syntax_inits")
248  if version < 508
249    let did_ocaml_syntax_inits = 1
250    command -nargs=+ HiLink hi link <args>
251  else
252    command -nargs=+ HiLink hi def link <args>
253  endif
254
255  HiLink ocamlBraceErr	   Error
256  HiLink ocamlBrackErr	   Error
257  HiLink ocamlParenErr	   Error
258  HiLink ocamlArrErr	   Error
259
260  HiLink ocamlCommentErr   Error
261
262  HiLink ocamlCountErr	   Error
263  HiLink ocamlDoErr	   Error
264  HiLink ocamlDoneErr	   Error
265  HiLink ocamlEndErr	   Error
266  HiLink ocamlThenErr	   Error
267
268  HiLink ocamlCharErr	   Error
269
270  HiLink ocamlErr	   Error
271
272  HiLink ocamlComment	   Comment
273
274  HiLink ocamlModPath	   Include
275  HiLink ocamlModule	   Include
276  HiLink ocamlModParam1    Include
277  HiLink ocamlModType	   Include
278  HiLink ocamlMPRestr3	   Include
279  HiLink ocamlFullMod	   Include
280  HiLink ocamlModTypeRestr Include
281  HiLink ocamlWith	   Include
282  HiLink ocamlMTDef	   Include
283
284  HiLink ocamlScript	   Include
285
286  HiLink ocamlConstructor  Constant
287
288  HiLink ocamlModPreRHS    Keyword
289  HiLink ocamlMPRestr2	   Keyword
290  HiLink ocamlKeyword	   Keyword
291  HiLink ocamlFunDef	   Keyword
292  HiLink ocamlRefAssign    Keyword
293  HiLink ocamlKeyChar	   Keyword
294  HiLink ocamlAnyVar	   Keyword
295  HiLink ocamlTopStop	   Keyword
296  HiLink ocamlOperator	   Keyword
297
298  HiLink ocamlBoolean	   Boolean
299  HiLink ocamlCharacter    Character
300  HiLink ocamlNumber	   Number
301  HiLink ocamlFloat	   Float
302  HiLink ocamlString	   String
303
304  HiLink ocamlLabel	   Identifier
305
306  HiLink ocamlType	   Type
307
308  HiLink ocamlTodo	   Todo
309
310  HiLink ocamlEncl	   Keyword
311
312  delcommand HiLink
313endif
314
315let b:current_syntax = "ocaml"
316
317" vim: ts=8
318