basic.vim (9410B)
1 " Vim syntax file 2 " Language: BASIC (QuickBASIC 4.5) 3 " Maintainer: Doug Kearns <dougkearns@gmail.com> 4 " Previous Maintainer: Allan Kelly <allan@fruitloaf.co.uk> 5 " Contributors: Thilo Six 6 " Last Change: 2022 Jun 22 7 8 " First version based on Micro$soft QBASIC circa 1989, as documented in 9 " 'Learn BASIC Now' by Halvorson&Rygmyr. Microsoft Press 1989. 10 " 11 " Second version attempts to match Microsoft QuickBASIC 4.5 while keeping FreeBASIC 12 " (-lang qb) and QB64 (excluding extensions) in mind. -- DJK 13 14 " Prelude {{{1 15 if exists("b:current_syntax") 16 finish 17 endif 18 19 let s:cpo_save = &cpo 20 set cpo&vim 21 22 syn iskeyword @,48-57,.,!,#,%,&,$ 23 syn case ignore 24 25 " Whitespace Errors {{{1 26 if exists("basic_space_errors") 27 if !exists("basic_no_trail_space_error") 28 syn match basicSpaceError display excludenl "\s\+$" 29 endif 30 if !exists("basic_no_tab_space_error") 31 syn match basicSpaceError display " \+\t"me=e-1 32 endif 33 endif 34 35 " Comment Errors {{{1 36 if !exists("basic_no_comment_errors") 37 syn match basicCommentError "\<REM\>.*" 38 endif 39 40 " Not Top Cluster {{{1 41 syn cluster basicNotTop contains=@basicLineIdentifier,basicDataString,basicDataSeparator,basicTodo 42 43 " Statements {{{1 44 45 syn cluster basicStatements contains=basicStatement,basicDataStatement,basicMetaRemStatement,basicPutStatement,basicRemStatement 46 47 let s:statements =<< trim EOL " {{{2 48 beep 49 bload 50 bsave 51 call 52 calls 53 case 54 chain 55 chdir 56 circle 57 clear 58 close 59 cls 60 color 61 com 62 common 63 const 64 declare 65 def 66 def\s\+seg 67 defdbl 68 defint 69 deflng 70 defsng 71 defstr 72 dim 73 do 74 draw 75 elseif 76 end 77 end\s\+\%(def\|function\|if\|select\|sub\|type\) 78 environ 79 erase 80 error 81 exit\s\+\%(def\|do\|for\|function\|sub\) 82 field 83 files 84 for 85 function 86 get 87 gosub 88 goto 89 if 90 input 91 ioctl 92 key 93 kill 94 let 95 line 96 line\s\+input 97 locate 98 lock 99 loop 100 lprint 101 lset 102 mkdir 103 name 104 next 105 on 106 on\s\+error 107 on\s\+uevent 108 open 109 open\s\+com 110 option 111 out 112 paint 113 palette 114 palette\s\+using 115 pcopy 116 pen 117 pmap 118 poke 119 preset 120 print 121 pset 122 randomize 123 read 124 redim 125 reset 126 restore 127 resume 128 return 129 rmdir 130 rset 131 run 132 select\s\+case 133 shared 134 shell 135 sleep 136 sound 137 static 138 stop 139 strig 140 sub 141 swap 142 system 143 troff 144 tron 145 type 146 uevent 147 unlock 148 using 149 view 150 view\s\+print 151 wait 152 wend 153 while 154 width 155 window 156 write 157 EOL 158 " }}} 159 160 for s in s:statements 161 exe 'syn match basicStatement "\<' .. s .. '\>" contained' 162 endfor 163 164 syn match basicStatement "\<\%(then\|else\)\>" nextgroup=@basicStatements skipwhite 165 166 " DATA Statement 167 syn match basicDataSeparator "," contained 168 syn region basicDataStatement matchgroup=basicStatement start="\<data\>" matchgroup=basicStatementSeparator end=":\|$" contained contains=basicDataSeparator,basicDataString,basicNumber,basicFloat,basicString 169 170 if !exists("basic_no_data_fold") 171 syn region basicMultilineData start="^\s*\<data\>.*\n\%(^\s*\<data\>\)\@=" end="^\s*\<data\>.*\n\%(^\s*\<data\>\)\@!" contains=basicDataStatement transparent fold keepend 172 endif 173 174 " PUT File I/O and Graphics statements - needs special handling for graphics 175 " action verbs 176 syn match basicPutAction "\<\%(pset\|preset\|and\|or\|xor\)\>" contained 177 syn region basicPutStatement matchgroup=basicStatement start="\<put\>" matchgroup=basicStatementSeparator end=":\|$" contained contains=basicKeyword,basicPutAction,basicFilenumber 178 179 " Keywords {{{1 180 let s:keywords =<< trim EOL " {{{2 181 absolute 182 access 183 alias 184 append 185 as 186 base 187 binary 188 byval 189 cdecl 190 com 191 def 192 do 193 for 194 function 195 gosub 196 goto 197 input 198 int86old 199 int86xold 200 interrupt 201 interruptx 202 is 203 key 204 len 205 list 206 local 207 lock 208 lprint 209 next 210 off 211 on 212 output 213 pen 214 play 215 random 216 read 217 resume 218 screen 219 seg 220 shared 221 signal 222 static 223 step 224 stop 225 strig 226 sub 227 timer 228 to 229 until 230 using 231 while 232 write 233 EOL 234 " }}} 235 236 for k in s:keywords 237 exe 'syn match basicKeyword "\<' .. k .. '\>"' 238 endfor 239 240 " Functions {{{1 241 syn keyword basicFunction abs asc atn cdbl chr$ cint clng command$ cos csng 242 syn keyword basicFunction csrlin cvd cvdmbf cvi cvl cvs cvsmbf environ$ eof 243 syn keyword basicFunction erdev erdev$ erl err exp fileattr fix fre freefile 244 syn keyword basicFunction hex$ inkey$ inp input$ instr int ioctl$ left$ lbound 245 syn keyword basicFunction lcase$ len loc lof log lpos ltrim$ mkd$ mkdmbf$ mki$ 246 syn keyword basicFunction mkl$ mks$ mksmbf$ oct$ peek pen point pos right$ rnd 247 syn keyword basicFunction rtrim$ sadd setmem sgn sin space$ spc sqr stick str$ 248 syn keyword basicFunction strig string$ tab tan ubound ucase$ val valptr 249 syn keyword basicFunction valseg varptr varptr$ varseg 250 251 " Functions and statements (same name) {{{1 252 syn match basicStatement "\<\%(date\$\|mid\$\|play\|screen\|seek\|time\$\|timer\)\>" contained 253 syn match basicFunction "\<\%(date\$\|mid\$\|play\|screen\|seek\|time\$\|timer\)\>" 254 255 " Types {{{1 256 syn keyword basicType integer long single double string any 257 258 " Strings {{{1 259 260 " Unquoted DATA strings - anything except [:,] and leading or trailing whitespace 261 " Needs lower priority than numbers 262 syn match basicDataString "[^[:space:],:]\+\%(\s\+[^[:space:],:]\+\)*" contained 263 264 syn region basicString start=+"+ end=+"+ oneline 265 266 " Booleans {{{1 267 if exists("basic_booleans") 268 syn keyword basicBoolean true false 269 endif 270 271 " Numbers {{{1 272 273 " Integers 274 syn match basicNumber "-\=&o\=\o\+[%&]\=\>" 275 syn match basicNumber "-\=&h\x\+[%&]\=\>" 276 syn match basicNumber "-\=\<\d\+[%&]\=\>" 277 278 " Floats 279 syn match basicFloat "-\=\<\d\+\.\=\d*\%(\%([ed][+-]\=\d*\)\|[!#]\)\=\>" 280 syn match basicFloat "-\=\<\.\d\+\%(\%([ed][+-]\=\d*\)\|[!#]\)\=\>" 281 282 " Statement anchors {{{1 283 syn match basicLineStart "^" nextgroup=@basicStatements,@basicLineIdentifier skipwhite 284 syn match basicStatementSeparator ":" nextgroup=@basicStatements skipwhite 285 286 " Line numbers and labels {{{1 287 288 " QuickBASIC limits these to 65,529 and 40 chars respectively 289 syn match basicLineNumber "\d\+" nextgroup=@basicStatements skipwhite contained 290 syn match basicLineLabel "\a[[:alnum:]]*\ze\s*:" nextgroup=@basicStatements skipwhite contained 291 292 syn cluster basicLineIdentifier contains=basicLineNumber,basicLineLabel 293 294 " Line Continuation {{{1 295 syn match basicLineContinuation "\s*\zs_\ze\s*$" 296 297 " Type suffixes {{{1 298 if exists("basic_type_suffixes") 299 syn match basicTypeSuffix "\a[[:alnum:].]*\zs[$%&!#]" 300 endif 301 302 " File numbers {{{1 303 syn match basicFilenumber "#\d\+" 304 syn match basicFilenumber "#\a[[:alnum:].]*[%&!#]\=" 305 306 " Operators {{{1 307 if exists("basic_operators") 308 syn match basicArithmeticOperator "[-+*/\\^]" 309 syn match basicRelationalOperator "<>\|<=\|>=\|[><=]" 310 endif 311 syn match basicLogicalOperator "\<\%(not\|and\|or\|xor\|eqv\|imp\)\>" 312 syn match basicArithmeticOperator "\<mod\>" 313 314 " Metacommands {{{1 315 " Note: No trailing word boundaries. Text may be freely mixed however there 316 " must be only leading whitespace prior to the first metacommand 317 syn match basicMetacommand "$INCLUDE\s*:\s*'[^']\+'" contained containedin=@basicMetaComments 318 syn match basicMetacommand "$\%(DYNAMIC\|STATIC\)" contained containedin=@basicMetaComments 319 320 " Comments {{{1 321 syn keyword basicTodo TODO FIXME XXX NOTE contained 322 323 syn region basicRemStatement matchgroup=basicStatement start="REM\>" end="$" contains=basicTodo,@Spell contained 324 syn region basicComment start="'" end="$" contains=basicTodo,@Spell 325 326 if !exists("basic_no_comment_fold") 327 syn region basicMultilineComment start="^\s*'.*\n\%(\s*'\)\@=" end="^\s*'.*\n\%(\s*'\)\@!" contains=@basicComments transparent fold keepend 328 endif 329 330 " Metacommands 331 syn region basicMetaRemStatement matchgroup=basicStatement start="REM\>\s*\$\@=" end="$" contains=basicTodo contained 332 syn region basicMetaComment start="'\s*\$\@=" end="$" contains=basicTodo 333 334 syn cluster basicMetaComments contains=basicMetaComment,basicMetaRemStatement 335 syn cluster basicComments contains=basicComment,basicMetaComment 336 337 "syn sync ccomment basicComment 338 339 " Default Highlighting {{{1 340 hi def link basicArithmeticOperator basicOperator 341 hi def link basicBoolean Boolean 342 hi def link basicComment Comment 343 hi def link basicCommentError Error 344 hi def link basicDataString basicString 345 hi def link basicFilenumber basicTypeSuffix " TODO: better group 346 hi def link basicFloat Float 347 hi def link basicFunction Function 348 hi def link basicKeyword Keyword 349 hi def link basicLineIdentifier LineNr 350 hi def link basicLineContinuation Special 351 hi def link basicLineLabel basicLineIdentifier 352 hi def link basicLineNumber basicLineIdentifier 353 hi def link basicLogicalOperator basicOperator 354 hi def link basicMetacommand SpecialComment 355 hi def link basicMetaComment Comment 356 hi def link basicMetaRemStatement Comment 357 hi def link basicNumber Number 358 hi def link basicOperator Operator 359 hi def link basicPutAction Keyword 360 hi def link basicRelationalOperator basicOperator 361 hi def link basicRemStatement Comment 362 hi def link basicSpaceError Error 363 hi def link basicStatementSeparator Special 364 hi def link basicStatement Statement 365 hi def link basicString String 366 hi def link basicTodo Todo 367 hi def link basicType Type 368 hi def link basicTypeSuffix Special 369 if exists("basic_legacy_syntax_groups") 370 hi def link basicTypeSpecifier Type 371 hi def link basicTypeSuffix basicTypeSpecifier 372 endif 373 374 " Postscript {{{1 375 let b:current_syntax = "basic" 376 377 let &cpo = s:cpo_save 378 unlet s:cpo_save 379 380 " vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker: