1" Vim syntax file
2" Language: Monk (See-Beyond Technologies)
3" Maintainer: Mike Litherland <litherm@ccf.org>
4" Last Change: March 6, 2002
5
6" This syntax file is good enough for my needs, but others
7" may desire more features.  Suggestions and bug reports
8" are solicited by the author (above).
9
10" Originally based on the Scheme syntax file by:
11
12" Maintainer:	Dirk van Deun <dvandeun@poboxes.com>
13" Last Change:	April 30, 1998
14
15" In fact it's almost identical. :)
16
17" The original author's notes:
18" This script incorrectly recognizes some junk input as numerals:
19" parsing the complete system of Scheme numerals using the pattern
20" language is practically impossible: I did a lax approximation.
21
22" Initializing:
23
24" For version 5.x: Clear all syntax items
25" For version 6.x: Quit when a syntax file was already loaded
26if version < 600
27  syntax clear
28elseif exists("b:current_syntax")
29  finish
30endif
31
32syn case ignore
33
34" Fascist highlighting: everything that doesn't fit the rules is an error...
35
36syn match	monkError	oneline    ![^ \t()";]*!
37syn match	monkError	oneline    ")"
38
39" Quoted and backquoted stuff
40
41syn region monkQuoted matchgroup=Delimiter start="['`]" end=![ \t()";]!me=e-1 contains=ALLBUT,monkStruc,monkSyntax,monkFunc
42
43syn region monkQuoted matchgroup=Delimiter start="['`](" matchgroup=Delimiter end=")" contains=ALLBUT,monkStruc,monkSyntax,monkFunc
44syn region monkQuoted matchgroup=Delimiter start="['`]#(" matchgroup=Delimiter end=")" contains=ALLBUT,monkStruc,monkSyntax,monkFunc
45
46syn region monkStrucRestricted matchgroup=Delimiter start="(" matchgroup=Delimiter end=")" contains=ALLBUT,monkStruc,monkSyntax,monkFunc
47syn region monkStrucRestricted matchgroup=Delimiter start="#(" matchgroup=Delimiter end=")" contains=ALLBUT,monkStruc,monkSyntax,monkFunc
48
49syn region monkUnquote matchgroup=Delimiter start="," end=![ \t()";]!me=e-1 contains=ALLBUT,monkStruc,monkSyntax,monkFunc
50syn region monkUnquote matchgroup=Delimiter start=",@" end=![ \t()";]!me=e-1 contains=ALLBUT,monkStruc,monkSyntax,monkFunc
51
52syn region monkUnquote matchgroup=Delimiter start=",(" end=")" contains=ALLBUT,monkStruc,monkSyntax,monkFunc
53syn region monkUnquote matchgroup=Delimiter start=",@(" end=")" contains=ALLBUT,monkStruc,monkSyntax,monkFunc
54
55syn region monkUnquote matchgroup=Delimiter start=",#(" end=")" contains=ALLBUT,monkStruc,monkSyntax,monkFunc
56syn region monkUnquote matchgroup=Delimiter start=",@#(" end=")" contains=ALLBUT,monkStruc,monkSyntax,monkFunc
57
58" R5RS Scheme Functions and Syntax:
59
60if version < 600
61  set iskeyword=33,35-39,42-58,60-90,94,95,97-122,126,_
62else
63  setlocal iskeyword=33,35-39,42-58,60-90,94,95,97-122,126,_
64endif
65
66syn keyword monkSyntax lambda and or if cond case define let let* letrec
67syn keyword monkSyntax begin do delay set! else =>
68syn keyword monkSyntax quote quasiquote unquote unquote-splicing
69syn keyword monkSyntax define-syntax let-syntax letrec-syntax syntax-rules
70
71syn keyword monkFunc not boolean? eq? eqv? equal? pair? cons car cdr set-car!
72syn keyword monkFunc set-cdr! caar cadr cdar cddr caaar caadr cadar caddr
73syn keyword monkFunc cdaar cdadr cddar cdddr caaaar caaadr caadar caaddr
74syn keyword monkFunc cadaar cadadr caddar cadddr cdaaar cdaadr cdadar cdaddr
75syn keyword monkFunc cddaar cddadr cdddar cddddr null? list? list length
76syn keyword monkFunc append reverse list-ref memq memv member assq assv assoc
77syn keyword monkFunc symbol? symbol->string string->symbol number? complex?
78syn keyword monkFunc real? rational? integer? exact? inexact? = < > <= >=
79syn keyword monkFunc zero? positive? negative? odd? even? max min + * - / abs
80syn keyword monkFunc quotient remainder modulo gcd lcm numerator denominator
81syn keyword monkFunc floor ceiling truncate round rationalize exp log sin cos
82syn keyword monkFunc tan asin acos atan sqrt expt make-rectangular make-polar
83syn keyword monkFunc real-part imag-part magnitude angle exact->inexact
84syn keyword monkFunc inexact->exact number->string string->number char=?
85syn keyword monkFunc char-ci=? char<? char-ci<? char>? char-ci>? char<=?
86syn keyword monkFunc char-ci<=? char>=? char-ci>=? char-alphabetic? char?
87syn keyword monkFunc char-numeric? char-whitespace? char-upper-case?
88syn keyword monkFunc char-lower-case?
89syn keyword monkFunc char->integer integer->char char-upcase char-downcase
90syn keyword monkFunc string? make-string string string-length string-ref
91syn keyword monkFunc string-set! string=? string-ci=? string<? string-ci<?
92syn keyword monkFunc string>? string-ci>? string<=? string-ci<=? string>=?
93syn keyword monkFunc string-ci>=? substring string-append vector? make-vector
94syn keyword monkFunc vector vector-length vector-ref vector-set! procedure?
95syn keyword monkFunc apply map for-each call-with-current-continuation
96syn keyword monkFunc call-with-input-file call-with-output-file input-port?
97syn keyword monkFunc output-port? current-input-port current-output-port
98syn keyword monkFunc open-input-file open-output-file close-input-port
99syn keyword monkFunc close-output-port eof-object? read read-char peek-char
100syn keyword monkFunc write display newline write-char call/cc
101syn keyword monkFunc list-tail string->list list->string string-copy
102syn keyword monkFunc string-fill! vector->list list->vector vector-fill!
103syn keyword monkFunc force with-input-from-file with-output-to-file
104syn keyword monkFunc char-ready? load transcript-on transcript-off eval
105syn keyword monkFunc dynamic-wind port? values call-with-values
106syn keyword monkFunc monk-report-environment null-environment
107syn keyword monkFunc interaction-environment
108
109" Keywords specific to STC's implementation
110
111syn keyword monkFunc $event-clear $event-parse $event->string $make-event-map
112syn keyword monkFunc $resolve-event-definition change-pattern copy copy-strip
113syn keyword monkFunc count-data-children count-map-children count-rep data-map
114syn keyword monkFunc duplicate duplicate-strip file-check file-lookup get
115syn keyword monkFunc insert list-lookup node-has-data? not-verify path?
116syn keyword monkFunc path-defined-as-repeating? path-nodeclear path-nodedepth
117syn keyword monkFunc path-nodename path-nodeparentname path->string path-valid?
118syn keyword monkFunc regex string->path timestamp uniqueid verify
119
120" Keywords from the Monk function library (from e*Gate 4.1 programmers ref)
121syn keyword monkFunc allcap? capitalize char-punctuation? char-substitute
122syn keyword monkFunc char-to-char conv count-used-children degc->degf
123syn keyword monkFunc diff-two-dates display-error empty-string? fail_id
124syn keyword monkFunc fail_id_if fail_translation fail_translation_if
125syn keyword monkFunc find-get-after find-get-before get-timestamp julian-date?
126syn keyword monkFunc julian->standard leap-year? map-string not-empty-string?
127syn keyword monkFunc standard-date? standard->julian string-begins-with?
128syn keyword monkFunc string-contains? string-ends-with? string-search-from-left
129syn keyword monkFunc string-search-from-right string->ssn strip-punct
130syn keyword monkFunc strip-string substring=? symbol-table-get symbol-table-put
131syn keyword monkFunc trim-string-left trim-string-right valid-decimal?
132syn keyword monkFunc valid-integer? verify-type
133
134" Writing out the complete description of Scheme numerals without
135" using variables is a day's work for a trained secretary...
136" This is a useful lax approximation:
137
138syn match	monkNumber	oneline    "[-#+0-9.][-#+/0-9a-f@i.boxesfdl]*"
139syn match	monkError	oneline    ![-#+0-9.][-#+/0-9a-f@i.boxesfdl]*[^-#+/0-9a-f@i.boxesfdl \t()";][^ \t()";]*!
140
141syn match	monkOther	oneline    ![+-][ \t()";]!me=e-1
142syn match	monkOther	oneline    ![+-]$!
143" ... so that a single + or -, inside a quoted context, would not be
144" interpreted as a number (outside such contexts, it's a monkFunc)
145
146syn match	monkDelimiter	oneline    !\.[ \t()";]!me=e-1
147syn match	monkDelimiter	oneline    !\.$!
148" ... and a single dot is not a number but a delimiter
149
150" Simple literals:
151
152syn match	monkBoolean	oneline    "#[tf]"
153syn match	monkError	oneline    !#[tf][^ \t()";]\+!
154
155syn match	monkChar	oneline    "#\\"
156syn match	monkChar	oneline    "#\\."
157syn match	monkError	oneline    !#\\.[^ \t()";]\+!
158syn match	monkChar	oneline    "#\\space"
159syn match	monkError	oneline    !#\\space[^ \t()";]\+!
160syn match	monkChar	oneline    "#\\newline"
161syn match	monkError	oneline    !#\\newline[^ \t()";]\+!
162
163" This keeps all other stuff unhighlighted, except *stuff* and <stuff>:
164
165syn match	monkOther	oneline    ,[a-z!$%&*/:<=>?^_~][-a-z!$%&*/:<=>?^_~0-9+.@]*,
166syn match	monkError	oneline    ,[a-z!$%&*/:<=>?^_~][-a-z!$%&*/:<=>?^_~0-9+.@]*[^-a-z!$%&*/:<=>?^_~0-9+.@ \t()";]\+[^ \t()";]*,
167
168syn match	monkOther	oneline    "\.\.\."
169syn match	monkError	oneline    !\.\.\.[^ \t()";]\+!
170" ... a special identifier
171
172syn match	monkConstant	oneline    ,\*[-a-z!$%&*/:<=>?^_~0-9+.@]*\*[ \t()";],me=e-1
173syn match	monkConstant	oneline    ,\*[-a-z!$%&*/:<=>?^_~0-9+.@]*\*$,
174syn match	monkError	oneline    ,\*[-a-z!$%&*/:<=>?^_~0-9+.@]*\*[^-a-z!$%&*/:<=>?^_~0-9+.@ \t()";]\+[^ \t()";]*,
175
176syn match	monkConstant	oneline    ,<[-a-z!$%&*/:<=>?^_~0-9+.@]*>[ \t()";],me=e-1
177syn match	monkConstant	oneline    ,<[-a-z!$%&*/:<=>?^_~0-9+.@]*>$,
178syn match	monkError	oneline    ,<[-a-z!$%&*/:<=>?^_~0-9+.@]*>[^-a-z!$%&*/:<=>?^_~0-9+.@ \t()";]\+[^ \t()";]*,
179
180" Monk input and output structures
181syn match	monkSyntax	oneline    "\(\~input\|\[I\]->\)[^ \t]*"
182syn match	monkFunc	oneline    "\(\~output\|\[O\]->\)[^ \t]*"
183
184" Non-quoted lists, and strings:
185
186syn region monkStruc matchgroup=Delimiter start="(" matchgroup=Delimiter end=")" contains=ALL
187syn region monkStruc matchgroup=Delimiter start="#(" matchgroup=Delimiter end=")" contains=ALL
188
189syn region	monkString	start=+"+  skip=+\\[\\"]+ end=+"+
190
191" Comments:
192
193syn match	monkComment	";.*$"
194
195" Synchronization and the wrapping up...
196
197syn sync match matchPlace grouphere NONE "^[^ \t]"
198" ... i.e. synchronize on a line that starts at the left margin
199
200" Define the default highlighting.
201" For version 5.7 and earlier: only when not done already
202" For version 5.8 and later: only when an item doesn't have highlighting yet
203if version >= 508 || !exists("did_monk_syntax_inits")
204  if version < 508
205    let did_monk_syntax_inits = 1
206    command -nargs=+ HiLink hi link <args>
207  else
208    command -nargs=+ HiLink hi def link <args>
209  endif
210
211  HiLink monkSyntax		Statement
212  HiLink monkFunc		Function
213
214  HiLink monkString		String
215  HiLink monkChar		Character
216  HiLink monkNumber		Number
217  HiLink monkBoolean		Boolean
218
219  HiLink monkDelimiter	Delimiter
220  HiLink monkConstant	Constant
221
222  HiLink monkComment		Comment
223  HiLink monkError		Error
224
225  delcommand HiLink
226endif
227
228let b:current_syntax = "monk"
229