xref: /vim-8.2.3635/runtime/syntax/fortran.vim (revision 00a927d6)
1" Vim syntax file
2" Language:	Fortran95 (and Fortran90, Fortran77, F and elf90)
3" Version:	0.88
4" URL:		http://www.unb.ca/chem/ajit/syntax/fortran.vim
5" Last Change:	2008 Nov 01
6" Maintainer:	Ajit J. Thakkar (ajit AT unb.ca); <http://www.unb.ca/chem/ajit/>
7" Usage:	Do :help fortran-syntax from Vim
8" Credits:
9"  Version 0.1 was based on the fortran 77 syntax file by Mario Eusebio and
10"  Preben Guldberg. Useful suggestions were made by: Andrej Panjkov,
11"  Bram Moolenaar, Thomas Olsen, Michael Sternberg, Christian Reile,
12"  Walter Dieudonn�, Alexander Wagner, Roman Bertle, Charles Rendleman,
13"  and Andrew Griffiths. For instructions on use, do :help fortran from vim
14
15" For version 5.x: Clear all syntax items
16" For version 6.x: Quit if a syntax file is already loaded
17if version < 600
18  syntax clear
19elseif exists("b:current_syntax")
20  finish
21endif
22
23" let b:fortran_dialect = fortran_dialect if set correctly by user
24if exists("fortran_dialect")
25  if fortran_dialect =~ '\<\(f\(9[05]\|77\)\|elf\|F\)\>'
26    let b:fortran_dialect = matchstr(fortran_dialect,'\<\(f\(9[05]\|77\)\|elf\|F\)\>')
27  else
28    echohl WarningMsg | echo "Unknown value of fortran_dialect" | echohl None
29    let b:fortran_dialect = "unknown"
30  endif
31else
32  let b:fortran_dialect = "unknown"
33endif
34
35" fortran_dialect not set or set incorrectly by user,
36if b:fortran_dialect == "unknown"
37  " set b:fortran_dialect from directive in first three lines of file
38  let b:fortran_retype = getline(1)." ".getline(2)." ".getline(3)
39  if b:fortran_retype =~ '\<fortran_dialect\s*=\s*F\>'
40    let b:fortran_dialect = "F"
41  elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*elf\>'
42    let b:fortran_dialect = "elf"
43  elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f90\>'
44    let b:fortran_dialect = "f90"
45  elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f95\>'
46    let b:fortran_dialect = "f95"
47  elseif b:fortran_retype =~ '\<fortran_dialect\s*=\s*f77\>'
48    let b:fortran_dialect = "f77"
49  else
50    " no directive found, so assume f95
51    let b:fortran_dialect = "f95"
52  endif
53  unlet b:fortran_retype
54endif
55
56" Choose between fixed and free source form if this hasn't been done yet
57if !exists("b:fortran_fixed_source")
58  if b:fortran_dialect == "elf" || b:fortran_dialect == "F"
59    " elf and F require free source form
60    let b:fortran_fixed_source = 0
61  elseif b:fortran_dialect == "f77"
62    " f77 requires fixed source form
63    let b:fortran_fixed_source = 1
64  elseif exists("fortran_free_source")
65    " User guarantees free source form for all f90 and f95 files
66    let b:fortran_fixed_source = 0
67  elseif exists("fortran_fixed_source")
68    " User guarantees fixed source form for all f90 and f95 files
69    let b:fortran_fixed_source = 1
70  else
71    " f90 and f95 allow both fixed and free source form.
72    " Assume fixed source form unless signs of free source form
73    " are detected in the first five columns of the first b:lmax lines.
74    " Detection becomes more accurate and time-consuming if more lines
75    " are checked. Increase the limit below if you keep lots of comments at
76    " the very top of each file and you have a fast computer.
77    let b:lmax = 250
78    if ( b:lmax > line("$") )
79      let b:lmax = line("$")
80    endif
81    let b:fortran_fixed_source = 1
82    let b:ln=1
83    while b:ln <= b:lmax
84      let b:test = strpart(getline(b:ln),0,5)
85      if b:test[0] !~ '[Cc*!#]' && b:test !~ '^ \+[!#]' && b:test =~ '[^ 0-9\t]'
86	let b:fortran_fixed_source = 0
87	break
88      endif
89      let b:ln = b:ln + 1
90    endwhile
91    unlet b:lmax b:ln b:test
92  endif
93endif
94
95syn case ignore
96
97if b:fortran_dialect !=? "f77"
98  if version >= 600
99    if b:fortran_fixed_source == 1
100      syn match fortranConstructName	"^\s\{6,}\zs\a\w*\ze\s*:"
101    else
102      syn match fortranConstructName	"^\s*\zs\a\w*\ze\s*:"
103    endif
104    if exists("fortran_more_precise")
105      syn match fortranConstructName "\(\<end\s*do\s\+\)\@<=\a\w*"
106      syn match fortranConstructName "\(\<end\s*if\s\+\)\@<=\a\w*"
107      syn match fortranConstructName "\(\<end\s*select\s\+\)\@<=\a\w*"
108    endif
109  else
110    if b:fortran_fixed_source == 1
111      syn match fortranConstructName	"^\s\{6,}\a\w*\s*:"
112    else
113      syn match fortranConstructName	"^\s*\a\w*\s*:"
114    endif
115  endif
116endif
117
118syn match   fortranUnitHeader	"\<end\>"
119
120syn match fortranType		"\<character\>"
121syn match fortranType		"\<complex\>"
122syn match fortranType		"\<integer\>"
123syn keyword fortranType		intrinsic
124syn match fortranType		"\<implicit\>"
125syn keyword fortranStructure	dimension
126syn keyword fortranStorageClass	parameter save
127syn match fortranUnitHeader	"\<subroutine\>"
128syn keyword fortranCall		call
129syn match fortranUnitHeader	"\<function\>"
130syn match fortranUnitHeader	"\<program\>"
131syn keyword fortranKeyword	return stop
132syn keyword fortranConditional	else then
133syn match fortranConditional	"\<if\>"
134syn match fortranRepeat		"\<do\>"
135
136syn keyword fortranTodo		contained todo fixme
137
138"Catch errors caused by too many right parentheses
139syn region fortranParen transparent start="(" end=")" contains=ALLBUT,fortranParenError,@fortranCommentGroup,cIncluded,@spell
140syn match  fortranParenError   ")"
141
142syn match fortranOperator	"\.\s*n\=eqv\s*\."
143syn match fortranOperator	"\.\s*\(and\|or\|not\)\s*\."
144syn match fortranOperator	"\(+\|-\|/\|\*\)"
145
146syn match fortranBoolean	"\.\s*\(true\|false\)\s*\."
147
148syn keyword fortranReadWrite	backspace close endfile inquire open print read rewind write
149
150"If tabs are allowed then the left margin checks do not work
151if exists("fortran_have_tabs")
152  syn match fortranTab		"\t"  transparent
153else
154  syn match fortranTab		"\t"
155endif
156
157syn keyword fortranIO		access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit
158
159syn keyword fortran66Intrinsic		alog alog10 amax0 amax1 amin0 amin1 amod cabs ccos cexp clog csin csqrt dabs dacos dasin datan datan2 dcos dcosh ddim dexp dint dlog dlog10 dmax1 dmin1 dmod dnint dsign dsin dsinh dsqrt dtan dtanh float iabs idim idint idnint ifix isign max0 max1 min0 min1 sngl
160
161" Intrinsics provided by some vendors
162syn keyword fortranExtraIntrinsic	algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama erf erfc gamma iqint qabs qacos qasin qatan qatan2 qcmplx qconjg qcos qcosh qdim qerf qerfc qexp qgamma qimag qlgama qlog qlog10 qmax1 qmin1 qmod qnint qsign qsin qsinh qsqrt qtan qtanh
163
164syn keyword fortran77Intrinsic	abs acos aimag aint anint asin atan atan2 char cmplx conjg cos cosh exp ichar index int log log10 max min nint sign sin sinh sqrt tan tanh
165syn match fortran77Intrinsic	"\<len\s*[(,]"me=s+3
166syn match fortran77Intrinsic	"\<real\s*("me=s+4
167syn match fortranType		"\<implicit\s\+real"
168syn match fortranType		"^\s*real\>"
169syn match fortran90Intrinsic	"\<logical\s*("me=s+7
170syn match fortranType		"\<implicit\s\+logical"
171syn match fortranType		"^\s*logical\>"
172
173"Numbers of various sorts
174" Integers
175syn match fortranNumber	display "\<\d\+\(_\a\w*\)\=\>"
176" floating point number, without a decimal point
177syn match fortranFloatNoDec	display	"\<\d\+[deq][-+]\=\d\+\(_\a\w*\)\=\>"
178" floating point number, starting with a decimal point
179syn match fortranFloatIniDec	display	"\.\d\+\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
180" floating point number, no digits after decimal
181syn match fortranFloatEndDec	display	"\<\d\+\.\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
182" floating point number, D or Q exponents
183syn match fortranFloatDExp	display	"\<\d\+\.\d\+\([dq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
184" floating point number
185syn match fortranFloat	display	"\<\d\+\.\d\+\(e[-+]\=\d\+\)\=\(_\a\w*\)\=\>"
186" Numbers in formats
187syn match fortranFormatSpec	display	"\d*f\d\+\.\d\+"
188syn match fortranFormatSpec	display	"\d*e[sn]\=\d\+\.\d\+\(e\d+\>\)\="
189syn match fortranFormatSpec	display	"\d*\(d\|q\|g\)\d\+\.\d\+\(e\d+\)\="
190syn match fortranFormatSpec	display	"\d\+x\>"
191" The next match cannot be used because it would pick up identifiers as well
192" syn match fortranFormatSpec	display	"\<\(a\|i\)\d\+"
193
194" Numbers as labels
195syn match fortranLabelNumber	display	"^\d\{1,5}\s"me=e-1
196syn match fortranLabelNumber	display	"^ \d\{1,4}\s"ms=s+1,me=e-1
197syn match fortranLabelNumber	display	"^  \d\{1,3}\s"ms=s+2,me=e-1
198syn match fortranLabelNumber	display	"^   \d\d\=\s"ms=s+3,me=e-1
199syn match fortranLabelNumber	display	"^    \d\s"ms=s+4,me=e-1
200
201if version >= 600 && exists("fortran_more_precise")
202  " Numbers as targets
203  syn match fortranTarget	display	"\(\<if\s*(.\+)\s*\)\@<=\(\d\+\s*,\s*\)\{2}\d\+\>"
204  syn match fortranTarget	display	"\(\<do\s\+\)\@<=\d\+\>"
205  syn match fortranTarget	display	"\(\<go\s*to\s*(\=\)\@<=\(\d\+\s*,\s*\)*\d\+\>"
206endif
207
208syn keyword fortranTypeEx	external
209syn keyword fortranIOEx		format
210syn keyword fortranKeywordEx	continue
211syn match fortranKeywordEx	"\<go\s*to\>"
212syn region fortranStringEx	start=+'+ end=+'+ contains=fortranContinueMark,fortranLeftMargin,fortranSerialNumber
213syn keyword fortran77IntrinsicEx	dim lge lgt lle llt mod
214syn keyword fortranKeywordOb	assign pause to
215
216if b:fortran_dialect != "f77"
217
218  syn match fortranType         "\<type\>"
219  syn keyword fortranType	none
220
221  syn keyword fortranStructure	private public intent optional
222  syn keyword fortranStructure	pointer target allocatable
223  syn keyword fortranStorageClass	in out
224  syn match fortranStorageClass	"\<kind\s*="me=s+4
225  syn match fortranStorageClass	"\<len\s*="me=s+3
226
227  syn match fortranUnitHeader	"\<module\>"
228  syn keyword fortranUnitHeader	use only contains
229  syn keyword fortranUnitHeader	result operator assignment
230  syn match fortranUnitHeader	"\<interface\>"
231  syn match fortranUnitHeader	"\<recursive\>"
232  syn keyword fortranKeyword	allocate deallocate nullify cycle exit
233  syn match fortranConditional	"\<select\>"
234  syn keyword fortranConditional	case default where elsewhere
235
236  syn match fortranOperator	"\(\(>\|<\)=\=\|==\|/=\|=\)"
237  syn match fortranOperator	"=>"
238
239  syn region fortranString	start=+"+ end=+"+	contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
240  syn keyword fortranIO		pad position action delim readwrite
241  syn keyword fortranIO		eor advance nml
242
243  syn keyword fortran90Intrinsic	adjustl adjustr all allocated any associated bit_size btest ceiling count cshift date_and_time digits dot_product eoshift epsilon exponent floor fraction huge iand ibclr ibits ibset ieor ior ishft ishftc lbound len_trim matmul maxexponent maxloc maxval merge minexponent minloc minval modulo mvbits nearest pack precision present product radix random_number random_seed range repeat reshape rrspacing
244  syn keyword fortran90Intrinsic	scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify
245  syn match fortran90Intrinsic		"\<not\>\(\s*\.\)\@!"me=s+3
246  syn match fortran90Intrinsic	"\<kind\>\s*[(,]"me=s+4
247
248  syn match  fortranUnitHeader	"\<end\s*function"
249  syn match  fortranUnitHeader	"\<end\s*interface"
250  syn match  fortranUnitHeader	"\<end\s*module"
251  syn match  fortranUnitHeader	"\<end\s*program"
252  syn match  fortranUnitHeader	"\<end\s*subroutine"
253  syn match  fortranRepeat	"\<end\s*do"
254  syn match  fortranConditional	"\<end\s*where"
255  syn match  fortranConditional	"\<select\s*case"
256  syn match  fortranConditional	"\<end\s*select"
257  syn match  fortranType	"\<end\s*type"
258  syn match  fortranType	"\<in\s*out"
259
260  syn keyword fortranUnitHeaderEx	procedure
261  syn keyword fortranIOEx		namelist
262  syn keyword fortranConditionalEx	while
263  syn keyword fortran90IntrinsicEx	achar iachar transfer
264
265  syn keyword fortranInclude		include
266  syn keyword fortran90StorageClassR	sequence
267endif
268
269syn match   fortranConditional	"\<end\s*if"
270syn match   fortranIO		contains=fortranOperator "\<e\(nd\|rr\)\s*=\s*\d\+"
271syn match   fortranConditional	"\<else\s*if"
272
273syn keyword fortranUnitHeaderR	entry
274syn match fortranTypeR		display "double\s\+precision"
275syn match fortranTypeR		display "double\s\+complex"
276syn match fortranUnitHeaderR	display "block\s\+data"
277syn keyword fortranStorageClassR	common equivalence data
278syn keyword fortran77IntrinsicR	dble dprod
279syn match   fortran77OperatorR	"\.\s*[gl][et]\s*\."
280syn match   fortran77OperatorR	"\.\s*\(eq\|ne\)\s*\."
281
282if b:fortran_dialect == "f95" || b:fortran_dialect == "F"
283  syn keyword fortranRepeat		forall
284  syn match fortranRepeat		"\<end\s*forall"
285  syn keyword fortran95Intrinsic	null cpu_time
286  syn match fortranType			"\<elemental\>"
287  syn match fortranType			"\<pure\>"
288  if exists("fortran_more_precise")
289    syn match fortranConstructName "\(\<end\s*forall\s\+\)\@<=\a\w*\>"
290  endif
291endif
292
293syn cluster fortranCommentGroup contains=fortranTodo
294
295if (b:fortran_fixed_source == 1)
296  if !exists("fortran_have_tabs")
297    "Flag items beyond column 72
298    syn match fortranSerialNumber	excludenl "^.\{73,}$"lc=72
299    "Flag left margin errors
300    syn match fortranLabelError	"^.\{-,4}[^0-9 ]" contains=fortranTab
301    syn match fortranLabelError	"^.\{4}\d\S"
302  endif
303  syn match fortranComment		excludenl "^[!c*].*$" contains=@fortranCommentGroup,@spell
304  syn match fortranLeftMargin		transparent "^ \{5}"
305  syn match fortranContinueMark		display "^.\{5}\S"lc=5
306else
307  syn match fortranContinueMark		display "&"
308endif
309
310if b:fortran_dialect != "f77"
311  syn match fortranComment	excludenl "!.*$" contains=@fortranCommentGroup,@spell
312endif
313
314"cpp is often used with Fortran
315syn match	cPreProc		"^\s*#\s*\(define\|ifdef\)\>.*"
316syn match	cPreProc		"^\s*#\s*\(elif\|if\)\>.*"
317syn match	cPreProc		"^\s*#\s*\(ifndef\|undef\)\>.*"
318syn match	cPreCondit		"^\s*#\s*\(else\|endif\)\>.*"
319syn region	cIncluded	contained start=+"[^(]+ skip=+\\\\\|\\"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
320syn match	cIncluded		contained "<[^>]*>"
321syn match	cInclude		"^\s*#\s*include\>\s*["<]" contains=cIncluded
322
323"Synchronising limits assume that comment and continuation lines are not mixed
324if exists("fortran_fold") || exists("fortran_more_precise")
325  syn sync fromstart
326elseif (b:fortran_fixed_source == 0)
327  syn sync linecont "&" minlines=20
328else
329  syn sync minlines=20
330endif
331
332if version >= 600 && exists("fortran_fold")
333
334  if (b:fortran_fixed_source == 1)
335    syn region fortranProgram transparent fold keepend start="^\s*program\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\(program\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranModule
336    syn region fortranModule transparent fold keepend start="^\s*module\s\+\(procedure\)\@!\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\(module\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranProgram
337    syn region fortranFunction transparent fold keepend extend start="^\s*\(elemental \|pure \|recursive \)\=\s*\(\(\(real \|integer \|logical \|complex \|double \s*precision \)\s*\((\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\|type\s\+(\s*\w\+\s*) \|character \((\(\s*len\s*=\)\=\s*\d\+\s*)\|(\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\=\s*function\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\($\|function\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
338    syn region fortranSubroutine transparent fold keepend extend start="^\s*\(elemental \|pure \|recursive \)\=\s*subroutine\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\($\|subroutine\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
339    syn region fortranBlockData transparent fold keepend start="\<block\s*data\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\($\|block\s*data\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
340    syn region fortranInterface transparent fold keepend extend start="^\s*interface\>" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*interface\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
341  else
342    syn region fortranProgram transparent fold keepend start="^\s*program\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\(program\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranModule
343    syn region fortranModule transparent fold keepend start="^\s*module\s\+\(procedure\)\@!\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\(module\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranProgram
344    syn region fortranFunction transparent fold keepend extend start="^\s*\(elemental \|pure \|recursive \)\=\s*\(\(\(real \|integer \|logical \|complex \|double \s*precision \)\s*\((\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\|type\s\+(\s*\w\+\s*) \|character \((\(\s*len\s*=\)\=\s*\d\+\s*)\|(\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\=\s*function\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\($\|function\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
345    syn region fortranSubroutine transparent fold keepend extend start="^\s*\(elemental \|pure \|recursive \)\=\s*subroutine\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\($\|subroutine\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
346    syn region fortranBlockData transparent fold keepend start="\<block\s*data\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\($\|block\s*data\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
347    syn region fortranInterface transparent fold keepend extend start="^\s*interface\>" skip="^\s*[!#].*$" excludenl end="\<end\s*interface\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
348  endif
349
350  if exists("fortran_fold_conditionals")
351    if (b:fortran_fixed_source == 1)
352      syn region fortran77Loop transparent fold keepend start="\<do\s\+\z(\d\+\)" end="^\s*\z1\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
353      syn region fortran90Loop transparent fold keepend extend start="\(\<end\s\+\)\@<!\<do\(\s\+\a\|\s*$\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*do\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
354      syn region fortranIfBlock transparent fold keepend extend start="\(\<e\(nd\|lse\)\s\+\)\@<!\<if\s*(.\+)\s*then\>" skip="^\([!c*]\|\s*#\).*$" end="\<end\s*if\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
355      syn region fortranCase transparent fold keepend extend start="\<select\s*case\>" skip="^\([!c*]\|\s*#\).*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
356    else
357      syn region fortran77Loop transparent fold keepend start="\<do\s\+\z(\d\+\)" end="^\s*\z1\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
358      syn region fortran90Loop transparent fold keepend extend start="\(\<end\s\+\)\@<!\<do\(\s\+\a\|\s*$\)" skip="^\s*[!#].*$" excludenl end="\<end\s*do\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
359      syn region fortranIfBlock transparent fold keepend extend start="\(\<e\(nd\|lse\)\s\+\)\@<!\<if\s*(.\+)\s*then\>" skip="^\s*[!#].*$" end="\<end\s*if\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
360      syn region fortranCase transparent fold keepend extend start="\<select\s*case\>" skip="^\s*[!#].*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
361    endif
362  endif
363
364  if exists("fortran_fold_multilinecomments")
365    if (b:fortran_fixed_source == 1)
366      syn match fortranMultiLineComments transparent fold "\(^[!c*].*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
367    else
368      syn match fortranMultiLineComments transparent fold "\(^\s*!.*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
369    endif
370  endif
371endif
372
373" Define the default highlighting.
374" For version 5.7 and earlier: only when not done already
375" For version 5.8 and later: only when an item doesn't have highlighting yet
376if version >= 508 || !exists("did_fortran_syn_inits")
377  if version < 508
378    let did_fortran_syn_inits = 1
379    command -nargs=+ HiLink hi link <args>
380  else
381    command -nargs=+ HiLink hi def link <args>
382  endif
383
384  " The default highlighting differs for each dialect.
385  " Transparent groups:
386  " fortranParen, fortranLeftMargin
387  " fortranProgram, fortranModule, fortranSubroutine, fortranFunction,
388  " fortranBlockData
389  " fortran77Loop, fortran90Loop, fortranIfBlock, fortranCase
390  " fortranMultiCommentLines
391  HiLink fortranKeyword 	Keyword
392  HiLink fortranConstructName	Identifier
393  HiLink fortranConditional	Conditional
394  HiLink fortranRepeat		Repeat
395  HiLink fortranTodo		Todo
396  HiLink fortranContinueMark	Todo
397  HiLink fortranString		String
398  HiLink fortranNumber		Number
399  HiLink fortranOperator	Operator
400  HiLink fortranBoolean		Boolean
401  HiLink fortranLabelError	Error
402  HiLink fortranObsolete	Todo
403  HiLink fortranType		Type
404  HiLink fortranStructure	Type
405  HiLink fortranStorageClass	StorageClass
406  HiLink fortranCall		fortranUnitHeader
407  HiLink fortranUnitHeader	fortranPreCondit
408  HiLink fortranReadWrite	Keyword
409  HiLink fortranIO		Keyword
410  HiLink fortran95Intrinsic	fortran90Intrinsic
411  HiLink fortran77Intrinsic	fortran90Intrinsic
412  HiLink fortran90Intrinsic	Function
413
414  if ( b:fortran_dialect == "elf" || b:fortran_dialect == "F" )
415    HiLink fortranKeywordOb	fortranObsolete
416    HiLink fortran66Intrinsic	fortranObsolete
417    HiLink fortran77IntrinsicR	fortranObsolete
418    HiLink fortranUnitHeaderR	fortranObsolete
419    HiLink fortranTypeR		fortranObsolete
420    HiLink fortranStorageClassR	fortranObsolete
421    HiLink fortran90StorageClassR	fortranObsolete
422    HiLink fortran77OperatorR	fortranObsolete
423    HiLink fortranInclude	fortranObsolete
424  else
425    HiLink fortranKeywordOb	fortranKeyword
426    HiLink fortran66Intrinsic	fortran90Intrinsic
427    HiLink fortran77IntrinsicR	fortran90Intrinsic
428    HiLink fortranUnitHeaderR	fortranPreCondit
429    HiLink fortranTypeR		fortranType
430    HiLink fortranStorageClassR	fortranStorageClass
431    HiLink fortran77OperatorR	fortranOperator
432    HiLink fortranInclude	Include
433    HiLink fortran90StorageClassR	fortranStorageClass
434  endif
435
436  if ( b:fortran_dialect == "F" )
437    HiLink fortranLabelNumber	fortranObsolete
438    HiLink fortranTarget	fortranObsolete
439    HiLink fortranFormatSpec	fortranObsolete
440    HiLink fortranFloatDExp	fortranObsolete
441    HiLink fortranFloatNoDec	fortranObsolete
442    HiLink fortranFloatIniDec	fortranObsolete
443    HiLink fortranFloatEndDec	fortranObsolete
444    HiLink fortranTypeEx	fortranObsolete
445    HiLink fortranIOEx		fortranObsolete
446    HiLink fortranKeywordEx	fortranObsolete
447    HiLink fortranStringEx	fortranObsolete
448    HiLink fortran77IntrinsicEx	fortranObsolete
449    HiLink fortranUnitHeaderEx	fortranObsolete
450    HiLink fortranConditionalEx	fortranObsolete
451    HiLink fortran90IntrinsicEx	fortranObsolete
452  else
453    HiLink fortranLabelNumber	Special
454    HiLink fortranTarget	Special
455    HiLink fortranFormatSpec	Identifier
456    HiLink fortranFloatDExp	fortranFloat
457    HiLink fortranFloatNoDec	fortranFloat
458    HiLink fortranFloatIniDec	fortranFloat
459    HiLink fortranFloatEndDec	fortranFloat
460    HiLink fortranTypeEx	fortranType
461    HiLink fortranIOEx		fortranIO
462    HiLink fortranKeywordEx	fortranKeyword
463    HiLink fortranStringEx	fortranString
464    HiLink fortran77IntrinsicEx	fortran90Intrinsic
465    HiLink fortranUnitHeaderEx	fortranUnitHeader
466    HiLink fortranConditionalEx	fortranConditional
467    HiLink fortran90IntrinsicEx	fortran90Intrinsic
468  endif
469
470  HiLink fortranFloat		Float
471  HiLink fortranPreCondit	PreCondit
472  HiLink fortranInclude		Include
473  HiLink cIncluded		fortranString
474  HiLink cInclude		Include
475  HiLink cPreProc		PreProc
476  HiLink cPreCondit		PreCondit
477  HiLink fortranParenError	Error
478  HiLink fortranComment		Comment
479  HiLink fortranSerialNumber	Todo
480  HiLink fortranTab		Error
481  " Vendor extensions
482  HiLink fortranExtraIntrinsic	Function
483
484  delcommand HiLink
485endif
486
487let b:current_syntax = "fortran"
488
489" vim: ts=8 tw=132
490