1<lexer>
  2  <config>
  3    <name>Standard ML</name>
  4    <alias>sml</alias>
  5    <filename>*.sml</filename>
  6    <filename>*.sig</filename>
  7    <filename>*.fun</filename>
  8    <mime_type>text/x-standardml</mime_type>
  9    <mime_type>application/x-standardml</mime_type>
 10  </config>
 11  <rules>
 12    <state name="delimiters">
 13      <rule pattern="\(|\[|\{">
 14        <token type="Punctuation"/>
 15        <push state="main"/>
 16      </rule>
 17      <rule pattern="\)|\]|\}">
 18        <token type="Punctuation"/>
 19        <pop depth="1"/>
 20      </rule>
 21      <rule pattern="\b(let|if|local)\b(?!\')">
 22        <token type="KeywordReserved"/>
 23        <push state="main" state="main"/>
 24      </rule>
 25      <rule pattern="\b(struct|sig|while)\b(?!\')">
 26        <token type="KeywordReserved"/>
 27        <push state="main"/>
 28      </rule>
 29      <rule pattern="\b(do|else|end|in|then)\b(?!\')">
 30        <token type="KeywordReserved"/>
 31        <pop depth="1"/>
 32      </rule>
 33    </state>
 34    <state name="root">
 35      <rule>
 36        <push state="main"/>
 37      </rule>
 38    </state>
 39    <state name="breakout">
 40      <rule pattern="(?=\b(where|do|handle|if|sig|op|while|case|as|else|signature|andalso|struct|infixr|functor|in|structure|then|local|rec|end|fun|of|orelse|val|include|fn|with|exception|let|and|infix|sharing|datatype|type|abstype|withtype|eqtype|nonfix|raise|open)\b(?!\'))">
 41        <token type="Text"/>
 42        <pop depth="1"/>
 43      </rule>
 44    </state>
 45    <state name="tyvarseq">
 46      <rule pattern="\s">
 47        <token type="Text"/>
 48      </rule>
 49      <rule pattern="\(\*">
 50        <token type="CommentMultiline"/>
 51        <push state="comment"/>
 52      </rule>
 53      <rule pattern="\'[\w\']*">
 54        <token type="NameDecorator"/>
 55      </rule>
 56      <rule pattern="[a-zA-Z][\w']*">
 57        <token type="Name"/>
 58      </rule>
 59      <rule pattern=",">
 60        <token type="Punctuation"/>
 61      </rule>
 62      <rule pattern="\)">
 63        <token type="Punctuation"/>
 64        <pop depth="1"/>
 65      </rule>
 66      <rule pattern="[!%&$#+\-/:<=>?@\\~`^|*]+">
 67        <token type="Name"/>
 68      </rule>
 69    </state>
 70    <state name="char">
 71      <rule pattern="[^"\\]">
 72        <token type="LiteralStringChar"/>
 73      </rule>
 74      <rule pattern="\\[\\"abtnvfr]">
 75        <token type="LiteralStringEscape"/>
 76      </rule>
 77      <rule pattern="\\\^[\x40-\x5e]">
 78        <token type="LiteralStringEscape"/>
 79      </rule>
 80      <rule pattern="\\[0-9]{3}">
 81        <token type="LiteralStringEscape"/>
 82      </rule>
 83      <rule pattern="\\u[0-9a-fA-F]{4}">
 84        <token type="LiteralStringEscape"/>
 85      </rule>
 86      <rule pattern="\\\s+\\">
 87        <token type="LiteralStringInterpol"/>
 88      </rule>
 89      <rule pattern=""">
 90        <token type="LiteralStringChar"/>
 91        <pop depth="1"/>
 92      </rule>
 93    </state>
 94    <state name="datbind">
 95      <rule>
 96        <include state="whitespace"/>
 97      </rule>
 98      <rule pattern="\b(and)\b(?!\')">
 99        <token type="KeywordReserved"/>
100        <push state="#pop" state="dname"/>
101      </rule>
102      <rule pattern="\b(withtype)\b(?!\')">
103        <token type="KeywordReserved"/>
104        <push state="#pop" state="tname"/>
105      </rule>
106      <rule pattern="\b(of)\b(?!\')">
107        <token type="KeywordReserved"/>
108      </rule>
109      <rule pattern="(\|)(\s*)([a-zA-Z][\w']*)">
110        <bygroups>
111          <token type="Punctuation"/>
112          <token type="Text"/>
113          <token type="NameClass"/>
114        </bygroups>
115      </rule>
116      <rule pattern="(\|)(\s+)([!%&$#+\-/:<=>?@\\~`^|*]+)">
117        <bygroups>
118          <token type="Punctuation"/>
119          <token type="Text"/>
120          <token type="NameClass"/>
121        </bygroups>
122      </rule>
123      <rule>
124        <include state="breakout"/>
125      </rule>
126      <rule>
127        <include state="core"/>
128      </rule>
129      <rule pattern="\S+">
130        <token type="Error"/>
131      </rule>
132    </state>
133    <state name="string">
134      <rule pattern="[^"\\]">
135        <token type="LiteralStringDouble"/>
136      </rule>
137      <rule pattern="\\[\\"abtnvfr]">
138        <token type="LiteralStringEscape"/>
139      </rule>
140      <rule pattern="\\\^[\x40-\x5e]">
141        <token type="LiteralStringEscape"/>
142      </rule>
143      <rule pattern="\\[0-9]{3}">
144        <token type="LiteralStringEscape"/>
145      </rule>
146      <rule pattern="\\u[0-9a-fA-F]{4}">
147        <token type="LiteralStringEscape"/>
148      </rule>
149      <rule pattern="\\\s+\\">
150        <token type="LiteralStringInterpol"/>
151      </rule>
152      <rule pattern=""">
153        <token type="LiteralStringDouble"/>
154        <pop depth="1"/>
155      </rule>
156    </state>
157    <state name="tname">
158      <rule>
159        <include state="whitespace"/>
160      </rule>
161      <rule>
162        <include state="breakout"/>
163      </rule>
164      <rule pattern="\'[\w\']*">
165        <token type="NameDecorator"/>
166      </rule>
167      <rule pattern="\(">
168        <token type="Punctuation"/>
169        <push state="tyvarseq"/>
170      </rule>
171      <rule pattern="=(?![!%&$#+\-/:<=>?@\\~`^|*]+)">
172        <token type="Punctuation"/>
173        <push state="#pop" state="typbind"/>
174      </rule>
175      <rule pattern="([a-zA-Z][\w']*)">
176        <token type="KeywordType"/>
177      </rule>
178      <rule pattern="([!%&$#+\-/:<=>?@\\~`^|*]+)">
179        <token type="KeywordType"/>
180      </rule>
181      <rule pattern="\S+">
182        <token type="Error"/>
183        <pop depth="1"/>
184      </rule>
185    </state>
186    <state name="dname">
187      <rule>
188        <include state="whitespace"/>
189      </rule>
190      <rule>
191        <include state="breakout"/>
192      </rule>
193      <rule pattern="\'[\w\']*">
194        <token type="NameDecorator"/>
195      </rule>
196      <rule pattern="\(">
197        <token type="Punctuation"/>
198        <push state="tyvarseq"/>
199      </rule>
200      <rule pattern="(=)(\s*)(datatype)">
201        <bygroups>
202          <token type="Punctuation"/>
203          <token type="Text"/>
204          <token type="KeywordReserved"/>
205        </bygroups>
206        <pop depth="1"/>
207      </rule>
208      <rule pattern="=(?![!%&$#+\-/:<=>?@\\~`^|*]+)">
209        <token type="Punctuation"/>
210        <push state="#pop" state="datbind" state="datcon"/>
211      </rule>
212      <rule pattern="([a-zA-Z][\w']*)">
213        <token type="KeywordType"/>
214      </rule>
215      <rule pattern="([!%&$#+\-/:<=>?@\\~`^|*]+)">
216        <token type="KeywordType"/>
217      </rule>
218      <rule pattern="\S+">
219        <token type="Error"/>
220        <pop depth="1"/>
221      </rule>
222    </state>
223    <state name="typbind">
224      <rule>
225        <include state="whitespace"/>
226      </rule>
227      <rule pattern="\b(and)\b(?!\')">
228        <token type="KeywordReserved"/>
229        <push state="#pop" state="tname"/>
230      </rule>
231      <rule>
232        <include state="breakout"/>
233      </rule>
234      <rule>
235        <include state="core"/>
236      </rule>
237      <rule pattern="\S+">
238        <token type="Error"/>
239        <pop depth="1"/>
240      </rule>
241    </state>
242    <state name="ename">
243      <rule>
244        <include state="whitespace"/>
245      </rule>
246      <rule pattern="(exception|and)\b(\s+)([a-zA-Z][\w']*)">
247        <bygroups>
248          <token type="KeywordReserved"/>
249          <token type="Text"/>
250          <token type="NameClass"/>
251        </bygroups>
252      </rule>
253      <rule pattern="(exception|and)\b(\s*)([!%&$#+\-/:<=>?@\\~`^|*]+)">
254        <bygroups>
255          <token type="KeywordReserved"/>
256          <token type="Text"/>
257          <token type="NameClass"/>
258        </bygroups>
259      </rule>
260      <rule pattern="\b(of)\b(?!\')">
261        <token type="KeywordReserved"/>
262      </rule>
263      <rule>
264        <include state="breakout"/>
265      </rule>
266      <rule>
267        <include state="core"/>
268      </rule>
269      <rule pattern="\S+">
270        <token type="Error"/>
271      </rule>
272    </state>
273    <state name="vname">
274      <rule>
275        <include state="whitespace"/>
276      </rule>
277      <rule pattern="\'[\w\']*">
278        <token type="NameDecorator"/>
279      </rule>
280      <rule pattern="\(">
281        <token type="Punctuation"/>
282        <push state="tyvarseq"/>
283      </rule>
284      <rule pattern="([a-zA-Z][\w']*)(\s*)(=(?![!%&$#+\-/:<=>?@\\~`^|*]+))">
285        <bygroups>
286          <token type="NameVariable"/>
287          <token type="Text"/>
288          <token type="Punctuation"/>
289        </bygroups>
290        <pop depth="1"/>
291      </rule>
292      <rule pattern="([!%&$#+\-/:<=>?@\\~`^|*]+)(\s*)(=(?![!%&$#+\-/:<=>?@\\~`^|*]+))">
293        <bygroups>
294          <token type="NameVariable"/>
295          <token type="Text"/>
296          <token type="Punctuation"/>
297        </bygroups>
298        <pop depth="1"/>
299      </rule>
300      <rule pattern="([a-zA-Z][\w']*)">
301        <token type="NameVariable"/>
302        <pop depth="1"/>
303      </rule>
304      <rule pattern="([!%&$#+\-/:<=>?@\\~`^|*]+)">
305        <token type="NameVariable"/>
306        <pop depth="1"/>
307      </rule>
308      <rule>
309        <pop depth="1"/>
310      </rule>
311    </state>
312    <state name="sname">
313      <rule>
314        <include state="whitespace"/>
315      </rule>
316      <rule>
317        <include state="breakout"/>
318      </rule>
319      <rule pattern="([a-zA-Z][\w']*)">
320        <token type="NameNamespace"/>
321      </rule>
322      <rule>
323        <pop depth="1"/>
324      </rule>
325    </state>
326    <state name="main-fun">
327      <rule>
328        <include state="whitespace"/>
329      </rule>
330      <rule pattern="\s">
331        <token type="Text"/>
332      </rule>
333      <rule pattern="\(\*">
334        <token type="CommentMultiline"/>
335        <push state="comment"/>
336      </rule>
337      <rule pattern="\b(fun|and)\b(?!\')">
338        <token type="KeywordReserved"/>
339        <push state="fname"/>
340      </rule>
341      <rule pattern="\b(val)\b(?!\')">
342        <token type="KeywordReserved"/>
343        <push state="#pop" state="main" state="vname"/>
344      </rule>
345      <rule pattern="\|">
346        <token type="Punctuation"/>
347        <push state="fname"/>
348      </rule>
349      <rule pattern="\b(case|handle)\b(?!\')">
350        <token type="KeywordReserved"/>
351        <push state="#pop" state="main"/>
352      </rule>
353      <rule>
354        <include state="delimiters"/>
355      </rule>
356      <rule>
357        <include state="core"/>
358      </rule>
359      <rule pattern="\S+">
360        <token type="Error"/>
361      </rule>
362    </state>
363    <state name="datcon">
364      <rule>
365        <include state="whitespace"/>
366      </rule>
367      <rule pattern="([a-zA-Z][\w']*)">
368        <token type="NameClass"/>
369        <pop depth="1"/>
370      </rule>
371      <rule pattern="([!%&$#+\-/:<=>?@\\~`^|*]+)">
372        <token type="NameClass"/>
373        <pop depth="1"/>
374      </rule>
375      <rule pattern="\S+">
376        <token type="Error"/>
377        <pop depth="1"/>
378      </rule>
379    </state>
380    <state name="dotted">
381      <rule pattern="([a-zA-Z][\w']*)(\.)">
382        <token type="NameNamespace"/>
383      </rule>
384      <rule pattern="([a-zA-Z][\w']*)">
385        <token type="Name"/>
386        <pop depth="1"/>
387      </rule>
388      <rule pattern="([!%&$#+\-/:<=>?@\\~`^|*]+)">
389        <token type="Name"/>
390        <pop depth="1"/>
391      </rule>
392      <rule pattern="\s+">
393        <token type="Error"/>
394      </rule>
395      <rule pattern="\S+">
396        <token type="Error"/>
397      </rule>
398    </state>
399    <state name="main">
400      <rule>
401        <include state="whitespace"/>
402      </rule>
403      <rule pattern="\b(val|and)\b(?!\')">
404        <token type="KeywordReserved"/>
405        <push state="vname"/>
406      </rule>
407      <rule pattern="\b(fun)\b(?!\')">
408        <token type="KeywordReserved"/>
409        <push state="#pop" state="main-fun" state="fname"/>
410      </rule>
411      <rule>
412        <include state="delimiters"/>
413      </rule>
414      <rule>
415        <include state="core"/>
416      </rule>
417      <rule pattern="\S+">
418        <token type="Error"/>
419      </rule>
420    </state>
421    <state name="comment">
422      <rule pattern="[^(*)]">
423        <token type="CommentMultiline"/>
424      </rule>
425      <rule pattern="\(\*">
426        <token type="CommentMultiline"/>
427        <push/>
428      </rule>
429      <rule pattern="\*\)">
430        <token type="CommentMultiline"/>
431        <pop depth="1"/>
432      </rule>
433      <rule pattern="[(*)]">
434        <token type="CommentMultiline"/>
435      </rule>
436    </state>
437    <state name="whitespace">
438      <rule pattern="\s+">
439        <token type="Text"/>
440      </rule>
441      <rule pattern="\(\*">
442        <token type="CommentMultiline"/>
443        <push state="comment"/>
444      </rule>
445    </state>
446    <state name="core">
447      <rule pattern="(_|\}|\{|\)|;|,|\[|\(|\]|\.\.\.)">
448        <token type="Punctuation"/>
449      </rule>
450      <rule pattern="#"">
451        <token type="LiteralStringChar"/>
452        <push state="char"/>
453      </rule>
454      <rule pattern=""">
455        <token type="LiteralStringDouble"/>
456        <push state="string"/>
457      </rule>
458      <rule pattern="~?0x[0-9a-fA-F]+">
459        <token type="LiteralNumberHex"/>
460      </rule>
461      <rule pattern="0wx[0-9a-fA-F]+">
462        <token type="LiteralNumberHex"/>
463      </rule>
464      <rule pattern="0w\d+">
465        <token type="LiteralNumberInteger"/>
466      </rule>
467      <rule pattern="~?\d+\.\d+[eE]~?\d+">
468        <token type="LiteralNumberFloat"/>
469      </rule>
470      <rule pattern="~?\d+\.\d+">
471        <token type="LiteralNumberFloat"/>
472      </rule>
473      <rule pattern="~?\d+[eE]~?\d+">
474        <token type="LiteralNumberFloat"/>
475      </rule>
476      <rule pattern="~?\d+">
477        <token type="LiteralNumberInteger"/>
478      </rule>
479      <rule pattern="#\s*[1-9][0-9]*">
480        <token type="NameLabel"/>
481      </rule>
482      <rule pattern="#\s*([a-zA-Z][\w']*)">
483        <token type="NameLabel"/>
484      </rule>
485      <rule pattern="#\s+([!%&$#+\-/:<=>?@\\~`^|*]+)">
486        <token type="NameLabel"/>
487      </rule>
488      <rule pattern="\b(datatype|abstype)\b(?!\')">
489        <token type="KeywordReserved"/>
490        <push state="dname"/>
491      </rule>
492      <rule pattern="(?=\b(exception)\b(?!\'))">
493        <token type="Text"/>
494        <push state="ename"/>
495      </rule>
496      <rule pattern="\b(functor|include|open|signature|structure)\b(?!\')">
497        <token type="KeywordReserved"/>
498        <push state="sname"/>
499      </rule>
500      <rule pattern="\b(type|eqtype)\b(?!\')">
501        <token type="KeywordReserved"/>
502        <push state="tname"/>
503      </rule>
504      <rule pattern="\'[\w\']*">
505        <token type="NameDecorator"/>
506      </rule>
507      <rule pattern="([a-zA-Z][\w']*)(\.)">
508        <token type="NameNamespace"/>
509        <push state="dotted"/>
510      </rule>
511      <rule pattern="\b(abstype|and|andalso|as|case|datatype|do|else|end|exception|fn|fun|handle|if|in|infix|infixr|let|local|nonfix|of|op|open|orelse|raise|rec|then|type|val|with|withtype|while|eqtype|functor|include|sharing|sig|signature|struct|structure|where)\b">
512        <token type="KeywordReserved"/>
513      </rule>
514      <rule pattern="([a-zA-Z][\w']*)">
515        <token type="Name"/>
516      </rule>
517      <rule pattern="\b(:|\|,=|=>|->|#|:>)\b">
518        <token type="KeywordReserved"/>
519      </rule>
520      <rule pattern="([!%&$#+\-/:<=>?@\\~`^|*]+)">
521        <token type="Name"/>
522      </rule>
523    </state>
524    <state name="fname">
525      <rule>
526        <include state="whitespace"/>
527      </rule>
528      <rule pattern="\'[\w\']*">
529        <token type="NameDecorator"/>
530      </rule>
531      <rule pattern="\(">
532        <token type="Punctuation"/>
533        <push state="tyvarseq"/>
534      </rule>
535      <rule pattern="([a-zA-Z][\w']*)">
536        <token type="NameFunction"/>
537        <pop depth="1"/>
538      </rule>
539      <rule pattern="([!%&$#+\-/:<=>?@\\~`^|*]+)">
540        <token type="NameFunction"/>
541        <pop depth="1"/>
542      </rule>
543      <rule>
544        <pop depth="1"/>
545      </rule>
546    </state>
547  </rules>
548</lexer>