blob: aa7d64a33a37fc46fe702bda75c09d4257ab37cf [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
2" Language: SML
3" Filenames: *.sml *.sig
Bram Moolenaar8b6144b2006-02-08 09:20:24 +00004" Maintainers: Markus Mottl <markus.mottl@gmail.com>
Bram Moolenaar5eb86f92004-07-26 12:53:41 +00005" Fabrizio Zeno Cornelli <zeno@filibusta.crema.unimi.it>
Bram Moolenaar8b6144b2006-02-08 09:20:24 +00006" URL: http://www.ocaml.info/vim/syntax/sml.vim
Bram Moolenaard5ab34b2007-05-05 17:15:44 +00007" Last Change: 2006 Oct 23 - Fixed character highlighting bug (MM)
8" 2002 Jun 02 - Fixed small typo (MM)
Bram Moolenaar5eb86f92004-07-26 12:53:41 +00009" 2001 Nov 20 - Fixed small highlighting bug with modules (MM)
Bram Moolenaar071d4272004-06-13 20:20:40 +000010
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
Bram Moolenaard5ab34b2007-05-05 17:15:44 +0000140syn match smlCharacter +#"\\""\|#"."\|#"\\\d\d\d"+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000141syn 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