xref: /vim-8.2.3635/runtime/syntax/ocaml.vim (revision 7e6a515e)
1071d4279SBram Moolenaar" Vim syntax file
2071d4279SBram Moolenaar" Language:     OCaml
3071d4279SBram Moolenaar" Filenames:    *.ml *.mli *.mll *.mly
4202795beSBram Moolenaar" Maintainers:  Markus Mottl      <[email protected]>
5071d4279SBram Moolenaar"               Karl-Heinz Sylla  <[email protected]>
65eb86f91SBram Moolenaar"               Issac Trotts      <[email protected]>
7*7e6a515eSBram Moolenaar" URL:          https://github.com/ocaml/vim-ocaml
8773a97c2SBram Moolenaar" Last Change:
9773a97c2SBram Moolenaar"               2018 Nov 08 - Improved highlighting of operators (Maëlan)
10773a97c2SBram Moolenaar"               2018 Apr 22 - Improved support for PPX (Andrey Popp)
11773a97c2SBram Moolenaar"               2018 Mar 16 - Remove raise, lnot and not from keywords (Étienne Millon, "copy")
12773a97c2SBram Moolenaar"               2017 Apr 11 - Improved matching of negative numbers (MM)
13773a97c2SBram Moolenaar"               2016 Mar 11 - Improved support for quoted strings (Glen Mével)
14773a97c2SBram Moolenaar"               2015 Aug 13 - Allow apostrophes in identifiers (Jonathan Chan, Einar Lielmanis)
15773a97c2SBram Moolenaar"               2015 Jun 17 - Added new "nonrec" keyword (MM)
16202795beSBram Moolenaar
17202795beSBram Moolenaar" A minor patch was applied to the official version so that object/end
18202795beSBram Moolenaar" can be distinguished from begin/end, which is used for indentation,
19202795beSBram Moolenaar" and folding. (David Baelde)
20071d4279SBram Moolenaar
21*7e6a515eSBram Moolenaar" Quit when a syntax file was already loaded
2289bcfda6SBram Moolenaarif exists("b:current_syntax") && b:current_syntax == "ocaml"
23071d4279SBram Moolenaar  finish
24071d4279SBram Moolenaarendif
25071d4279SBram Moolenaar
26*7e6a515eSBram Moolenaarlet s:keepcpo = &cpo
27*7e6a515eSBram Moolenaarset cpo&vim
28*7e6a515eSBram Moolenaar
29773a97c2SBram Moolenaar" ' can be used in OCaml identifiers
30773a97c2SBram Moolenaarsetlocal iskeyword+='
31773a97c2SBram Moolenaar
32*7e6a515eSBram Moolenaar" ` is part of the name of polymorphic variants
33*7e6a515eSBram Moolenaarsetlocal iskeyword+=`
34*7e6a515eSBram Moolenaar
35071d4279SBram Moolenaar" OCaml is case sensitive.
36071d4279SBram Moolenaarsyn case match
37071d4279SBram Moolenaar
3820f90cf9SBram Moolenaar" Access to the method of an object
3920f90cf9SBram Moolenaarsyn match    ocamlMethod       "#"
4020f90cf9SBram Moolenaar
41071d4279SBram Moolenaar" Script headers highlighted like comments
4216ea3676SBram Moolenaarsyn match    ocamlComment   "^#!.*" contains=@Spell
43071d4279SBram Moolenaar
44071d4279SBram Moolenaar" Scripting directives
45773a97c2SBram Moolenaarsyn match    ocamlScript "^#\<\(quit\|labels\|warnings\|warn_error\|directory\|remove_directory\|cd\|load\|load_rec\|use\|mod_use\|install_printer\|remove_printer\|require\|list\|ppx\|principal\|predicates\|rectypes\|thread\|trace\|untrace\|untrace_all\|print_depth\|print_length\|camlp4o\|camlp4r\|topfind_log\|topfind_verbose\)\>"
469964e468SBram Moolenaar
47071d4279SBram Moolenaar" lowercase identifier - the standard way to match
48071d4279SBram Moolenaarsyn match    ocamlLCIdentifier /\<\(\l\|_\)\(\w\|'\)*\>/
49071d4279SBram Moolenaar
50071d4279SBram Moolenaarsyn match    ocamlKeyChar    "|"
51071d4279SBram Moolenaar
52071d4279SBram Moolenaar" Errors
53071d4279SBram Moolenaarsyn match    ocamlBraceErr   "}"
54071d4279SBram Moolenaarsyn match    ocamlBrackErr   "\]"
55071d4279SBram Moolenaarsyn match    ocamlParenErr   ")"
56071d4279SBram Moolenaarsyn match    ocamlArrErr     "|]"
57071d4279SBram Moolenaar
58071d4279SBram Moolenaarsyn match    ocamlCommentErr "\*)"
59071d4279SBram Moolenaar
60071d4279SBram Moolenaarsyn match    ocamlCountErr   "\<downto\>"
61071d4279SBram Moolenaarsyn match    ocamlCountErr   "\<to\>"
62071d4279SBram Moolenaar
63071d4279SBram Moolenaarif !exists("ocaml_revised")
64071d4279SBram Moolenaar  syn match    ocamlDoErr      "\<do\>"
65071d4279SBram Moolenaarendif
66071d4279SBram Moolenaar
67071d4279SBram Moolenaarsyn match    ocamlDoneErr    "\<done\>"
68071d4279SBram Moolenaarsyn match    ocamlThenErr    "\<then\>"
69071d4279SBram Moolenaar
70071d4279SBram Moolenaar" Error-highlighting of "end" without synchronization:
71071d4279SBram Moolenaar" as keyword or as error (default)
72071d4279SBram Moolenaarif exists("ocaml_noend_error")
73071d4279SBram Moolenaar  syn match    ocamlKeyword    "\<end\>"
74071d4279SBram Moolenaarelse
75071d4279SBram Moolenaar  syn match    ocamlEndErr     "\<end\>"
76071d4279SBram Moolenaarendif
77071d4279SBram Moolenaar
78071d4279SBram Moolenaar" Some convenient clusters
79071d4279SBram Moolenaarsyn cluster  ocamlAllErrs contains=ocamlBraceErr,ocamlBrackErr,ocamlParenErr,ocamlCommentErr,ocamlCountErr,ocamlDoErr,ocamlDoneErr,ocamlEndErr,ocamlThenErr
80071d4279SBram Moolenaar
81071d4279SBram Moolenaarsyn cluster  ocamlAENoParen contains=ocamlBraceErr,ocamlBrackErr,ocamlCommentErr,ocamlCountErr,ocamlDoErr,ocamlDoneErr,ocamlEndErr,ocamlThenErr
82071d4279SBram Moolenaar
83773a97c2SBram Moolenaarsyn cluster  ocamlContained contains=ocamlTodo,ocamlPreDef,ocamlModParam,ocamlModParam1,ocamlMPRestr,ocamlMPRestr1,ocamlMPRestr2,ocamlMPRestr3,ocamlModRHS,ocamlFuncWith,ocamlFuncStruct,ocamlModTypeRestr,ocamlModTRWith,ocamlWith,ocamlWithRest,ocamlModType,ocamlFullMod,ocamlVal
84071d4279SBram Moolenaar
85071d4279SBram Moolenaar
86071d4279SBram Moolenaar" Enclosing delimiters
87071d4279SBram Moolenaarsyn region   ocamlEncl transparent matchgroup=ocamlKeyword start="(" matchgroup=ocamlKeyword end=")" contains=ALLBUT,@ocamlContained,ocamlParenErr
88071d4279SBram Moolenaarsyn region   ocamlEncl transparent matchgroup=ocamlKeyword start="{" matchgroup=ocamlKeyword end="}"  contains=ALLBUT,@ocamlContained,ocamlBraceErr
89071d4279SBram Moolenaarsyn region   ocamlEncl transparent matchgroup=ocamlKeyword start="\[" matchgroup=ocamlKeyword end="\]" contains=ALLBUT,@ocamlContained,ocamlBrackErr
90071d4279SBram Moolenaarsyn region   ocamlEncl transparent matchgroup=ocamlKeyword start="\[|" matchgroup=ocamlKeyword end="|\]" contains=ALLBUT,@ocamlContained,ocamlArrErr
91071d4279SBram Moolenaar
92071d4279SBram Moolenaar
93071d4279SBram Moolenaar" Comments
9416ea3676SBram Moolenaarsyn region   ocamlComment start="(\*" end="\*)" contains=@Spell,ocamlComment,ocamlTodo
95202795beSBram Moolenaarsyn keyword  ocamlTodo contained TODO FIXME XXX NOTE
96071d4279SBram Moolenaar
97071d4279SBram Moolenaar
98071d4279SBram Moolenaar" Objects
99202795beSBram Moolenaarsyn region   ocamlEnd matchgroup=ocamlObject start="\<object\>" matchgroup=ocamlObject end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr
100071d4279SBram Moolenaar
101071d4279SBram Moolenaar
102071d4279SBram Moolenaar" Blocks
103071d4279SBram Moolenaarif !exists("ocaml_revised")
104071d4279SBram Moolenaar  syn region   ocamlEnd matchgroup=ocamlKeyword start="\<begin\>" matchgroup=ocamlKeyword end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr
105071d4279SBram Moolenaarendif
106071d4279SBram Moolenaar
107071d4279SBram Moolenaar
108071d4279SBram Moolenaar" "for"
109071d4279SBram Moolenaarsyn region   ocamlNone matchgroup=ocamlKeyword start="\<for\>" matchgroup=ocamlKeyword end="\<\(to\|downto\)\>" contains=ALLBUT,@ocamlContained,ocamlCountErr
110071d4279SBram Moolenaar
111071d4279SBram Moolenaar
112071d4279SBram Moolenaar" "do"
113071d4279SBram Moolenaarif !exists("ocaml_revised")
114071d4279SBram Moolenaar  syn region   ocamlDo matchgroup=ocamlKeyword start="\<do\>" matchgroup=ocamlKeyword end="\<done\>" contains=ALLBUT,@ocamlContained,ocamlDoneErr
115071d4279SBram Moolenaarendif
116071d4279SBram Moolenaar
117071d4279SBram Moolenaar" "if"
118071d4279SBram Moolenaarsyn region   ocamlNone matchgroup=ocamlKeyword start="\<if\>" matchgroup=ocamlKeyword end="\<then\>" contains=ALLBUT,@ocamlContained,ocamlThenErr
119071d4279SBram Moolenaar
120773a97c2SBram Moolenaar"" PPX nodes
121773a97c2SBram Moolenaar
122773a97c2SBram Moolenaarsyn match ocamlPpxIdentifier /\(\[@\{1,3\}\)\@<=\w\+\(\.\w\+\)*/
123773a97c2SBram Moolenaarsyn region ocamlPpx matchgroup=ocamlPpxEncl start="\[@\{1,3\}" contains=TOP end="\]"
124071d4279SBram Moolenaar
125071d4279SBram Moolenaar"" Modules
126071d4279SBram Moolenaar
127071d4279SBram Moolenaar" "sig"
128773a97c2SBram Moolenaarsyn region   ocamlSig matchgroup=ocamlSigEncl start="\<sig\>" matchgroup=ocamlSigEncl end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr,ocamlModule
129071d4279SBram Moolenaarsyn region   ocamlModSpec matchgroup=ocamlKeyword start="\<module\>" matchgroup=ocamlModule end="\<\u\(\w\|'\)*\>" contained contains=@ocamlAllErrs,ocamlComment skipwhite skipempty nextgroup=ocamlModTRWith,ocamlMPRestr
130071d4279SBram Moolenaar
131071d4279SBram Moolenaar" "open"
132*7e6a515eSBram Moolenaarsyn match   ocamlKeyword "\<open\>" skipwhite skipempty nextgroup=ocamlFullMod
133071d4279SBram Moolenaar
134071d4279SBram Moolenaar" "include"
135202795beSBram Moolenaarsyn match    ocamlKeyword "\<include\>" skipwhite skipempty nextgroup=ocamlModParam,ocamlFullMod
136071d4279SBram Moolenaar
137071d4279SBram Moolenaar" "module" - somewhat complicated stuff ;-)
138071d4279SBram Moolenaarsyn region   ocamlModule matchgroup=ocamlKeyword start="\<module\>" matchgroup=ocamlModule end="\<\u\(\w\|'\)*\>" contains=@ocamlAllErrs,ocamlComment skipwhite skipempty nextgroup=ocamlPreDef
139773a97c2SBram Moolenaarsyn region   ocamlPreDef start="."me=e-1 matchgroup=ocamlKeyword end="\l\|=\|)"me=e-1 contained contains=@ocamlAllErrs,ocamlComment,ocamlModParam,ocamlGenMod,ocamlModTypeRestr,ocamlModTRWith nextgroup=ocamlModPreRHS
140773a97c2SBram Moolenaarsyn region   ocamlModParam start="([^*]" end=")" contained contains=ocamlGenMod,ocamlModParam1,ocamlSig,ocamlVal
141773a97c2SBram Moolenaarsyn match    ocamlModParam1 "\<\u\(\w\|'\)*\>" contained skipwhite skipempty
142773a97c2SBram Moolenaarsyn match    ocamlGenMod "()" contained skipwhite skipempty
143071d4279SBram Moolenaar
144071d4279SBram Moolenaarsyn region   ocamlMPRestr start=":" end="."me=e-1 contained contains=@ocamlComment skipwhite skipempty nextgroup=ocamlMPRestr1,ocamlMPRestr2,ocamlMPRestr3
145773a97c2SBram Moolenaarsyn region   ocamlMPRestr1 matchgroup=ocamlSigEncl start="\ssig\s\=" matchgroup=ocamlSigEncl end="\<end\>" contained contains=ALLBUT,@ocamlContained,ocamlEndErr,ocamlModule
146773a97c2SBram Moolenaarsyn region   ocamlMPRestr2 start="\sfunctor\(\s\|(\)\="me=e-1 matchgroup=ocamlKeyword end="->" contained contains=@ocamlAllErrs,ocamlComment,ocamlModParam,ocamlGenMod skipwhite skipempty nextgroup=ocamlFuncWith,ocamlMPRestr2
14716ea3676SBram Moolenaarsyn match    ocamlMPRestr3 "\w\(\w\|'\)*\( *\. *\w\(\w\|'\)*\)*" contained
148071d4279SBram Moolenaarsyn match    ocamlModPreRHS "=" contained skipwhite skipempty nextgroup=ocamlModParam,ocamlFullMod
14920f90cf9SBram Moolenaarsyn keyword  ocamlKeyword val
15016ea3676SBram Moolenaarsyn region   ocamlVal matchgroup=ocamlKeyword start="\<val\>" matchgroup=ocamlLCIdentifier end="\<\l\(\w\|'\)*\>" contains=@ocamlAllErrs,ocamlComment,ocamlFullMod skipwhite skipempty nextgroup=ocamlMPRestr
15116ea3676SBram Moolenaarsyn region   ocamlModRHS start="." end=". *\w\|([^*]"me=e-2 contained contains=ocamlComment skipwhite skipempty nextgroup=ocamlModParam,ocamlFullMod
15216ea3676SBram Moolenaarsyn match    ocamlFullMod "\<\u\(\w\|'\)*\( *\. *\u\(\w\|'\)*\)*" contained skipwhite skipempty nextgroup=ocamlFuncWith
153071d4279SBram Moolenaar
154773a97c2SBram Moolenaarsyn region   ocamlFuncWith start="([^*)]"me=e-1 end=")" contained contains=ocamlComment,ocamlWith,ocamlFuncStruct skipwhite skipempty nextgroup=ocamlFuncWith
155773a97c2SBram Moolenaarsyn region   ocamlFuncStruct matchgroup=ocamlStructEncl start="[^a-zA-Z]struct\>"hs=s+1 matchgroup=ocamlStructEncl end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr
156071d4279SBram Moolenaar
15716ea3676SBram Moolenaarsyn match    ocamlModTypeRestr "\<\w\(\w\|'\)*\( *\. *\w\(\w\|'\)*\)*\>" contained
158071d4279SBram Moolenaarsyn region   ocamlModTRWith start=":\s*("hs=s+1 end=")" contained contains=@ocamlAENoParen,ocamlWith
15916ea3676SBram Moolenaarsyn match    ocamlWith "\<\(\u\(\w\|'\)* *\. *\)*\w\(\w\|'\)*\>" contained skipwhite skipempty nextgroup=ocamlWithRest
160071d4279SBram Moolenaarsyn region   ocamlWithRest start="[^)]" end=")"me=e-1 contained contains=ALLBUT,@ocamlContained
161071d4279SBram Moolenaar
16220f90cf9SBram Moolenaar" "struct"
163773a97c2SBram Moolenaarsyn region   ocamlStruct matchgroup=ocamlStructEncl start="\<\(module\s\+\)\=struct\>" matchgroup=ocamlStructEncl end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr
16420f90cf9SBram Moolenaar
165071d4279SBram Moolenaar" "module type"
16620f90cf9SBram Moolenaarsyn region   ocamlKeyword start="\<module\>\s*\<type\>\(\s*\<of\>\)\=" matchgroup=ocamlModule end="\<\w\(\w\|'\)*\>" contains=ocamlComment skipwhite skipempty nextgroup=ocamlMTDef
16716ea3676SBram Moolenaarsyn match    ocamlMTDef "=\s*\w\(\w\|'\)*\>"hs=s+1,me=s+1 skipwhite skipempty nextgroup=ocamlFullMod
168071d4279SBram Moolenaar
169773a97c2SBram Moolenaar" Quoted strings
170773a97c2SBram Moolenaarsyn region ocamlString matchgroup=ocamlQuotedStringDelim start="{\z\([a-z_]*\)|" end="|\z1}" contains=@Spell
171773a97c2SBram Moolenaar
172071d4279SBram Moolenaarsyn keyword  ocamlKeyword  and as assert class
173071d4279SBram Moolenaarsyn keyword  ocamlKeyword  constraint else
174071d4279SBram Moolenaarsyn keyword  ocamlKeyword  exception external fun
175071d4279SBram Moolenaar
176071d4279SBram Moolenaarsyn keyword  ocamlKeyword  in inherit initializer
177773a97c2SBram Moolenaarsyn keyword  ocamlKeyword  lazy let match
178773a97c2SBram Moolenaarsyn keyword  ocamlKeyword  method mutable new nonrec of
179773a97c2SBram Moolenaarsyn keyword  ocamlKeyword  parser private rec
180071d4279SBram Moolenaarsyn keyword  ocamlKeyword  try type
18120f90cf9SBram Moolenaarsyn keyword  ocamlKeyword  virtual when while with
182071d4279SBram Moolenaar
183071d4279SBram Moolenaarif exists("ocaml_revised")
184071d4279SBram Moolenaar  syn keyword  ocamlKeyword  do value
185071d4279SBram Moolenaar  syn keyword  ocamlBoolean  True False
186071d4279SBram Moolenaarelse
187071d4279SBram Moolenaar  syn keyword  ocamlKeyword  function
188071d4279SBram Moolenaar  syn keyword  ocamlBoolean  true false
189071d4279SBram Moolenaarendif
190071d4279SBram Moolenaar
191202795beSBram Moolenaarsyn keyword  ocamlType     array bool char exn float format format4
192202795beSBram Moolenaarsyn keyword  ocamlType     int int32 int64 lazy_t list nativeint option
193773a97c2SBram Moolenaarsyn keyword  ocamlType     bytes string unit
194071d4279SBram Moolenaar
195071d4279SBram Moolenaarsyn match    ocamlConstructor  "(\s*)"
196071d4279SBram Moolenaarsyn match    ocamlConstructor  "\[\s*\]"
197071d4279SBram Moolenaarsyn match    ocamlConstructor  "\[|\s*>|]"
198071d4279SBram Moolenaarsyn match    ocamlConstructor  "\[<\s*>\]"
199071d4279SBram Moolenaarsyn match    ocamlConstructor  "\u\(\w\|'\)*\>"
200071d4279SBram Moolenaar
201071d4279SBram Moolenaar" Polymorphic variants
202071d4279SBram Moolenaarsyn match    ocamlConstructor  "`\w\(\w\|'\)*\>"
203071d4279SBram Moolenaar
204071d4279SBram Moolenaar" Module prefix
20516ea3676SBram Moolenaarsyn match    ocamlModPath      "\u\(\w\|'\)* *\."he=e-1
206071d4279SBram Moolenaar
207071d4279SBram Moolenaarsyn match    ocamlCharacter    "'\\\d\d\d'\|'\\[\'ntbr]'\|'.'"
20820f90cf9SBram Moolenaarsyn match    ocamlCharacter    "'\\x\x\x'"
209071d4279SBram Moolenaarsyn match    ocamlCharErr      "'\\\d\d'\|'\\\d'"
210071d4279SBram Moolenaarsyn match    ocamlCharErr      "'\\[^\'ntbr]'"
21116ea3676SBram Moolenaarsyn region   ocamlString       start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@Spell
212071d4279SBram Moolenaar
213071d4279SBram Moolenaarsyn match    ocamlTopStop      ";;"
214071d4279SBram Moolenaar
215071d4279SBram Moolenaarsyn match    ocamlAnyVar       "\<_\>"
216071d4279SBram Moolenaarsyn match    ocamlKeyChar      "|[^\]]"me=e-1
217071d4279SBram Moolenaarsyn match    ocamlKeyChar      ";"
218071d4279SBram Moolenaarsyn match    ocamlKeyChar      "\~"
219071d4279SBram Moolenaarsyn match    ocamlKeyChar      "?"
220071d4279SBram Moolenaar
221773a97c2SBram Moolenaar"" Operators
222773a97c2SBram Moolenaar
223773a97c2SBram Moolenaar" The grammar of operators is found there:
224773a97c2SBram Moolenaar"     https://caml.inria.fr/pub/docs/manual-ocaml/names.html#operator-name
225773a97c2SBram Moolenaar"     https://caml.inria.fr/pub/docs/manual-ocaml/extn.html#s:ext-ops
226773a97c2SBram Moolenaar"     https://caml.inria.fr/pub/docs/manual-ocaml/extn.html#s:index-operators
227773a97c2SBram Moolenaar" =, *, < and > are both operator names and keywords, we let the user choose how
228773a97c2SBram Moolenaar" to display them (has to be declared before regular infix operators):
229773a97c2SBram Moolenaarsyn match    ocamlEqual        "="
230773a97c2SBram Moolenaarsyn match    ocamlStar         "*"
231773a97c2SBram Moolenaarsyn match    ocamlAngle        "<"
232773a97c2SBram Moolenaarsyn match    ocamlAngle        ">"
233773a97c2SBram Moolenaar" Custom indexing operators:
234*7e6a515eSBram Moolenaarsyn region   ocamlIndexing matchgroup=ocamlIndexingOp
235*7e6a515eSBram Moolenaar  \ start="\.[~?!:|&$%=>@^/*+-][~?!.:|&$%<=>@^*/+-]*\_s*("
236*7e6a515eSBram Moolenaar  \ end=")\(\_s*<-\)\?"
237*7e6a515eSBram Moolenaar  \ contains=ALLBUT,@ocamlContained,ocamlParenErr
238*7e6a515eSBram Moolenaarsyn region   ocamlIndexing matchgroup=ocamlIndexingOp
239*7e6a515eSBram Moolenaar  \ start="\.[~?!:|&$%=>@^/*+-][~?!.:|&$%<=>@^*/+-]*\_s*\["
240*7e6a515eSBram Moolenaar  \ end="]\(\_s*<-\)\?"
241*7e6a515eSBram Moolenaar  \ contains=ALLBUT,@ocamlContained,ocamlBrackErr
242*7e6a515eSBram Moolenaarsyn region   ocamlIndexing matchgroup=ocamlIndexingOp
243*7e6a515eSBram Moolenaar  \ start="\.[~?!:|&$%=>@^/*+-][~?!.:|&$%<=>@^*/+-]*\_s*{"
244*7e6a515eSBram Moolenaar  \ end="}\(\_s*<-\)\?"
245*7e6a515eSBram Moolenaar  \ contains=ALLBUT,@ocamlContained,ocamlBraceErr
246773a97c2SBram Moolenaar" Extension operators (has to be declared before regular infix operators):
247773a97c2SBram Moolenaarsyn match    ocamlExtensionOp          "#[#~?!.:|&$%<=>@^*/+-]\+"
248773a97c2SBram Moolenaar" Infix and prefix operators:
249773a97c2SBram Moolenaarsyn match    ocamlPrefixOp              "![~?!.:|&$%<=>@^*/+-]*"
250773a97c2SBram Moolenaarsyn match    ocamlPrefixOp           "[~?][~?!.:|&$%<=>@^*/+-]\+"
251773a97c2SBram Moolenaarsyn match    ocamlInfixOp      "[&$%@^/+-][~?!.:|&$%<=>@^*/+-]*"
252773a97c2SBram Moolenaarsyn match    ocamlInfixOp         "[|<=>*][~?!.:|&$%<=>@^*/+-]\+"
253773a97c2SBram Moolenaarsyn match    ocamlInfixOp               "#[~?!.:|&$%<=>@^*/+-]\+#\@!"
254773a97c2SBram Moolenaarsyn match    ocamlInfixOp              "!=[~?!.:|&$%<=>@^*/+-]\@!"
255773a97c2SBram Moolenaarsyn keyword  ocamlInfixOpKeyword      asr land lor lsl lsr lxor mod or
256773a97c2SBram Moolenaar" := is technically an infix operator, but we may want to show it as a keyword
257773a97c2SBram Moolenaar" (somewhat analogously to = for let‐bindings and <- for assignations):
258773a97c2SBram Moolenaarsyn match    ocamlRefAssign    ":="
259773a97c2SBram Moolenaar" :: is technically not an operator, but we may want to show it as such:
260773a97c2SBram Moolenaarsyn match    ocamlCons         "::"
261773a97c2SBram Moolenaar" -> and <- are keywords, not operators (but can appear in longer operators):
262773a97c2SBram Moolenaarsyn match    ocamlArrow        "->[~?!.:|&$%<=>@^*/+-]\@!"
263071d4279SBram Moolenaarif exists("ocaml_revised")
264773a97c2SBram Moolenaar  syn match    ocamlErr        "<-[~?!.:|&$%<=>@^*/+-]\@!"
265071d4279SBram Moolenaarelse
266773a97c2SBram Moolenaar  syn match    ocamlKeyChar    "<-[~?!.:|&$%<=>@^*/+-]\@!"
267071d4279SBram Moolenaarendif
268071d4279SBram Moolenaar
269773a97c2SBram Moolenaarsyn match    ocamlNumber        "-\=\<\d\(_\|\d\)*[l|L|n]\?\>"
270773a97c2SBram Moolenaarsyn match    ocamlNumber        "-\=\<0[x|X]\(\x\|_\)\+[l|L|n]\?\>"
271773a97c2SBram Moolenaarsyn match    ocamlNumber        "-\=\<0[o|O]\(\o\|_\)\+[l|L|n]\?\>"
272773a97c2SBram Moolenaarsyn match    ocamlNumber        "-\=\<0[b|B]\([01]\|_\)\+[l|L|n]\?\>"
273773a97c2SBram Moolenaarsyn match    ocamlFloat         "-\=\<\d\(_\|\d\)*\.\?\(_\|\d\)*\([eE][-+]\=\d\(_\|\d\)*\)\=\>"
274071d4279SBram Moolenaar
275071d4279SBram Moolenaar" Labels
276071d4279SBram Moolenaarsyn match    ocamlLabel        "\~\(\l\|_\)\(\w\|'\)*"lc=1
277071d4279SBram Moolenaarsyn match    ocamlLabel        "?\(\l\|_\)\(\w\|'\)*"lc=1
278773a97c2SBram Moolenaarsyn region   ocamlLabel transparent matchgroup=ocamlLabel start="[~?](\(\l\|_\)\(\w\|'\)*"lc=2 end=")"me=e-1 contains=ALLBUT,@ocamlContained,ocamlParenErr
279071d4279SBram Moolenaar
280071d4279SBram Moolenaar
281071d4279SBram Moolenaar" Synchronization
282071d4279SBram Moolenaarsyn sync minlines=50
283071d4279SBram Moolenaarsyn sync maxlines=500
284071d4279SBram Moolenaar
285071d4279SBram Moolenaarif !exists("ocaml_revised")
286071d4279SBram Moolenaar  syn sync match ocamlDoSync      grouphere  ocamlDo      "\<do\>"
287071d4279SBram Moolenaar  syn sync match ocamlDoSync      groupthere ocamlDo      "\<done\>"
288071d4279SBram Moolenaarendif
289071d4279SBram Moolenaar
290071d4279SBram Moolenaarif exists("ocaml_revised")
291071d4279SBram Moolenaar  syn sync match ocamlEndSync     grouphere  ocamlEnd     "\<\(object\)\>"
292071d4279SBram Moolenaarelse
293071d4279SBram Moolenaar  syn sync match ocamlEndSync     grouphere  ocamlEnd     "\<\(begin\|object\)\>"
294071d4279SBram Moolenaarendif
295071d4279SBram Moolenaar
296071d4279SBram Moolenaarsyn sync match ocamlEndSync     groupthere ocamlEnd     "\<end\>"
297071d4279SBram Moolenaarsyn sync match ocamlStructSync  grouphere  ocamlStruct  "\<struct\>"
298071d4279SBram Moolenaarsyn sync match ocamlStructSync  groupthere ocamlStruct  "\<end\>"
299071d4279SBram Moolenaarsyn sync match ocamlSigSync     grouphere  ocamlSig     "\<sig\>"
300071d4279SBram Moolenaarsyn sync match ocamlSigSync     groupthere ocamlSig     "\<end\>"
301071d4279SBram Moolenaar
302071d4279SBram Moolenaar" Define the default highlighting.
303071d4279SBram Moolenaar
304f37506f6SBram Moolenaarhi def link ocamlBraceErr	   Error
305f37506f6SBram Moolenaarhi def link ocamlBrackErr	   Error
306f37506f6SBram Moolenaarhi def link ocamlParenErr	   Error
307f37506f6SBram Moolenaarhi def link ocamlArrErr	   Error
308071d4279SBram Moolenaar
309f37506f6SBram Moolenaarhi def link ocamlCommentErr   Error
310071d4279SBram Moolenaar
311f37506f6SBram Moolenaarhi def link ocamlCountErr	   Error
312f37506f6SBram Moolenaarhi def link ocamlDoErr	   Error
313f37506f6SBram Moolenaarhi def link ocamlDoneErr	   Error
314f37506f6SBram Moolenaarhi def link ocamlEndErr	   Error
315f37506f6SBram Moolenaarhi def link ocamlThenErr	   Error
316071d4279SBram Moolenaar
317f37506f6SBram Moolenaarhi def link ocamlCharErr	   Error
318071d4279SBram Moolenaar
319f37506f6SBram Moolenaarhi def link ocamlErr	   Error
320071d4279SBram Moolenaar
321f37506f6SBram Moolenaarhi def link ocamlComment	   Comment
322071d4279SBram Moolenaar
323f37506f6SBram Moolenaarhi def link ocamlModPath	   Include
324f37506f6SBram Moolenaarhi def link ocamlObject	   Include
325f37506f6SBram Moolenaarhi def link ocamlModule	   Include
326f37506f6SBram Moolenaarhi def link ocamlModParam1    Include
327*7e6a515eSBram Moolenaarhi def link ocamlGenMod       Include
328f37506f6SBram Moolenaarhi def link ocamlModType	   Include
329f37506f6SBram Moolenaarhi def link ocamlMPRestr3	   Include
330f37506f6SBram Moolenaarhi def link ocamlFullMod	   Include
331*7e6a515eSBram Moolenaarhi def link ocamlFuncWith	   Include
332*7e6a515eSBram Moolenaarhi def link ocamlModParam     Include
333f37506f6SBram Moolenaarhi def link ocamlModTypeRestr Include
334f37506f6SBram Moolenaarhi def link ocamlWith	   Include
335f37506f6SBram Moolenaarhi def link ocamlMTDef	   Include
336773a97c2SBram Moolenaarhi def link ocamlSigEncl	   ocamlModule
337773a97c2SBram Moolenaarhi def link ocamlStructEncl	   ocamlModule
338071d4279SBram Moolenaar
339f37506f6SBram Moolenaarhi def link ocamlScript	   Include
340071d4279SBram Moolenaar
341f37506f6SBram Moolenaarhi def link ocamlConstructor  Constant
342071d4279SBram Moolenaar
343f37506f6SBram Moolenaarhi def link ocamlVal          Keyword
344f37506f6SBram Moolenaarhi def link ocamlModPreRHS    Keyword
345f37506f6SBram Moolenaarhi def link ocamlMPRestr2	   Keyword
346f37506f6SBram Moolenaarhi def link ocamlKeyword	   Keyword
347f37506f6SBram Moolenaarhi def link ocamlMethod	   Include
348*7e6a515eSBram Moolenaarhi def link ocamlArrow	   Keyword
349f37506f6SBram Moolenaarhi def link ocamlKeyChar	   Keyword
350f37506f6SBram Moolenaarhi def link ocamlAnyVar	   Keyword
351f37506f6SBram Moolenaarhi def link ocamlTopStop	   Keyword
352773a97c2SBram Moolenaar
353773a97c2SBram Moolenaarhi def link ocamlRefAssign    ocamlKeyChar
354773a97c2SBram Moolenaarhi def link ocamlEqual        ocamlKeyChar
355773a97c2SBram Moolenaarhi def link ocamlStar         ocamlInfixOp
356773a97c2SBram Moolenaarhi def link ocamlAngle        ocamlInfixOp
357773a97c2SBram Moolenaarhi def link ocamlCons         ocamlInfixOp
358773a97c2SBram Moolenaar
359773a97c2SBram Moolenaarhi def link ocamlPrefixOp       ocamlOperator
360773a97c2SBram Moolenaarhi def link ocamlInfixOp        ocamlOperator
361773a97c2SBram Moolenaarhi def link ocamlExtensionOp    ocamlOperator
362773a97c2SBram Moolenaarhi def link ocamlIndexingOp     ocamlOperator
363773a97c2SBram Moolenaar
364773a97c2SBram Moolenaarif exists("ocaml_highlight_operators")
365773a97c2SBram Moolenaar    hi def link ocamlInfixOpKeyword ocamlOperator
366773a97c2SBram Moolenaar    hi def link ocamlOperator       Operator
367773a97c2SBram Moolenaarelse
368773a97c2SBram Moolenaar    hi def link ocamlInfixOpKeyword Keyword
369773a97c2SBram Moolenaarendif
370071d4279SBram Moolenaar
371f37506f6SBram Moolenaarhi def link ocamlBoolean	   Boolean
372f37506f6SBram Moolenaarhi def link ocamlCharacter    Character
373f37506f6SBram Moolenaarhi def link ocamlNumber	   Number
374f37506f6SBram Moolenaarhi def link ocamlFloat	   Float
375f37506f6SBram Moolenaarhi def link ocamlString	   String
376773a97c2SBram Moolenaarhi def link ocamlQuotedStringDelim Identifier
377071d4279SBram Moolenaar
378f37506f6SBram Moolenaarhi def link ocamlLabel	   Identifier
379071d4279SBram Moolenaar
380f37506f6SBram Moolenaarhi def link ocamlType	   Type
381071d4279SBram Moolenaar
382f37506f6SBram Moolenaarhi def link ocamlTodo	   Todo
383071d4279SBram Moolenaar
384f37506f6SBram Moolenaarhi def link ocamlEncl	   Keyword
385071d4279SBram Moolenaar
386773a97c2SBram Moolenaarhi def link ocamlPpxEncl       ocamlEncl
387071d4279SBram Moolenaar
388071d4279SBram Moolenaarlet b:current_syntax = "ocaml"
389071d4279SBram Moolenaar
390*7e6a515eSBram Moolenaarlet &cpo = s:keepcpo
391*7e6a515eSBram Moolenaarunlet s:keepcpo
392*7e6a515eSBram Moolenaar
393071d4279SBram Moolenaar" vim: ts=8
394