Mercurial > vim
annotate runtime/syntax/basic.vim @ 28551:1c4958ff5542
Added tag v8.2.4799 for changeset f59db757e4ef49e04255e2515112e82c0546d0c7
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 20 Apr 2022 21:00:06 +0200 |
parents | 5825405e4e2c |
children | 912224cab37f |
rev | line source |
---|---|
7 | 1 " Vim syntax file |
27459 | 2 " Language: BASIC (QuickBASIC 4.5) |
23737 | 3 " Maintainer: Doug Kearns <dougkearns@gmail.com> |
4 " Previous Maintainer: Allan Kelly <allan@fruitloaf.co.uk> | |
5 " Contributors: Thilo Six | |
27459 | 6 " Last Change: 2021 Aug 08 |
7 | 7 |
8 " First version based on Micro$soft QBASIC circa 1989, as documented in | |
9 " 'Learn BASIC Now' by Halvorson&Rygmyr. Microsoft Press 1989. | |
27459 | 10 " |
11 " Second version attempts to match Microsoft QuickBASIC 4.5 while keeping FreeBASIC | |
12 " (-lang qb) and QB64 (excluding extensions) in mind. -- DJK | |
7 | 13 |
23737 | 14 " Prelude {{{1 |
10048
43efa4f5a8ea
commit https://github.com/vim/vim/commit/89bcfda6834aba724d12554a34b9ed49f5789fd5
Christian Brabandt <cb@256bit.org>
parents:
3237
diff
changeset
|
15 if exists("b:current_syntax") |
7 | 16 finish |
17 endif | |
18 | |
3237 | 19 let s:cpo_save = &cpo |
20 set cpo&vim | |
21 | |
27459 | 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 | |
23737 | 179 " Keywords {{{1 |
27459 | 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 " }}} | |
7 | 235 |
27459 | 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 | |
7 | 270 |
23737 | 271 " Numbers {{{1 |
27459 | 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*\)\|[!#]\)\=\>" | |
7 | 281 |
27459 | 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 | |
7 | 293 |
27459 | 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:].]*[%&!#]\=" | |
23737 | 305 |
27459 | 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\>" | |
23737 | 313 |
27459 | 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 | |
7 | 319 |
23737 | 320 " Comments {{{1 |
27459 | 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 | |
7 | 336 |
23737 | 337 "syn sync ccomment basicComment |
338 | |
339 " Default Highlighting {{{1 | |
27459 | 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 Identifier | |
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 | |
7 | 373 |
23737 | 374 " Postscript {{{1 |
7 | 375 let b:current_syntax = "basic" |
376 | |
3237 | 377 let &cpo = s:cpo_save |
378 unlet s:cpo_save | |
23737 | 379 |
380 " vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker: |