blob: fa4524f93d96b2e9d9311c43d76d5a2d677fd797 [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
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020011" quit when a syntax file was already loaded
12if exists("b:current_syntax")
Bram Moolenaar071d4272004-06-13 20:20:40 +000013 finish
14endif
15
16" SML is case sensitive.
17syn case match
18
19" lowercase identifier - the standard way to match
20syn match smlLCIdentifier /\<\(\l\|_\)\(\w\|'\)*\>/
21
22syn match smlKeyChar "|"
23
24" Errors
25syn match smlBraceErr "}"
26syn match smlBrackErr "\]"
27syn match smlParenErr ")"
28syn match smlCommentErr "\*)"
29syn match smlThenErr "\<then\>"
30
31" Error-highlighting of "end" without synchronization:
32" as keyword or as error (default)
33if exists("sml_noend_error")
34 syn match smlKeyword "\<end\>"
35else
36 syn match smlEndErr "\<end\>"
37endif
38
39" Some convenient clusters
40syn cluster smlAllErrs contains=smlBraceErr,smlBrackErr,smlParenErr,smlCommentErr,smlEndErr,smlThenErr
41
42syn cluster smlAENoParen contains=smlBraceErr,smlBrackErr,smlCommentErr,smlEndErr,smlThenErr
43
44syn cluster smlContained contains=smlTodo,smlPreDef,smlModParam,smlModParam1,smlPreMPRestr,smlMPRestr,smlMPRestr1,smlMPRestr2,smlMPRestr3,smlModRHS,smlFuncWith,smlFuncStruct,smlModTypeRestr,smlModTRWith,smlWith,smlWithRest,smlModType,smlFullMod
45
46
47" Enclosing delimiters
48syn region smlEncl transparent matchgroup=smlKeyword start="(" matchgroup=smlKeyword end=")" contains=ALLBUT,@smlContained,smlParenErr
49syn region smlEncl transparent matchgroup=smlKeyword start="{" matchgroup=smlKeyword end="}" contains=ALLBUT,@smlContained,smlBraceErr
50syn region smlEncl transparent matchgroup=smlKeyword start="\[" matchgroup=smlKeyword end="\]" contains=ALLBUT,@smlContained,smlBrackErr
51syn region smlEncl transparent matchgroup=smlKeyword start="#\[" matchgroup=smlKeyword end="\]" contains=ALLBUT,@smlContained,smlBrackErr
52
53
54" Comments
55syn region smlComment start="(\*" end="\*)" contains=smlComment,smlTodo
56syn keyword smlTodo contained TODO FIXME XXX
57
58
59" let
60syn region smlEnd matchgroup=smlKeyword start="\<let\>" matchgroup=smlKeyword end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr
61
62" local
63syn region smlEnd matchgroup=smlKeyword start="\<local\>" matchgroup=smlKeyword end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr
64
65" abstype
66syn region smlNone matchgroup=smlKeyword start="\<abstype\>" matchgroup=smlKeyword end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr
67
68" begin
69syn region smlEnd matchgroup=smlKeyword start="\<begin\>" matchgroup=smlKeyword end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr
70
71" if
72syn region smlNone matchgroup=smlKeyword start="\<if\>" matchgroup=smlKeyword end="\<then\>" contains=ALLBUT,@smlContained,smlThenErr
73
74
75"" Modules
76
77" "struct"
78syn region smlStruct matchgroup=smlModule start="\<struct\>" matchgroup=smlModule end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr
79
80" "sig"
81syn region smlSig matchgroup=smlModule start="\<sig\>" matchgroup=smlModule end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr,smlModule
82syn region smlModSpec matchgroup=smlKeyword start="\<structure\>" matchgroup=smlModule end="\<\u\(\w\|'\)*\>" contained contains=@smlAllErrs,smlComment skipwhite skipempty nextgroup=smlModTRWith,smlMPRestr
83
84" "open"
85syn region smlNone matchgroup=smlKeyword start="\<open\>" matchgroup=smlModule end="\<\u\(\w\|'\)*\(\.\u\(\w\|'\)*\)*\>" contains=@smlAllErrs,smlComment
86
87" "structure" - somewhat complicated stuff ;-)
88syn region smlModule matchgroup=smlKeyword start="\<\(structure\|functor\)\>" matchgroup=smlModule end="\<\u\(\w\|'\)*\>" contains=@smlAllErrs,smlComment skipwhite skipempty nextgroup=smlPreDef
89syn region smlPreDef start="."me=e-1 matchgroup=smlKeyword end="\l\|="me=e-1 contained contains=@smlAllErrs,smlComment,smlModParam,smlModTypeRestr,smlModTRWith nextgroup=smlModPreRHS
90syn region smlModParam start="([^*]" end=")" contained contains=@smlAENoParen,smlModParam1
91syn match smlModParam1 "\<\u\(\w\|'\)*\>" contained skipwhite skipempty nextgroup=smlPreMPRestr
92
93syn region smlPreMPRestr start="."me=e-1 end=")"me=e-1 contained contains=@smlAllErrs,smlComment,smlMPRestr,smlModTypeRestr
94
95syn region smlMPRestr start=":" end="."me=e-1 contained contains=@smlComment skipwhite skipempty nextgroup=smlMPRestr1,smlMPRestr2,smlMPRestr3
96syn region smlMPRestr1 matchgroup=smlModule start="\ssig\s\=" matchgroup=smlModule end="\<end\>" contained contains=ALLBUT,@smlContained,smlEndErr,smlModule
97syn region smlMPRestr2 start="\sfunctor\(\s\|(\)\="me=e-1 matchgroup=smlKeyword end="->" contained contains=@smlAllErrs,smlComment,smlModParam skipwhite skipempty nextgroup=smlFuncWith
98syn match smlMPRestr3 "\w\(\w\|'\)*\(\.\w\(\w\|'\)*\)*" contained
99syn match smlModPreRHS "=" contained skipwhite skipempty nextgroup=smlModParam,smlFullMod
100syn region smlModRHS start="." end=".\w\|([^*]"me=e-2 contained contains=smlComment skipwhite skipempty nextgroup=smlModParam,smlFullMod
101syn match smlFullMod "\<\u\(\w\|'\)*\(\.\u\(\w\|'\)*\)*" contained skipwhite skipempty nextgroup=smlFuncWith
102
103syn region smlFuncWith start="([^*]"me=e-1 end=")" contained contains=smlComment,smlWith,smlFuncStruct
104syn region smlFuncStruct matchgroup=smlModule start="[^a-zA-Z]struct\>"hs=s+1 matchgroup=smlModule end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr
105
106syn match smlModTypeRestr "\<\w\(\w\|'\)*\(\.\w\(\w\|'\)*\)*\>" contained
107syn region smlModTRWith start=":\s*("hs=s+1 end=")" contained contains=@smlAENoParen,smlWith
108syn match smlWith "\<\(\u\(\w\|'\)*\.\)*\w\(\w\|'\)*\>" contained skipwhite skipempty nextgroup=smlWithRest
109syn region smlWithRest start="[^)]" end=")"me=e-1 contained contains=ALLBUT,@smlContained
110
111" "signature"
112syn region smlKeyword start="\<signature\>" matchgroup=smlModule end="\<\w\(\w\|'\)*\>" contains=smlComment skipwhite skipempty nextgroup=smlMTDef
113syn match smlMTDef "=\s*\w\(\w\|'\)*\>"hs=s+1,me=s
114
115syn keyword smlKeyword and andalso case
116syn keyword smlKeyword datatype else eqtype
117syn keyword smlKeyword exception fn fun handle
118syn keyword smlKeyword in infix infixl infixr
119syn keyword smlKeyword match nonfix of orelse
120syn keyword smlKeyword raise handle type
121syn keyword smlKeyword val where while with withtype
122
123syn keyword smlType bool char exn int list option
124syn keyword smlType real string unit
125
126syn keyword smlOperator div mod not or quot rem
127
128syn keyword smlBoolean true false
129syn match smlConstructor "(\s*)"
130syn match smlConstructor "\[\s*\]"
131syn match smlConstructor "#\[\s*\]"
132syn match smlConstructor "\u\(\w\|'\)*\>"
133
134" Module prefix
135syn match smlModPath "\u\(\w\|'\)*\."he=e-1
136
Bram Moolenaard5ab34b2007-05-05 17:15:44 +0000137syn match smlCharacter +#"\\""\|#"."\|#"\\\d\d\d"+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000138syn match smlCharErr +#"\\\d\d"\|#"\\\d"+
139syn region smlString start=+"+ skip=+\\\\\|\\"+ end=+"+
140
141syn match smlFunDef "=>"
142syn match smlRefAssign ":="
143syn match smlTopStop ";;"
144syn match smlOperator "\^"
145syn match smlOperator "::"
146syn match smlAnyVar "\<_\>"
147syn match smlKeyChar "!"
148syn match smlKeyChar ";"
149syn match smlKeyChar "\*"
150syn match smlKeyChar "="
151
152syn match smlNumber "\<-\=\d\+\>"
153syn match smlNumber "\<-\=0[x|X]\x\+\>"
154syn match smlReal "\<-\=\d\+\.\d*\([eE][-+]\=\d\+\)\=[fl]\=\>"
155
156" Synchronization
157syn sync minlines=20
158syn sync maxlines=500
159
160syn sync match smlEndSync grouphere smlEnd "\<begin\>"
161syn sync match smlEndSync groupthere smlEnd "\<end\>"
162syn sync match smlStructSync grouphere smlStruct "\<struct\>"
163syn sync match smlStructSync groupthere smlStruct "\<end\>"
164syn sync match smlSigSync grouphere smlSig "\<sig\>"
165syn sync match smlSigSync groupthere smlSig "\<end\>"
166
167" Define the default highlighting.
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200168" Only when an item doesn't have highlighting yet
Bram Moolenaar071d4272004-06-13 20:20:40 +0000169
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200170hi def link smlBraceErr Error
171hi def link smlBrackErr Error
172hi def link smlParenErr Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000173
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200174hi def link smlCommentErr Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000175
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200176hi def link smlEndErr Error
177hi def link smlThenErr Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000178
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200179hi def link smlCharErr Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000180
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200181hi def link smlComment Comment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000182
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200183hi def link smlModPath Include
184hi def link smlModule Include
185hi def link smlModParam1 Include
186hi def link smlModType Include
187hi def link smlMPRestr3 Include
188hi def link smlFullMod Include
189hi def link smlModTypeRestr Include
190hi def link smlWith Include
191hi def link smlMTDef Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000192
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200193hi def link smlConstructor Constant
Bram Moolenaar071d4272004-06-13 20:20:40 +0000194
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200195hi def link smlModPreRHS Keyword
196hi def link smlMPRestr2 Keyword
197hi def link smlKeyword Keyword
198hi def link smlFunDef Keyword
199hi def link smlRefAssign Keyword
200hi def link smlKeyChar Keyword
201hi def link smlAnyVar Keyword
202hi def link smlTopStop Keyword
203hi def link smlOperator Keyword
Bram Moolenaar071d4272004-06-13 20:20:40 +0000204
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200205hi def link smlBoolean Boolean
206hi def link smlCharacter Character
207hi def link smlNumber Number
208hi def link smlReal Float
209hi def link smlString String
210hi def link smlType Type
211hi def link smlTodo Todo
212hi def link smlEncl Keyword
Bram Moolenaar071d4272004-06-13 20:20:40 +0000213
Bram Moolenaar071d4272004-06-13 20:20:40 +0000214
215let b:current_syntax = "sml"
216
217" vim: ts=8