1" Vim syntax file
2" Language:     SML
3" Filenames:    *.sml *.sig
4" Maintainers:  Markus Mottl            <markus.mottl@gmail.com>
5"               Fabrizio Zeno Cornelli  <zeno@filibusta.crema.unimi.it>
6" URL:          http://www.ocaml.info/vim/syntax/sml.vim
7" Last Change:  2006 Oct 23 - Fixed character highlighting bug (MM)
8"               2002 Jun 02 - Fixed small typo  (MM)
9"               2001 Nov 20 - Fixed small highlighting bug with modules (MM)
10
11" For version 5.x: Clear all syntax items
12" For version 6.x: Quit when a syntax file was already loaded
13if version < 600
14  syntax clear
15elseif exists("b:current_syntax")
16  finish
17endif
18
19" SML is case sensitive.
20syn case match
21
22" lowercase identifier - the standard way to match
23syn match    smlLCIdentifier /\<\(\l\|_\)\(\w\|'\)*\>/
24
25syn match    smlKeyChar    "|"
26
27" Errors
28syn match    smlBraceErr   "}"
29syn match    smlBrackErr   "\]"
30syn match    smlParenErr   ")"
31syn match    smlCommentErr "\*)"
32syn match    smlThenErr    "\<then\>"
33
34" Error-highlighting of "end" without synchronization:
35" as keyword or as error (default)
36if exists("sml_noend_error")
37  syn match    smlKeyword    "\<end\>"
38else
39  syn match    smlEndErr     "\<end\>"
40endif
41
42" Some convenient clusters
43syn cluster  smlAllErrs contains=smlBraceErr,smlBrackErr,smlParenErr,smlCommentErr,smlEndErr,smlThenErr
44
45syn cluster  smlAENoParen contains=smlBraceErr,smlBrackErr,smlCommentErr,smlEndErr,smlThenErr
46
47syn cluster  smlContained contains=smlTodo,smlPreDef,smlModParam,smlModParam1,smlPreMPRestr,smlMPRestr,smlMPRestr1,smlMPRestr2,smlMPRestr3,smlModRHS,smlFuncWith,smlFuncStruct,smlModTypeRestr,smlModTRWith,smlWith,smlWithRest,smlModType,smlFullMod
48
49
50" Enclosing delimiters
51syn region   smlEncl transparent matchgroup=smlKeyword start="(" matchgroup=smlKeyword end=")" contains=ALLBUT,@smlContained,smlParenErr
52syn region   smlEncl transparent matchgroup=smlKeyword start="{" matchgroup=smlKeyword end="}"  contains=ALLBUT,@smlContained,smlBraceErr
53syn region   smlEncl transparent matchgroup=smlKeyword start="\[" matchgroup=smlKeyword end="\]" contains=ALLBUT,@smlContained,smlBrackErr
54syn region   smlEncl transparent matchgroup=smlKeyword start="#\[" matchgroup=smlKeyword end="\]" contains=ALLBUT,@smlContained,smlBrackErr
55
56
57" Comments
58syn region   smlComment start="(\*" end="\*)" contains=smlComment,smlTodo
59syn keyword  smlTodo contained TODO FIXME XXX
60
61
62" let
63syn region   smlEnd matchgroup=smlKeyword start="\<let\>" matchgroup=smlKeyword end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr
64
65" local
66syn region   smlEnd matchgroup=smlKeyword start="\<local\>" matchgroup=smlKeyword end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr
67
68" abstype
69syn region   smlNone matchgroup=smlKeyword start="\<abstype\>" matchgroup=smlKeyword end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr
70
71" begin
72syn region   smlEnd matchgroup=smlKeyword start="\<begin\>" matchgroup=smlKeyword end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr
73
74" if
75syn region   smlNone matchgroup=smlKeyword start="\<if\>" matchgroup=smlKeyword end="\<then\>" contains=ALLBUT,@smlContained,smlThenErr
76
77
78"" Modules
79
80" "struct"
81syn region   smlStruct matchgroup=smlModule start="\<struct\>" matchgroup=smlModule end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr
82
83" "sig"
84syn region   smlSig matchgroup=smlModule start="\<sig\>" matchgroup=smlModule end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr,smlModule
85syn region   smlModSpec matchgroup=smlKeyword start="\<structure\>" matchgroup=smlModule end="\<\u\(\w\|'\)*\>" contained contains=@smlAllErrs,smlComment skipwhite skipempty nextgroup=smlModTRWith,smlMPRestr
86
87" "open"
88syn region   smlNone matchgroup=smlKeyword start="\<open\>" matchgroup=smlModule end="\<\u\(\w\|'\)*\(\.\u\(\w\|'\)*\)*\>" contains=@smlAllErrs,smlComment
89
90" "structure" - somewhat complicated stuff ;-)
91syn region   smlModule matchgroup=smlKeyword start="\<\(structure\|functor\)\>" matchgroup=smlModule end="\<\u\(\w\|'\)*\>" contains=@smlAllErrs,smlComment skipwhite skipempty nextgroup=smlPreDef
92syn region   smlPreDef start="."me=e-1 matchgroup=smlKeyword end="\l\|="me=e-1 contained contains=@smlAllErrs,smlComment,smlModParam,smlModTypeRestr,smlModTRWith nextgroup=smlModPreRHS
93syn region   smlModParam start="([^*]" end=")" contained contains=@smlAENoParen,smlModParam1
94syn match    smlModParam1 "\<\u\(\w\|'\)*\>" contained skipwhite skipempty nextgroup=smlPreMPRestr
95
96syn region   smlPreMPRestr start="."me=e-1 end=")"me=e-1 contained contains=@smlAllErrs,smlComment,smlMPRestr,smlModTypeRestr
97
98syn region   smlMPRestr start=":" end="."me=e-1 contained contains=@smlComment skipwhite skipempty nextgroup=smlMPRestr1,smlMPRestr2,smlMPRestr3
99syn region   smlMPRestr1 matchgroup=smlModule start="\ssig\s\=" matchgroup=smlModule end="\<end\>" contained contains=ALLBUT,@smlContained,smlEndErr,smlModule
100syn region   smlMPRestr2 start="\sfunctor\(\s\|(\)\="me=e-1 matchgroup=smlKeyword end="->" contained contains=@smlAllErrs,smlComment,smlModParam skipwhite skipempty nextgroup=smlFuncWith
101syn match    smlMPRestr3 "\w\(\w\|'\)*\(\.\w\(\w\|'\)*\)*" contained
102syn match    smlModPreRHS "=" contained skipwhite skipempty nextgroup=smlModParam,smlFullMod
103syn region   smlModRHS start="." end=".\w\|([^*]"me=e-2 contained contains=smlComment skipwhite skipempty nextgroup=smlModParam,smlFullMod
104syn match    smlFullMod "\<\u\(\w\|'\)*\(\.\u\(\w\|'\)*\)*" contained skipwhite skipempty nextgroup=smlFuncWith
105
106syn region   smlFuncWith start="([^*]"me=e-1 end=")" contained contains=smlComment,smlWith,smlFuncStruct
107syn region   smlFuncStruct matchgroup=smlModule start="[^a-zA-Z]struct\>"hs=s+1 matchgroup=smlModule end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr
108
109syn match    smlModTypeRestr "\<\w\(\w\|'\)*\(\.\w\(\w\|'\)*\)*\>" contained
110syn region   smlModTRWith start=":\s*("hs=s+1 end=")" contained contains=@smlAENoParen,smlWith
111syn match    smlWith "\<\(\u\(\w\|'\)*\.\)*\w\(\w\|'\)*\>" contained skipwhite skipempty nextgroup=smlWithRest
112syn region   smlWithRest start="[^)]" end=")"me=e-1 contained contains=ALLBUT,@smlContained
113
114" "signature"
115syn region   smlKeyword start="\<signature\>" matchgroup=smlModule end="\<\w\(\w\|'\)*\>" contains=smlComment skipwhite skipempty nextgroup=smlMTDef
116syn match    smlMTDef "=\s*\w\(\w\|'\)*\>"hs=s+1,me=s
117
118syn keyword  smlKeyword  and andalso case
119syn keyword  smlKeyword  datatype else eqtype
120syn keyword  smlKeyword  exception fn fun handle
121syn keyword  smlKeyword  in infix infixl infixr
122syn keyword  smlKeyword  match nonfix of orelse
123syn keyword  smlKeyword  raise handle type
124syn keyword  smlKeyword  val where while with withtype
125
126syn keyword  smlType     bool char exn int list option
127syn keyword  smlType     real string unit
128
129syn keyword  smlOperator div mod not or quot rem
130
131syn keyword  smlBoolean      true false
132syn match    smlConstructor  "(\s*)"
133syn match    smlConstructor  "\[\s*\]"
134syn match    smlConstructor  "#\[\s*\]"
135syn match    smlConstructor  "\u\(\w\|'\)*\>"
136
137" Module prefix
138syn match    smlModPath      "\u\(\w\|'\)*\."he=e-1
139
140syn match    smlCharacter    +#"\\""\|#"."\|#"\\\d\d\d"+
141syn match    smlCharErr      +#"\\\d\d"\|#"\\\d"+
142syn region   smlString       start=+"+ skip=+\\\\\|\\"+ end=+"+
143
144syn match    smlFunDef       "=>"
145syn match    smlRefAssign    ":="
146syn match    smlTopStop      ";;"
147syn match    smlOperator     "\^"
148syn match    smlOperator     "::"
149syn match    smlAnyVar       "\<_\>"
150syn match    smlKeyChar      "!"
151syn match    smlKeyChar      ";"
152syn match    smlKeyChar      "\*"
153syn match    smlKeyChar      "="
154
155syn match    smlNumber	      "\<-\=\d\+\>"
156syn match    smlNumber	      "\<-\=0[x|X]\x\+\>"
157syn match    smlReal	      "\<-\=\d\+\.\d*\([eE][-+]\=\d\+\)\=[fl]\=\>"
158
159" Synchronization
160syn sync minlines=20
161syn sync maxlines=500
162
163syn sync match smlEndSync     grouphere  smlEnd     "\<begin\>"
164syn sync match smlEndSync     groupthere smlEnd     "\<end\>"
165syn sync match smlStructSync  grouphere  smlStruct  "\<struct\>"
166syn sync match smlStructSync  groupthere smlStruct  "\<end\>"
167syn sync match smlSigSync     grouphere  smlSig     "\<sig\>"
168syn sync match smlSigSync     groupthere smlSig     "\<end\>"
169
170" Define the default highlighting.
171" For version 5.7 and earlier: only when not done already
172" For version 5.8 and later: only when an item doesn't have highlighting yet
173if version >= 508 || !exists("did_sml_syntax_inits")
174  if version < 508
175    let did_sml_syntax_inits = 1
176    command -nargs=+ HiLink hi link <args>
177  else
178    command -nargs=+ HiLink hi def link <args>
179  endif
180
181  HiLink smlBraceErr	 Error
182  HiLink smlBrackErr	 Error
183  HiLink smlParenErr	 Error
184
185  HiLink smlCommentErr	 Error
186
187  HiLink smlEndErr	 Error
188  HiLink smlThenErr	 Error
189
190  HiLink smlCharErr	 Error
191
192  HiLink smlComment	 Comment
193
194  HiLink smlModPath	 Include
195  HiLink smlModule	 Include
196  HiLink smlModParam1	 Include
197  HiLink smlModType	 Include
198  HiLink smlMPRestr3	 Include
199  HiLink smlFullMod	 Include
200  HiLink smlModTypeRestr Include
201  HiLink smlWith	 Include
202  HiLink smlMTDef	 Include
203
204  HiLink smlConstructor  Constant
205
206  HiLink smlModPreRHS	 Keyword
207  HiLink smlMPRestr2	 Keyword
208  HiLink smlKeyword	 Keyword
209  HiLink smlFunDef	 Keyword
210  HiLink smlRefAssign	 Keyword
211  HiLink smlKeyChar	 Keyword
212  HiLink smlAnyVar	 Keyword
213  HiLink smlTopStop	 Keyword
214  HiLink smlOperator	 Keyword
215
216  HiLink smlBoolean	 Boolean
217  HiLink smlCharacter	 Character
218  HiLink smlNumber	 Number
219  HiLink smlReal	 Float
220  HiLink smlString	 String
221  HiLink smlType	 Type
222  HiLink smlTodo	 Todo
223  HiLink smlEncl	 Keyword
224
225  delcommand HiLink
226endif
227
228let b:current_syntax = "sml"
229
230" vim: ts=8
231