summaryrefslogtreecommitdiffstats
path: root/runtime/syntax/basic.vim
blob: b6bf23a3edcf3953c27e8291dcc3565cc4fb5d91 (plain)
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
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
" Vim syntax file
" Language:		BASIC (QuickBASIC 4.5)
" Maintainer:		Doug Kearns <dougkearns@gmail.com>
" Previous Maintainer:	Allan Kelly <allan@fruitloaf.co.uk>
" Contributors:		Thilo Six
" Last Change:		2022 Jun 22

" First version based on Micro$soft QBASIC circa 1989, as documented in
" 'Learn BASIC Now' by Halvorson&Rygmyr. Microsoft Press 1989.
"
" Second version attempts to match Microsoft QuickBASIC 4.5 while keeping FreeBASIC
" (-lang qb) and QB64 (excluding extensions) in mind. -- DJK

" Prelude {{{1
if exists("b:current_syntax")
  finish
endif

let s:cpo_save = &cpo
set cpo&vim

syn iskeyword @,48-57,.,!,#,%,&,$
syn case      ignore

" Whitespace Errors {{{1
if exists("basic_space_errors")
  if !exists("basic_no_trail_space_error")
    syn match basicSpaceError display excludenl "\s\+$"
  endif
  if !exists("basic_no_tab_space_error")
    syn match basicSpaceError display " \+\t"me=e-1
  endif
endif

" Comment Errors {{{1
if !exists("basic_no_comment_errors")
  syn match basicCommentError "\<REM\>.*"
endif

" Not Top Cluster {{{1
syn cluster basicNotTop contains=@basicLineIdentifier,basicDataString,basicDataSeparator,basicTodo

" Statements {{{1

syn cluster basicStatements contains=basicStatement,basicDataStatement,basicMetaRemStatement,basicPutStatement,basicRemStatement

let s:statements =<< trim EOL " {{{2
  beep
  bload
  bsave
  call
  calls
  case
  chain
  chdir
  circle
  clear
  close
  cls
  color
  com
  common
  const
  declare
  def
  def\s\+seg
  defdbl
  defint
  deflng
  defsng
  defstr
  dim
  do
  draw
  elseif
  end
  end\s\+\%(def\|function\|if\|select\|sub\|type\)
  environ
  erase
  error
  exit\s\+\%(def\|do\|for\|function\|sub\)
  field
  files
  for
  function
  get
  gosub
  goto
  if
  input
  ioctl
  key
  kill
  let
  line
  line\s\+input
  locate
  lock
  loop
  lprint
  lset
  mkdir
  name
  next
  on
  on\s\+error
  on\s\+uevent
  open
  open\s\+com
  option
  out
  paint
  palette
  palette\s\+using
  pcopy
  pen
  pmap
  poke
  preset
  print
  pset
  randomize
  read
  redim
  reset
  restore
  resume
  return
  rmdir
  rset
  run
  select\s\+case
  shared
  shell
  sleep
  sound
  static
  stop
  strig
  sub
  swap
  system
  troff
  tron
  type
  uevent
  unlock
  using
  view
  view\s\+print
  wait
  wend
  while
  width
  window
  write
EOL
" }}}

for s in s:statements
  exe 'syn match basicStatement "\<' .. s .. '\>" contained'
endfor

syn match basicStatement "\<\%(then\|else\)\>" nextgroup=@basicStatements skipwhite

" DATA Statement
syn match  basicDataSeparator "," contained
syn region basicDataStatement matchgroup=basicStatement start="\<data\>" matchgroup=basicStatementSeparator end=":\|$" contained contains=basicDataSeparator,basicDataString,basicNumber,basicFloat,basicString

if !exists("basic_no_data_fold")
  syn region basicMultilineData start="^\s*\<data\>.*\n\%(^\s*\<data\>\)\@=" end="^\s*\<data\>.*\n\%(^\s*\<data\>\)\@!" contains=basicDataStatement transparent fold keepend
endif

" PUT File I/O and Graphics statements - needs special handling for graphics
" action verbs
syn match  basicPutAction "\<\%(pset\|preset\|and\|or\|xor\)\>" contained
syn region basicPutStatement matchgroup=basicStatement start="\<put\>" matchgroup=basicStatementSeparator end=":\|$" contained contains=basicKeyword,basicPutAction,basicFilenumber

" Keywords {{{1
let s:keywords =<< trim EOL " {{{2
  absolute
  access
  alias
  append
  as
  base
  binary
  byval
  cdecl
  com
  def
  do
  for
  function
  gosub
  goto
  input
  int86old
  int86xold
  interrupt
  interruptx
  is
  key
  len
  list
  local
  lock
  lprint
  next
  off
  on
  output
  pen
  play
  random
  read
  resume
  screen
  seg
  shared
  signal
  static
  step
  stop
  strig
  sub
  timer
  to
  until
  using
  while
  write
EOL
" }}}

for k in s:keywords
  exe 'syn match basicKeyword "\<' .. k .. '\>"'
endfor

" Functions {{{1
syn keyword basicFunction abs asc atn cdbl chr$ cint clng command$ cos csng
syn keyword basicFunction csrlin cvd cvdmbf cvi cvl cvs cvsmbf environ$ eof
syn keyword basicFunction erdev erdev$ erl err exp fileattr fix fre freefile
syn keyword basicFunction hex$ inkey$ inp input$ instr int ioctl$ left$ lbound
syn keyword basicFunction lcase$ len loc lof log lpos ltrim$ mkd$ mkdmbf$ mki$
syn keyword basicFunction mkl$ mks$ mksmbf$ oct$ peek pen point pos right$ rnd
syn keyword basicFunction rtrim$ sadd setmem sgn sin space$ spc sqr stick str$
syn keyword basicFunction strig string$ tab tan ubound ucase$ val valptr
syn keyword basicFunction valseg varptr varptr$ varseg

" Functions and statements (same name) {{{1
syn match   basicStatement "\<\%(date\$\|mid\$\|play\|screen\|seek\|time\$\|timer\)\>" contained
syn match   basicFunction  "\<\%(date\$\|mid\$\|play\|screen\|seek\|time\$\|timer\)\>"

" Types {{{1
syn keyword basicType integer long single double string any

" Strings {{{1

" Unquoted DATA strings - anything except [:,] and leading or trailing whitespace
" Needs lower priority than numbers
syn match basicDataString "[^[:space:],:]\+\%(\s\+[^[:space:],:]\+\)*" contained

syn region basicString start=+"+ end=+"+ oneline

" Booleans {{{1
if exists("basic_booleans")
  syn keyword basicBoolean true false
endif

" Numbers {{{1

" Integers
syn match basicNumber "-\=&o\=\o\+[%&]\=\>"
syn match basicNumber "-\=&h\x\+[%&]\=\>"
syn match basicNumber "-\=\<\d\+[%&]\=\>"

" Floats
syn match basicFloat "-\=\<\d\+\.\=\d*\%(\%([ed][+-]\=\d*\)\|[!#]\)\=\>"
syn match basicFloat      "-\=\<\.\d\+\%(\%([ed][+-]\=\d*\)\|[!#]\)\=\>"

" Statement anchors {{{1
syn match basicLineStart	  "^" nextgroup=@basicStatements,@basicLineIdentifier skipwhite
syn match basicStatementSeparator ":" nextgroup=@basicStatements		      skipwhite

" Line numbers and labels {{{1

" QuickBASIC limits these to 65,529 and 40 chars respectively
syn match basicLineNumber "\d\+"		  nextgroup=@basicStatements skipwhite contained
syn match basicLineLabel  "\a[[:alnum:]]*\ze\s*:" nextgroup=@basicStatements skipwhite contained

syn cluster basicLineIdentifier contains=basicLineNumber,basicLineLabel

" Line Continuation {{{1
syn match basicLineContinuation "\s*\zs_\ze\s*$"

" Type suffixes {{{1
if exists("basic_type_suffixes")
  syn match basicTypeSuffix "\a[[:alnum:].]*\zs[$%&!#]"
endif

" File numbers {{{1
syn match basicFilenumber "#\d\+"
syn match basicFilenumber "#\a[[:alnum:].]*[%&!#]\="

" Operators {{{1
if exists("basic_operators")
  syn match basicArithmeticOperator "[-+*/\\^]"
  syn match basicRelationalOperator "<>\|<=\|>=\|[><=]"
endif
syn match basicLogicalOperator	  "\<\%(not\|and\|or\|xor\|eqv\|imp\)\>"
syn match basicArithmeticOperator "\<mod\>"

" Metacommands {{{1
" Note: No trailing word boundaries.  Text may be freely mixed however there
" must be only leading whitespace prior to the first metacommand
syn match basicMetacommand "$INCLUDE\s*:\s*'[^']\+'" contained containedin=@basicMetaComments
syn match basicMetacommand "$\%(DYNAMIC\|STATIC\)"   contained containedin=@basicMetaComments

" Comments {{{1
syn keyword basicTodo TODO FIXME XXX NOTE contained

syn region basicRemStatement matchgroup=basicStatement start="REM\>" end="$" contains=basicTodo,@Spell contained
syn region basicComment				       start="'"     end="$" contains=basicTodo,@Spell

if !exists("basic_no_comment_fold")
  syn region basicMultilineComment start="^\s*'.*\n\%(\s*'\)\@=" end="^\s*'.*\n\%(\s*'\)\@!" contains=@basicComments transparent fold keepend
endif

" Metacommands
syn region  basicMetaRemStatement matchgroup=basicStatement start="REM\>\s*\$\@=" end="$" contains=basicTodo contained
syn region  basicMetaComment				    start="'\s*\$\@="	  end="$" contains=basicTodo

syn cluster basicMetaComments contains=basicMetaComment,basicMetaRemStatement
syn cluster basicComments     contains=basicComment,basicMetaComment

"syn sync ccomment basicComment

" Default Highlighting {{{1
hi def link basicArithmeticOperator basicOperator
hi def link basicBoolean	    Boolean
hi def link basicComment	    Comment
hi def link basicCommentError	    Error
hi def link basicDataString	    basicString
hi def link basicFilenumber	    basicTypeSuffix " TODO: better group
hi def link basicFloat		    Float
hi def link basicFunction	    Function
hi def link basicKeyword	    Keyword
hi def link basicLineIdentifier	    LineNr
hi def link basicLineContinuation   Special
hi def link basicLineLabel	    basicLineIdentifier
hi def link basicLineNumber	    basicLineIdentifier
hi def link basicLogicalOperator    basicOperator
hi def link basicMetacommand	    SpecialComment
hi def link basicMetaComment	    Comment
hi def link basicMetaRemStatement   Comment
hi def link basicNumber		    Number
hi def link basicOperator	    Operator
hi def link basicPutAction	    Keyword
hi def link basicRelationalOperator basicOperator
hi def link basicRemStatement	    Comment
hi def link basicSpaceError	    Error
hi def link basicStatementSeparator Special
hi def link basicStatement	    Statement
hi def link basicString		    String
hi def link basicTodo		    Todo
hi def link basicType		    Type
hi def link basicTypeSuffix	    Special
if exists("basic_legacy_syntax_groups")
  hi def link basicTypeSpecifier      Type
  hi def link basicTypeSuffix	      basicTypeSpecifier
endif

" Postscript {{{1
let b:current_syntax = "basic"

let &cpo = s:cpo_save
unlet s:cpo_save

" vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker: