xref: /vim-8.2.3635/runtime/syntax/fortran.vim (revision ea2d8d25)
1" Vim syntax file
2" Language:	Fortran 2008 (and older: Fortran 2003, 95, 90, and 77)
3" Version:	102
4" Last Change:	2020 Apr 20
5" Patched By:	Eisuke Kawashima
6" Maintainer:	Ajit J. Thakkar <[email protected]>; <http://www2.unb.ca/~ajit/>
7" Usage:	For instructions, do :help fortran-syntax from Vim
8" Credits:
9"  Version 0.1 for Fortran 95 was created (April 2000) by Ajit Thakkar from the
10"  Fortran 77 syntax file by Mario Eusebio and Preben Guldberg.
11"  Since then, useful suggestions and contributions have been made, in order, by:
12"  Andrej Panjkov, Bram Moolenaar, Thomas Olsen, Michael Sternberg, Christian Reile,
13"  Walter Dieudonn�, Alexander Wagner, Roman Bertle, Charles Rendleman,
14"  Andrew Griffiths, Joe Krahn, Hendrik Merx, Matt Thompson, Jan Hermann,
15"  Stefano Zaghi, Vishnu V. Krishnan, Judica�l Grasset, and Takuma Yoshida
16
17if exists("b:current_syntax")
18  finish
19endif
20
21let s:cpo_save = &cpo
22set cpo&vim
23
24" Choose fortran_dialect using the priority:
25" source file directive > buffer-local value > global value > file extension
26" first try using directive in first three lines of file
27let b:fortran_retype = getline(1)." ".getline(2)." ".getline(3)
28if b:fortran_retype =~? '\<fortran_dialect\s*=\s*F\>'
29  let b:fortran_dialect = "F"
30elseif b:fortran_retype =~? '\<fortran_dialect\s*=\s*f08\>'
31  let b:fortran_dialect = "f08"
32elseif !exists("b:fortran_dialect")
33  if exists("g:fortran_dialect") && g:fortran_dialect =~# '\<F\|f08\>'
34    " try global variable
35    let b:fortran_dialect = g:fortran_dialect
36  else         " nothing found, so use default
37    let b:fortran_dialect = "f08"
38  endif
39endif
40unlet! b:fortran_retype
41" make sure buffer-local value is not invalid
42if b:fortran_dialect !~# '\<F\|f08\>'
43  let b:fortran_dialect = "f08"
44endif
45
46" Choose between fixed and free source form if this hasn't been done yet
47if !exists("b:fortran_fixed_source")
48  if b:fortran_dialect == "F"
49    " F requires free source form
50    let b:fortran_fixed_source = 0
51  elseif exists("fortran_free_source")
52    " User guarantees free source form for all fortran files
53    let b:fortran_fixed_source = 0
54  elseif exists("fortran_fixed_source")
55    " User guarantees fixed source form for all fortran files
56    let b:fortran_fixed_source = 1
57  elseif expand("%:e") =~? '^f\%(90\|95\|03\|08\)$'
58    " Free-form file extension defaults as in Intel ifort, gcc(gfortran), NAG, Pathscale, and Cray compilers
59    let b:fortran_fixed_source = 0
60  elseif expand("%:e") =~? '^\%(f\|f77\|for\)$'
61    " Fixed-form file extension defaults
62    let b:fortran_fixed_source = 1
63  else
64    " Modern fortran still allows both free and fixed source form.
65    " Assume fixed source form unless signs of free source form
66    " are detected in the first five columns of the first s:lmax lines.
67    " Detection becomes more accurate and time-consuming if more lines
68    " are checked. Increase the limit below if you keep lots of comments at
69    " the very top of each file and you have a fast computer.
70    let s:lmax = 500
71    if ( s:lmax > line("$") )
72      let s:lmax = line("$")
73    endif
74    let b:fortran_fixed_source = 1
75    let s:ln=1
76    while s:ln <= s:lmax
77      let s:test = strpart(getline(s:ln),0,5)
78      if s:test !~ '^[Cc*]' && s:test !~ '^ *[!#]' && s:test =~ '[^ 0-9\t]' && s:test !~ '^[ 0-9]*\t'
79        let b:fortran_fixed_source = 0
80        break
81      endif
82      let s:ln = s:ln + 1
83    endwhile
84    unlet! s:lmax s:ln s:test
85  endif
86endif
87
88syn case ignore
89
90if b:fortran_fixed_source == 1
91  syn match fortranConstructName	"^\s\{6,}\zs\a\w*\ze\s*:"
92else
93  syn match fortranConstructName	"^\s*\zs\a\w*\ze\s*:"
94endif
95if exists("fortran_more_precise")
96  syn match fortranConstructName "\(\<end\s*do\s\+\)\@11<=\a\w*"
97  syn match fortranConstructName "\(\<end\s*if\s\+\)\@11<=\a\w*"
98  syn match fortranConstructName "\(\<end\s*select\s\+\)\@15<=\a\w*"
99endif
100
101syn match fortranUnitHeader	"\<end\>"
102syn match fortranType		"\<character\>"
103syn match fortranType		"\<complex\>"
104syn match fortranType		"\<integer\>"
105syn keyword fortranType		intrinsic
106syn match fortranType		"\<implicit\>"
107syn keyword fortranStructure	dimension
108syn keyword fortranStorageClass	parameter save
109syn match fortranUnitHeader	"\<subroutine\>"
110syn keyword fortranCall		call
111syn match fortranUnitHeader	"\<function\>"
112syn match fortranUnitHeader	"\<program\>"
113syn match fortranUnitHeader	"\<block\>"
114syn keyword fortranKeyword	return stop
115syn keyword fortranConditional	else then
116syn match fortranConditional	"\<if\>"
117syn match fortranConditionalOb	"\<if\s*(.*)\s*\d\+\s*,\s*\d\+\s*,\s*\d\+\s*$"
118syn match fortranRepeat		"\<do\>"
119
120syn keyword fortranTodo		contained todo fixme
121
122"Catch errors caused by too many right parentheses
123syn region fortranParen transparent start="(" end=")" contains=ALLBUT,fortranParenError,@fortranCommentGroup,cIncluded,@spell
124syn match  fortranParenError   ")"
125
126syn match fortranOperator	"\.\s*n\=eqv\s*\."
127syn match fortranOperator	"\.\s*\(and\|or\|not\)\s*\."
128syn match fortranOperator	"\(+\|-\|/\|\*\)"
129syn match fortranTypeOb		"\<character\s*\*"
130
131syn match fortranBoolean	"\.\s*\(true\|false\)\s*\."
132
133syn keyword fortranReadWrite	backspace close endfile inquire open print read rewind write
134
135"If tabs are allowed then the left margin checks do not work
136if exists("fortran_have_tabs")
137  syn match fortranTab		"\t"  transparent
138else
139  syn match fortranTab		"\t"
140endif
141
142syn keyword fortranIO		access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit
143
144syn keyword fortranIntrinsicR		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
145
146" Intrinsics provided by some vendors
147syn keyword fortranExtraIntrinsic	algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama 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
148
149syn keyword fortranIntrinsic	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
150syn match fortranIntrinsic	"\<len\s*[(,]"me=s+3
151syn match fortranIntrinsic	"\<real\s*("me=s+4
152syn match fortranType		"\<implicit\s\+real"
153syn match fortranType		"^\s*real\>"
154syn match fortranIntrinsic	"\<logical\s*("me=s+7
155syn match fortranType		"\<implicit\s\+logical"
156syn match fortranType		"^\s*logical\>"
157
158"Numbers of various sorts
159" Integers
160syn match fortranNumber	display "\<\d\+\(_\a\w*\)\=\>"
161" floating point number, without a decimal point
162syn match fortranFloatIll	display	"\<\d\+[deq][-+]\=\d\+\(_\a\w*\)\=\>"
163" floating point number, starting with a decimal point
164syn match fortranFloatIll	display	"\.\d\+\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
165" floating point number, no digits after decimal
166syn match fortranFloatIll	display	"\<\d\+\.\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
167" floating point number, D or Q exponents
168syn match fortranFloatIll	display	"\<\d\+\.\d\+\([dq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
169" floating point number
170syn match fortranFloat	display	"\<\d\+\.\d\+\(e[-+]\=\d\+\)\=\(_\a\w*\)\=\>"
171" Numbers in formats
172syn match fortranFormatSpec	display	"\d*f\d\+\.\d\+"
173syn match fortranFormatSpec	display	"\d*e[sn]\=\d\+\.\d\+\(e\d+\>\)\="
174syn match fortranFormatSpec	display	"\d*\(d\|q\|g\)\d\+\.\d\+\(e\d+\)\="
175syn match fortranFormatSpec	display	"\d\+x\>"
176" The next match cannot be used because it would pick up identifiers as well
177" syn match fortranFormatSpec	display	"\<\(a\|i\)\d\+"
178
179" Numbers as labels
180syn match fortranLabelNumber	display	"^\d\{1,5}\s"me=e-1
181syn match fortranLabelNumber	display	"^ \d\{1,4}\s"ms=s+1,me=e-1
182syn match fortranLabelNumber	display	"^  \d\{1,3}\s"ms=s+2,me=e-1
183syn match fortranLabelNumber	display	"^   \d\d\=\s"ms=s+3,me=e-1
184syn match fortranLabelNumber	display	"^    \d\s"ms=s+4,me=e-1
185
186if exists("fortran_more_precise")
187  " Numbers as targets
188  syn match fortranTarget	display	"\(\<if\s*(.\+)\s*\)\@<=\(\d\+\s*,\s*\)\{2}\d\+\>"
189  syn match fortranTarget	display	"\(\<do\s\+\)\@11<=\d\+\>"
190  syn match fortranTarget	display	"\(\<go\s*to\s*(\=\)\@11<=\(\d\+\s*,\s*\)*\d\+\>"
191endif
192
193syn keyword fortranTypeR	external
194syn keyword fortranIOR		format
195syn match fortranKeywordR	"\<continue\>"
196syn match fortranKeyword	"^\s*\d\+\s\+continue\>"
197syn match fortranKeyword  	"\<go\s*to\>"
198syn match fortranKeywordDel  	"\<go\s*to\ze\s\+.*,\s*(.*$"
199syn match fortranKeywordOb  	"\<go\s*to\ze\s*(\d\+.*$"
200syn region fortranStringR	start=+'+ end=+'+ contains=fortranContinueMark,fortranLeftMargin,fortranSerialNumber
201syn keyword fortranIntrinsicR	dim lge lgt lle llt mod
202syn keyword fortranKeywordDel	assign pause
203
204syn match fortranType           "\<type\>"
205syn keyword fortranType	        none
206
207syn keyword fortranStructure	private public intent optional
208syn keyword fortranStructure	pointer target allocatable
209syn keyword fortranStorageClass	in out
210syn match fortranStorageClass	"\<kind\s*="me=s+4
211syn match fortranStorageClass	"\<len\s*="me=s+3
212
213syn match fortranUnitHeader	"\<module\>"
214syn match fortranUnitHeader	"\<submodule\>"
215syn keyword fortranUnitHeader	use only contains
216syn keyword fortranUnitHeader	result operator assignment
217syn match fortranUnitHeader	"\<interface\>"
218syn match fortranUnitHeader	"\<recursive\>"
219syn keyword fortranKeyword	allocate deallocate nullify cycle exit
220syn match fortranConditional	"\<select\>"
221syn keyword fortranConditional	case default where elsewhere
222
223syn match fortranOperator	"\(\(>\|<\)=\=\|==\|/=\|=\)"
224syn match fortranOperator	"=>"
225
226syn region fortranString	start=+"+ end=+"+	contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
227syn keyword fortranIO		pad position action delim readwrite
228syn keyword fortranIO		eor advance nml
229
230syn keyword fortranIntrinsic	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
231syn keyword fortranIntrinsic	scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify
232syn match fortranIntrinsic		"\<not\>\(\s*\.\)\@!"me=s+3
233syn match fortranIntrinsic	"\<kind\>\s*[(,]"me=s+4
234
235syn match  fortranUnitHeader	"\<end\s*function"
236syn match  fortranUnitHeader	"\<end\s*interface"
237syn match  fortranUnitHeader	"\<end\s*module"
238syn match  fortranUnitHeader	"\<end\s*submodule"
239syn match  fortranUnitHeader	"\<end\s*program"
240syn match  fortranUnitHeader	"\<end\s*subroutine"
241syn match  fortranUnitHeader	"\<end\s*block"
242syn match  fortranRepeat	"\<end\s*do"
243syn match  fortranConditional	"\<end\s*where"
244syn match  fortranConditional	"\<select\s*case"
245syn match  fortranConditional	"\<end\s*select"
246syn match  fortranType	"\<end\s*type"
247syn match  fortranType	"\<in\s*out"
248
249syn keyword fortranType	        procedure
250syn match  fortranType	        "\<module\ze\s\+procedure\>"
251syn keyword fortranIOR		namelist
252syn keyword fortranConditionalR	while
253syn keyword fortranIntrinsicR	achar iachar transfer
254
255syn keyword fortranInclude		include
256syn keyword fortranStorageClassR	sequence
257
258syn match   fortranConditional	"\<end\s*if"
259syn match   fortranIO		contains=fortranOperator "\<e\(nd\|rr\)\s*=\s*\d\+"
260syn match   fortranConditional	"\<else\s*if"
261
262syn keyword fortranUnitHeaderOb	entry
263syn match fortranTypeR		display "double\s\+precision"
264syn match fortranTypeR		display "double\s\+complex"
265syn match fortranUnitHeaderR	display "block\s\+data"
266syn keyword fortranStorageClassR	common equivalence data
267syn keyword fortranIntrinsicR	dble dprod
268syn match   fortranOperatorR	"\.\s*[gl][et]\s*\."
269syn match   fortranOperatorR	"\.\s*\(eq\|ne\)\s*\."
270
271syn keyword fortranRepeat		forall
272syn match fortranRepeat		"\<end\s*forall"
273syn keyword fortranIntrinsic	null cpu_time
274syn match fortranType			"\<elemental\>"
275syn match fortranType			"\<pure\>"
276syn match fortranType			"\<impure\>"
277if exists("fortran_more_precise")
278  syn match fortranConstructName "\(\<end\s*forall\s\+\)\@15<=\a\w*\>"
279endif
280
281if b:fortran_dialect == "f08"
282  " F2003
283  syn keyword fortranIntrinsic        command_argument_count get_command get_command_argument get_environment_variable is_iostat_end is_iostat_eor move_alloc new_line selected_char_kind same_type_as extends_type_of
284  " ISO_C_binding
285  syn keyword fortranConstant         c_null_char c_alert c_backspace c_form_feed c_new_line c_carriage_return c_horizontal_tab c_vertical_tab
286  syn keyword fortranConstant         c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr
287  syn keyword fortranIntrinsic        iso_c_binding c_loc c_funloc c_associated  c_f_pointer c_f_procpointer
288  syn keyword fortranType             c_ptr c_funptr
289  " ISO_Fortran_env
290  syn keyword fortranConstant         iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit
291  " IEEE_arithmetic
292  syn keyword fortranIntrinsic        ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode
293
294  syn keyword fortranReadWrite	flush wait
295  syn keyword fortranIO 	      decimal round iomsg
296  syn keyword fortranType             asynchronous nopass non_overridable pass protected volatile extends import
297  syn keyword fortranType             non_intrinsic value bind deferred generic final enumerator
298  syn match fortranType               "\<abstract\>"
299  syn match fortranType               "\<class\>"
300  syn match fortranType               "\<associate\>"
301  syn match fortranType               "\<end\s*associate"
302  syn match fortranType               "\<enum\s*,\s*bind\s*(\s*c\s*)"
303  syn match fortranType               "\<end\s*enum"
304  syn match fortranConditional	"\<select\s*type"
305  syn match fortranConditional        "\<type\s*is\>"
306  syn match fortranConditional        "\<class\s*is\>"
307  syn match fortranUnitHeader         "\<abstract\s*interface\>"
308  syn match fortranOperator           "\([\|]\)"
309
310  " F2008
311  syn keyword fortranIntrinsic        acosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2
312  syn keyword fortranIntrinsic        atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits
313  syn keyword fortranIntrinsic        bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image
314  syn keyword fortranIO               newunit
315  syn keyword fortranType             contiguous
316  syn keyword fortranRepeat           concurrent
317
318" CUDA fortran
319  syn match fortranTypeCUDA           "\<attributes\>"
320  syn keyword fortranTypeCUDA         host global device value
321  syn keyword fortranTypeCUDA         shared constant pinned texture
322  syn keyword fortranTypeCUDA         dim1 dim2 dim3 dim4
323  syn keyword fortranTypeCUDA         cudadeviceprop cuda_count_kind cuda_stream_kind
324  syn keyword fortranTypeCUDA         cudaEvent cudaFuncAttributes cudaArrayPtr
325  syn keyword fortranTypeCUDA         cudaSymbol cudaChannelFormatDesc cudaPitchedPtr
326  syn keyword fortranTypeCUDA         cudaExtent cudaMemcpy3DParms
327  syn keyword fortranTypeCUDA         cudaFuncCachePreferNone cudaFuncCachePreferShared
328  syn keyword fortranTypeCUDA         cudaFuncCachePreferL1 cudaLimitStackSize
329  syn keyword fortranTypeCUDA         cudaLimitPrintfSize cudaLimitMallocHeapSize
330  syn keyword fortranTypeCUDA         cudaSharedMemBankSizeDefault cudaSharedMemBankSizeFourByte cudaSharedMemBankSizeEightByte
331  syn keyword fortranTypeCUDA         cudaEventDefault cudaEventBlockingSync cudaEventDisableTiming
332  syn keyword fortranTypeCUDA         cudaMemcpyHostToDevice cudaMemcpyDeviceToHost
333  syn keyword fortranTypeCUDA         cudaMemcpyDeviceToDevice
334  syn keyword fortranTypeCUDA         cudaErrorNotReady cudaSuccess cudaErrorInvalidValue
335  syn keyword fortranTypeCUDA         c_devptr
336
337  syn match fortranStringCUDA         "blockidx%[xyz]"
338  syn match fortranStringCUDA         "blockdim%[xyz]"
339  syn match fortranStringCUDA         "griddim%[xyz]"
340  syn match fortranStringCUDA         "threadidx%[xyz]"
341
342  syn keyword fortranIntrinsicCUDA    warpsize syncthreads syncthreads_and syncthreads_count syncthreads_or threadfence threadfence_block threadfence_system gpu_time allthreads anythread ballot
343  syn keyword fortranIntrinsicCUDA    atomicadd atomicsub atomicmax atomicmin atomicand atomicor atomicxor atomicexch atomicinc atomicdec atomiccas sizeof __shfl __shfl_up __shfl_down __shfl_xor
344  syn keyword fortranIntrinsicCUDA    cudaChooseDevice cudaDeviceGetCacheConfig cudaDeviceGetLimit cudaDeviceGetSharedMemConfig cudaDeviceReset cudaDeviceSetCacheConfig cudaDeviceSetLimit cudaDeviceSetSharedMemConfig cudaDeviceSynchronize cudaGetDevice cudaGetDeviceCount cudaGetDeviceProperties cudaSetDevice cudaSetDeviceFlags cudaSetValidDevices
345  syn keyword fortranIntrinsicCUDA    cudaThreadExit cudaThreadSynchronize cudaGetLastError cudaGetErrorString cudaPeekAtLastError cudaStreamCreate cudaStreamDestroy cudaStreamQuery cudaStreamSynchronize cudaStreamWaitEvent cudaEventCreate cudaEventCreateWithFlags cudaEventDestroy cudaEventElapsedTime cudaEventQuery cudaEventRecord cudaEventSynchronize
346  syn keyword fortranIntrinsicCUDA    cudaFuncGetAttributes cudaFuncSetCacheConfig cudaFuncSetSharedMemConfig cudaSetDoubleForDevice cudaSetDoubleForHost cudaFree cudaFreeArray cudaFreeHost cudaGetSymbolAddress cudaGetSymbolSize
347  syn keyword fortranIntrinsicCUDA    cudaHostAlloc cudaHostGetDevicePointer cudaHostGetFlags cudaHostRegister cudaHostUnregister cudaMalloc cudaMallocArray cudaMallocHost cudaMallocPitch cudaMalloc3D cudaMalloc3DArray
348  syn keyword fortranIntrinsicCUDA    cudaMemcpy cudaMemcpyArraytoArray cudaMemcpyAsync cudaMemcpyFromArray cudaMemcpyFromSymbol cudaMemcpyFromSymbolAsync cudaMemcpyPeer cudaMemcpyPeerAsync cudaMemcpyToArray cudaMemcpyToSymbol cudaMemcpyToSymbolAsync cudaMemcpy2D cudaMemcpy2DArrayToArray cudaMemcpy2DAsync cudaMemcpy2DFromArray cudaMemcpy2DToArray cudaMemcpy3D cudaMemcpy3DAsync
349  syn keyword fortranIntrinsicCUDA    cudaMemGetInfo cudaMemset cudaMemset2D cudaMemset3D cudaDeviceCanAccessPeer cudaDeviceDisablePeerAccess cudaDeviceEnablePeerAccess cudaPointerGetAttributes cudaDriverGetVersion cudaRuntimeGetVersion
350
351  syn region none matchgroup=fortranType start="<<<" end=">>>" contains=ALLBUT,none
352endif
353
354syn cluster fortranCommentGroup contains=fortranTodo
355
356if (b:fortran_fixed_source == 1)
357  if !exists("fortran_have_tabs")
358    "Flag items beyond column 72
359    syn match fortranSerialNumber	excludenl "^.\{73,}$"lc=72
360    "Flag left margin errors
361    syn match fortranLabelError	"^.\{-,4}[^0-9 ]" contains=fortranTab
362    syn match fortranLabelError	"^.\{4}\d\S"
363  endif
364  syn match fortranComment		excludenl "^[!c*].*$" contains=@fortranCommentGroup,@spell
365  syn match fortranLeftMargin		transparent "^ \{5}"
366  syn match fortranContinueMark		display "^.\{5}\S"lc=5
367else
368  syn match fortranContinueMark		display "&"
369endif
370
371syn match fortranComment	excludenl "!.*$" contains=@fortranCommentGroup,@spell
372syn match fortranOpenMP		excludenl 		"^\s*!\$\(OMP\)\=&\=\s.*$"
373
374"cpp is often used with Fortran
375syn match	cPreProc		"^\s*#\s*\(define\|ifdef\)\>.*"
376syn match	cPreProc		"^\s*#\s*\(elif\|if\)\>.*"
377syn match	cPreProc		"^\s*#\s*\(ifndef\|undef\)\>.*"
378syn match	cPreCondit		"^\s*#\s*\(else\|endif\)\>.*"
379syn region	cIncluded	contained start=+"[^("]+ skip=+\\\\\|\\"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
380"syn region	cIncluded	        contained start=+"[^("]+ skip=+\\\\\|\\"+ end=+"+
381syn match	cIncluded		contained "<[^>]*>"
382syn match	cInclude		"^\s*#\s*include\>\s*["<]" contains=cIncluded
383
384"Synchronising limits assume that comment and continuation lines are not mixed
385if exists("fortran_fold") || exists("fortran_more_precise")
386  syn sync fromstart
387elseif (b:fortran_fixed_source == 0)
388  syn sync linecont "&" minlines=30
389else
390  syn sync minlines=30
391endif
392
393if exists("fortran_fold")
394
395  if (b:fortran_fixed_source == 1)
396    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
397    syn region fortranModule transparent fold keepend start="^\s*submodule\s\+(\a\w*\s*\(:\a\w*\s*\)*)\s*\z\(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\(submodule\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranProgram,fortranModule
398    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
399    syn region fortranFunction transparent fold keepend extend start="^\s*\(elemental \|pure \|impure \|module \|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
400    syn region fortranSubroutine transparent fold keepend extend start="^\s*\(elemental \|pure \|impure \|module \|recursive \)\=\s*subroutine\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*\($\|subroutine\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
401    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
402    syn region fortranAssociate transparent fold keepend start="^\s*\<associate\s\+" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*associate" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction
403    syn region fortranInterface transparent fold keepend extend start="^\s*\(abstract \)\=\s*interface\>" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*interface\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
404    syn region fortranTypeDef transparent fold keepend extend start="^\s*type\s*\(,\s*\(public\|private\|abstract\)\)\=\s*::" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*type\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock,fortranInterface
405  else
406    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
407    syn region fortranModule transparent fold keepend start="^\s*submodule\s\+(\a\w*\s*\(:\a\w*\s*\)*)\s*\z\(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\(submodule\(\s\+\z1\>\)\=\|$\)" contains=ALLBUT,fortranProgram,fortranModule
408    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
409    syn region fortranFunction transparent fold keepend extend start="^\s*\(elemental \|pure \|impure \|module \|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
410    syn region fortranSubroutine transparent fold keepend extend start="^\s*\(elemental \|pure \|impure \|module \|recursive \)\=\s*subroutine\s\+\z(\a\w*\)" skip="^\s*[!#].*$" excludenl end="\<end\s*\($\|subroutine\(\s\+\z1\>\)\=\)" contains=ALLBUT,fortranProgram,fortranModule
411    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
412    syn region fortranAssociate transparent fold keepend start="^\s*\<associate\s\+" skip="^\s*[!#].*$" excludenl end="\<end\s*associate" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction
413    syn region fortranInterface transparent fold keepend extend start="^\s*\(abstract \)\=\s*interface\>" skip="^\s*[!#].*$" excludenl end="\<end\s*interface\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock
414    syn region fortranTypeDef transparent fold keepend extend start="^\s*type\s*\(,\s*\(public\|private\|abstract\)\)\=\s*::" skip="^\s*[!#].*$" excludenl end="\<end\s*type\>" contains=ALLBUT,fortranProgram,fortranModule,fortran77Loop,fortranCase,fortran90Loop,fortranIfBlock,fortranInterface
415  endif
416
417  if exists("fortran_fold_conditionals")
418    if (b:fortran_fixed_source == 1)
419      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
420      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
421      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
422      syn region fortranCase transparent fold keepend extend start="\<select\s*\(case\|type\)\>" skip="^\([!c*]\|\s*#\).*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
423    else
424      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
425      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
426      syn region fortranIfBlock transparent fold keepend extend start="\(\<e\(nd\|lse\)\s\+\)\@<!\<if\s*(\(.\|&\s*\n\)\+)\(\s\|&\s*\n\)*then\>" skip="^\s*[!#].*$" end="\<end\s*if\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
427      syn region fortranCase transparent fold keepend extend start="\<select\s*\(case\|type\)\>" skip="^\s*[!#].*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
428    endif
429  endif
430
431  if exists("fortran_fold_multilinecomments")
432    if (b:fortran_fixed_source == 1)
433      syn match fortranMultiLineComments transparent fold "\(^[!c*].*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
434    else
435      syn match fortranMultiLineComments transparent fold "\(^\s*!.*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
436    endif
437  endif
438endif
439
440" Define the default highlighting.
441" The default highlighting differs for each dialect.
442" Transparent groups:
443" fortranParen, fortranLeftMargin
444" fortranProgram, fortranModule, fortranSubroutine, fortranFunction,
445" fortranBlockData
446" fortran77Loop, fortran90Loop, fortranIfBlock, fortranCase
447" fortranMultiCommentLines
448hi def link fortranKeyword 	Keyword
449hi def link fortranConstructName	Identifier
450hi def link fortranConditional	Conditional
451hi def link fortranRepeat	Repeat
452hi def link fortranTodo		Todo
453hi def link fortranContinueMark	Special
454hi def link fortranString	String
455hi def link fortranNumber	Number
456hi def link fortranOperator	Operator
457hi def link fortranBoolean	Boolean
458hi def link fortranLabelError	Error
459hi def link fortranObsolete	Todo
460hi def link fortranType		Type
461hi def link fortranStructure	Type
462hi def link fortranStorageClass	StorageClass
463hi def link fortranCall		Function
464hi def link fortranUnitHeader	fortranPreCondit
465hi def link fortranReadWrite	Keyword
466hi def link fortranIO		Keyword
467hi def link fortranIntrinsic	Function
468hi def link fortranConstant	Constant
469
470" To stop deleted & obsolescent features being highlighted as Todo items,
471" comment out the next 5 lines and uncomment the 5 lines after that
472hi def link fortranUnitHeaderOb    fortranObsolete
473hi def link fortranKeywordOb       fortranObsolete
474hi def link fortranConditionalOb   fortranObsolete
475hi def link fortranTypeOb          fortranObsolete
476hi def link fortranKeywordDel      fortranObsolete
477"hi def link fortranUnitHeaderOb    fortranUnitHeader
478"hi def link fortranKeywordOb       fortranKeyword
479"hi def link fortranConditionalOb   fortranConditional
480"hi def link fortranTypeOb          fortranType
481"hi def link fortranKeywordDel      fortranKeyword
482
483if b:fortran_dialect == "F"
484  hi! def link fortranIntrinsicR	fortranObsolete
485  hi! def link fortranUnitHeaderR	fortranObsolete
486  hi! def link fortranTypeR		fortranObsolete
487  hi! def link fortranStorageClassR	fortranObsolete
488  hi! def link fortranOperatorR 	fortranObsolete
489  hi! def link fortranInclude   	fortranObsolete
490  hi! def link fortranLabelNumber	fortranObsolete
491  hi! def link fortranTarget	        fortranObsolete
492  hi! def link fortranFloatIll	        fortranObsolete
493  hi! def link fortranIOR		fortranObsolete
494  hi! def link fortranKeywordR	        fortranObsolete
495  hi! def link fortranStringR	        fortranObsolete
496  hi! def link fortranConditionalR	fortranObsolete
497else
498  hi! def link fortranIntrinsicR	fortranIntrinsic
499  hi! def link fortranUnitHeaderR	fortranPreCondit
500  hi! def link fortranTypeR		fortranType
501  hi! def link fortranStorageClassR	fortranStorageClass
502  hi! def link fortranOperatorR	        fortranOperator
503  hi! def link fortranInclude	        Include
504  hi! def link fortranLabelNumber	Special
505  hi! def link fortranTarget	        Special
506  hi! def link fortranFloatIll	        fortranFloat
507  hi! def link fortranIOR		fortranIO
508  hi! def link fortranKeywordR	        fortranKeyword
509  hi! def link fortranStringR	        fortranString
510  hi! def link fortranConditionalR	fortranConditional
511endif
512
513" CUDA
514hi def link fortranIntrinsicCUDA        fortranIntrinsic
515hi def link fortranTypeCUDA             fortranType
516hi def link fortranStringCUDA           fortranString
517
518hi def link fortranFormatSpec	Identifier
519hi def link fortranFloat	Float
520hi def link fortranPreCondit	PreCondit
521hi def link cIncluded		fortranString
522hi def link cInclude		Include
523hi def link cPreProc		PreProc
524hi def link cPreCondit		PreCondit
525hi def link fortranOpenMP       PreProc
526hi def link fortranParenError	Error
527hi def link fortranComment	Comment
528hi def link fortranSerialNumber	Todo
529hi def link fortranTab		Error
530
531" Uncomment the next line if you use extra intrinsics provided by vendors
532"hi def link fortranExtraIntrinsic	Function
533
534let b:current_syntax = "fortran"
535
536let &cpo = s:cpo_save
537unlet s:cpo_save
538" vim: ts=8 tw=132
539