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