xref: /vim-8.2.3635/runtime/syntax/fortran.vim (revision 130cbfc3)
1071d4279SBram Moolenaar" Vim syntax file
2256972a9SBram Moolenaar" Language:	Fortran 2008 (and older: Fortran 2003, 95, 90, and 77)
3*130cbfc3SBram Moolenaar" Version:	(v104) 2021 April 06
48a94d873SBram Moolenaar" Maintainer:	Ajit J. Thakkar <[email protected]>; <http://www2.unb.ca/~ajit/>
5e06c188bSBram Moolenaar" Usage:	For instructions, do :help fortran-syntax from Vim
6071d4279SBram Moolenaar" Credits:
74f4d51a9SBram Moolenaar"  Version 0.1 for Fortran 95 was created in April 2000 by Ajit Thakkar from an
84f4d51a9SBram Moolenaar"  older Fortran 77 syntax file by Mario Eusebio and Preben Guldberg.
90c0734d5SBram Moolenaar"  Since then, useful suggestions and contributions have been made, in order, by:
10dae8d21dSBram Moolenaar"  Andrej Panjkov, Bram Moolenaar, Thomas Olsen, Michael Sternberg, Christian Reile,
11*130cbfc3SBram Moolenaar"  Walter Dieudonne, Alexander Wagner, Roman Bertle, Charles Rendleman,
12e4a3bcf2SBram Moolenaar"  Andrew Griffiths, Joe Krahn, Hendrik Merx, Matt Thompson, Jan Hermann,
13*130cbfc3SBram Moolenaar"  Stefano Zaghi, Vishnu V. Krishnan, Judicael Grasset, Takuma Yoshida,
14*130cbfc3SBram Moolenaar"  Eisuke Kawashima, Andre Chalella, and Fritz Reese.
15071d4279SBram Moolenaar
166be7f873SBram Moolenaarif exists("b:current_syntax")
17071d4279SBram Moolenaar  finish
18071d4279SBram Moolenaarendif
19071d4279SBram Moolenaar
20b6b046b2SBram Moolenaarlet s:cpo_save = &cpo
21b6b046b2SBram Moolenaarset cpo&vim
22b6b046b2SBram Moolenaar
236be7f873SBram Moolenaar" Choose fortran_dialect using the priority:
24256972a9SBram Moolenaar" source file directive > buffer-local value > global value > file extension
25256972a9SBram Moolenaar" first try using directive in first three lines of file
26071d4279SBram Moolenaarlet b:fortran_retype = getline(1)." ".getline(2)." ".getline(3)
276be7f873SBram Moolenaarif b:fortran_retype =~? '\<fortran_dialect\s*=\s*F\>'
28071d4279SBram Moolenaar  let b:fortran_dialect = "F"
296be7f873SBram Moolenaarelseif b:fortran_retype =~? '\<fortran_dialect\s*=\s*f08\>'
306be7f873SBram Moolenaar  let b:fortran_dialect = "f08"
316be7f873SBram Moolenaarelseif !exists("b:fortran_dialect")
326be7f873SBram Moolenaar  if exists("g:fortran_dialect") && g:fortran_dialect =~# '\<F\|f08\>'
336be7f873SBram Moolenaar    " try global variable
346be7f873SBram Moolenaar    let b:fortran_dialect = g:fortran_dialect
356be7f873SBram Moolenaar  else         " nothing found, so use default
366be7f873SBram Moolenaar    let b:fortran_dialect = "f08"
37071d4279SBram Moolenaar  endif
386be7f873SBram Moolenaarendif
396be7f873SBram Moolenaarunlet! b:fortran_retype
406be7f873SBram Moolenaar" make sure buffer-local value is not invalid
416be7f873SBram Moolenaarif b:fortran_dialect !~# '\<F\|f08\>'
426be7f873SBram Moolenaar  let b:fortran_dialect = "f08"
43071d4279SBram Moolenaarendif
44071d4279SBram Moolenaar
45071d4279SBram Moolenaar" Choose between fixed and free source form if this hasn't been done yet
46071d4279SBram Moolenaarif !exists("b:fortran_fixed_source")
476be7f873SBram Moolenaar  if b:fortran_dialect == "F"
486be7f873SBram Moolenaar    " F requires free source form
49071d4279SBram Moolenaar    let b:fortran_fixed_source = 0
50071d4279SBram Moolenaar  elseif exists("fortran_free_source")
516be7f873SBram Moolenaar    " User guarantees free source form for all fortran files
52071d4279SBram Moolenaar    let b:fortran_fixed_source = 0
53071d4279SBram Moolenaar  elseif exists("fortran_fixed_source")
546be7f873SBram Moolenaar    " User guarantees fixed source form for all fortran files
55071d4279SBram Moolenaar    let b:fortran_fixed_source = 1
562c7f8c57SBram Moolenaar  elseif expand("%:e") =~? '^f\%(90\|95\|03\|08\)$'
57256972a9SBram Moolenaar    " Free-form file extension defaults as in Intel ifort, gcc(gfortran), NAG, Pathscale, and Cray compilers
58256972a9SBram Moolenaar    let b:fortran_fixed_source = 0
592c7f8c57SBram Moolenaar  elseif expand("%:e") =~? '^\%(f\|f77\|for\)$'
60256972a9SBram Moolenaar    " Fixed-form file extension defaults
61256972a9SBram Moolenaar    let b:fortran_fixed_source = 1
62071d4279SBram Moolenaar  else
636be7f873SBram Moolenaar    " Modern fortran still allows both free and fixed source form.
64071d4279SBram Moolenaar    " Assume fixed source form unless signs of free source form
65c88ebf7fSBram Moolenaar    " are detected in the first five columns of the first s:lmax lines.
66071d4279SBram Moolenaar    " Detection becomes more accurate and time-consuming if more lines
67071d4279SBram Moolenaar    " are checked. Increase the limit below if you keep lots of comments at
68071d4279SBram Moolenaar    " the very top of each file and you have a fast computer.
69c88ebf7fSBram Moolenaar    let s:lmax = 500
70c88ebf7fSBram Moolenaar    if ( s:lmax > line("$") )
71c88ebf7fSBram Moolenaar      let s:lmax = line("$")
72071d4279SBram Moolenaar    endif
73071d4279SBram Moolenaar    let b:fortran_fixed_source = 1
74c88ebf7fSBram Moolenaar    let s:ln=1
75c88ebf7fSBram Moolenaar    while s:ln <= s:lmax
76c88ebf7fSBram Moolenaar      let s:test = strpart(getline(s:ln),0,5)
77c88ebf7fSBram Moolenaar      if s:test !~ '^[Cc*]' && s:test !~ '^ *[!#]' && s:test =~ '[^ 0-9\t]' && s:test !~ '^[ 0-9]*\t'
78071d4279SBram Moolenaar        let b:fortran_fixed_source = 0
79071d4279SBram Moolenaar        break
80071d4279SBram Moolenaar      endif
81c88ebf7fSBram Moolenaar      let s:ln = s:ln + 1
82071d4279SBram Moolenaar    endwhile
83c88ebf7fSBram Moolenaar    unlet! s:lmax s:ln s:test
84071d4279SBram Moolenaar  endif
85071d4279SBram Moolenaarendif
86071d4279SBram Moolenaar
87071d4279SBram Moolenaarsyn case ignore
88071d4279SBram Moolenaar
89071d4279SBram Moolenaarif b:fortran_fixed_source == 1
90071d4279SBram Moolenaar  syn match fortranConstructName	"^\s\{6,}\zs\a\w*\ze\s*:"
91071d4279SBram Moolenaarelse
92071d4279SBram Moolenaar  syn match fortranConstructName	"^\s*\zs\a\w*\ze\s*:"
93071d4279SBram Moolenaarendif
94071d4279SBram Moolenaarif exists("fortran_more_precise")
950c0734d5SBram Moolenaar  syn match fortranConstructName "\(\<end\s*do\s\+\)\@11<=\a\w*"
960c0734d5SBram Moolenaar  syn match fortranConstructName "\(\<end\s*if\s\+\)\@11<=\a\w*"
970c0734d5SBram Moolenaar  syn match fortranConstructName "\(\<end\s*select\s\+\)\@15<=\a\w*"
98071d4279SBram Moolenaarendif
99071d4279SBram Moolenaar
100071d4279SBram Moolenaarsyn match fortranUnitHeader	"\<end\>"
101910f66f9SBram Moolenaarsyn match fortranType		"\<character\>"
102910f66f9SBram Moolenaarsyn match fortranType		"\<complex\>"
103910f66f9SBram Moolenaarsyn match fortranType		"\<integer\>"
1044f4d51a9SBram Moolenaarsyn match fortranType		"\<real\>"
1054f4d51a9SBram Moolenaarsyn match fortranType		"\<logical\>"
106071d4279SBram Moolenaarsyn keyword fortranType		intrinsic
107071d4279SBram Moolenaarsyn match fortranType		"\<implicit\>"
108071d4279SBram Moolenaarsyn keyword fortranStructure	dimension
109071d4279SBram Moolenaarsyn keyword fortranStorageClass	parameter save
110071d4279SBram Moolenaarsyn match fortranUnitHeader	"\<subroutine\>"
111071d4279SBram Moolenaarsyn keyword fortranCall		call
112071d4279SBram Moolenaarsyn match fortranUnitHeader	"\<function\>"
113071d4279SBram Moolenaarsyn match fortranUnitHeader	"\<program\>"
114e4a3bcf2SBram Moolenaarsyn match fortranUnitHeader	"\<block\>"
115910f66f9SBram Moolenaarsyn keyword fortranKeyword	return stop
116071d4279SBram Moolenaarsyn keyword fortranConditional	else then
117071d4279SBram Moolenaarsyn match fortranConditional	"\<if\>"
1186ee8d89cSBram Moolenaarsyn match fortranConditionalOb	"\<if\s*(.*)\s*\d\+\s*,\s*\d\+\s*,\s*\d\+\s*$"
119071d4279SBram Moolenaarsyn match fortranRepeat		"\<do\>"
120071d4279SBram Moolenaar
121071d4279SBram Moolenaarsyn keyword fortranTodo		contained todo fixme
122071d4279SBram Moolenaar
123071d4279SBram Moolenaar"Catch errors caused by too many right parentheses
124910f66f9SBram Moolenaarsyn region fortranParen transparent start="(" end=")" contains=ALLBUT,fortranParenError,@fortranCommentGroup,cIncluded,@spell
125071d4279SBram Moolenaarsyn match  fortranParenError   ")"
126071d4279SBram Moolenaar
127071d4279SBram Moolenaarsyn match fortranOperator	"\.\s*n\=eqv\s*\."
128071d4279SBram Moolenaarsyn match fortranOperator	"\.\s*\(and\|or\|not\)\s*\."
129071d4279SBram Moolenaarsyn match fortranOperator	"\(+\|-\|/\|\*\)"
1306be7f873SBram Moolenaarsyn match fortranTypeOb		"\<character\s*\*"
131071d4279SBram Moolenaar
132071d4279SBram Moolenaarsyn match fortranBoolean	"\.\s*\(true\|false\)\s*\."
133071d4279SBram Moolenaar
134910f66f9SBram Moolenaarsyn keyword fortranReadWrite	backspace close endfile inquire open print read rewind write
135071d4279SBram Moolenaar
136071d4279SBram Moolenaar"If tabs are allowed then the left margin checks do not work
137071d4279SBram Moolenaarif exists("fortran_have_tabs")
138071d4279SBram Moolenaar  syn match fortranTab		"\t"  transparent
139071d4279SBram Moolenaarelse
140071d4279SBram Moolenaar  syn match fortranTab		"\t"
141071d4279SBram Moolenaarendif
142071d4279SBram Moolenaar
143910f66f9SBram Moolenaarsyn keyword fortranIO		access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit
144071d4279SBram Moolenaar
1456be7f873SBram Moolenaarsyn 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
146071d4279SBram Moolenaar
147071d4279SBram Moolenaar" Intrinsics provided by some vendors
1486ee8d89cSBram Moolenaarsyn 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
149071d4279SBram Moolenaar
1506be7f873SBram Moolenaarsyn 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
1516be7f873SBram Moolenaarsyn match fortranIntrinsic	"\<len\s*[(,]"me=s+3
1526be7f873SBram Moolenaarsyn match fortranIntrinsic	"\<real\s*("me=s+4
1536be7f873SBram Moolenaarsyn match fortranIntrinsic	"\<logical\s*("me=s+7
1544f4d51a9SBram Moolenaarsyn match fortranType           "\<implicit\s\+real\>"
1554f4d51a9SBram Moolenaarsyn match fortranType           "\<implicit\s\+logical\>"
156071d4279SBram Moolenaar
157071d4279SBram Moolenaar"Numbers of various sorts
158071d4279SBram Moolenaar" Integers
159071d4279SBram Moolenaarsyn match fortranNumber	display "\<\d\+\(_\a\w*\)\=\>"
160071d4279SBram Moolenaar" floating point number, without a decimal point
1616be7f873SBram Moolenaarsyn match fortranFloatIll	display	"\<\d\+[deq][-+]\=\d\+\(_\a\w*\)\=\>"
162071d4279SBram Moolenaar" floating point number, starting with a decimal point
1636be7f873SBram Moolenaarsyn match fortranFloatIll	display	"\.\d\+\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
164071d4279SBram Moolenaar" floating point number, no digits after decimal
1656be7f873SBram Moolenaarsyn match fortranFloatIll	display	"\<\d\+\.\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
166071d4279SBram Moolenaar" floating point number, D or Q exponents
1676be7f873SBram Moolenaarsyn match fortranFloatIll	display	"\<\d\+\.\d\+\([dq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
168071d4279SBram Moolenaar" floating point number
169071d4279SBram Moolenaarsyn match fortranFloat	display	"\<\d\+\.\d\+\(e[-+]\=\d\+\)\=\(_\a\w*\)\=\>"
1704f4d51a9SBram Moolenaar" binary number
1714f4d51a9SBram Moolenaarsyn match fortranBinary	display	"b["'][01]\+["']"
1724f4d51a9SBram Moolenaar" octal number
1734f4d51a9SBram Moolenaarsyn match fortranOctal	display	"o["'][0-7]\+["']"
1744f4d51a9SBram Moolenaar" hexadecimal number
1754f4d51a9SBram Moolenaarsyn match fortranHex	display	"z["'][0-9A-F]\+["']"
176071d4279SBram Moolenaar" Numbers in formats
177071d4279SBram Moolenaarsyn match fortranFormatSpec	display	"\d*f\d\+\.\d\+"
178071d4279SBram Moolenaarsyn match fortranFormatSpec	display	"\d*e[sn]\=\d\+\.\d\+\(e\d+\>\)\="
179071d4279SBram Moolenaarsyn match fortranFormatSpec	display	"\d*\(d\|q\|g\)\d\+\.\d\+\(e\d+\)\="
180071d4279SBram Moolenaarsyn match fortranFormatSpec	display	"\d\+x\>"
181071d4279SBram Moolenaar" The next match cannot be used because it would pick up identifiers as well
182071d4279SBram Moolenaar" syn match fortranFormatSpec	display	"\<\(a\|i\)\d\+"
183071d4279SBram Moolenaar
184071d4279SBram Moolenaar" Numbers as labels
185071d4279SBram Moolenaarsyn match fortranLabelNumber	display	"^\d\{1,5}\s"me=e-1
186071d4279SBram Moolenaarsyn match fortranLabelNumber	display	"^ \d\{1,4}\s"ms=s+1,me=e-1
187071d4279SBram Moolenaarsyn match fortranLabelNumber	display	"^  \d\{1,3}\s"ms=s+2,me=e-1
188071d4279SBram Moolenaarsyn match fortranLabelNumber	display	"^   \d\d\=\s"ms=s+3,me=e-1
189071d4279SBram Moolenaarsyn match fortranLabelNumber	display	"^    \d\s"ms=s+4,me=e-1
190071d4279SBram Moolenaar
1916be7f873SBram Moolenaarif exists("fortran_more_precise")
192071d4279SBram Moolenaar  " Numbers as targets
193071d4279SBram Moolenaar  syn match fortranTarget	display	"\(\<if\s*(.\+)\s*\)\@<=\(\d\+\s*,\s*\)\{2}\d\+\>"
194560979edSBram Moolenaar  syn match fortranTarget	display	"\(\<do\s\+\)\@11<=\d\+\>"
195560979edSBram Moolenaar  syn match fortranTarget	display	"\(\<go\s*to\s*(\=\)\@11<=\(\d\+\s*,\s*\)*\d\+\>"
196071d4279SBram Moolenaarendif
197071d4279SBram Moolenaar
1986be7f873SBram Moolenaarsyn keyword fortranTypeR	external
1996be7f873SBram Moolenaarsyn keyword fortranIOR		format
2006be7f873SBram Moolenaarsyn match fortranKeywordR	"\<continue\>"
201e06c188bSBram Moolenaarsyn match fortranKeyword	"^\s*\d\+\s\+continue\>"
2026ee8d89cSBram Moolenaarsyn match fortranKeyword  	"\<go\s*to\>"
2036ee8d89cSBram Moolenaarsyn match fortranKeywordDel  	"\<go\s*to\ze\s\+.*,\s*(.*$"
2046ee8d89cSBram Moolenaarsyn match fortranKeywordOb  	"\<go\s*to\ze\s*(\d\+.*$"
2056be7f873SBram Moolenaarsyn region fortranStringR	start=+'+ end=+'+ contains=fortranContinueMark,fortranLeftMargin,fortranSerialNumber
2066be7f873SBram Moolenaarsyn keyword fortranIntrinsicR	dim lge lgt lle llt mod
2076ee8d89cSBram Moolenaarsyn keyword fortranKeywordDel	assign pause
208071d4279SBram Moolenaar
209910f66f9SBram Moolenaarsyn match fortranType           "\<type\>"
210910f66f9SBram Moolenaarsyn keyword fortranType	        none
211071d4279SBram Moolenaar
212071d4279SBram Moolenaarsyn keyword fortranStructure	private public intent optional
213071d4279SBram Moolenaarsyn keyword fortranStructure	pointer target allocatable
214071d4279SBram Moolenaarsyn keyword fortranStorageClass	in out
215071d4279SBram Moolenaarsyn match fortranStorageClass	"\<kind\s*="me=s+4
216071d4279SBram Moolenaarsyn match fortranStorageClass	"\<len\s*="me=s+3
217071d4279SBram Moolenaar
218071d4279SBram Moolenaarsyn match fortranUnitHeader	"\<module\>"
219e4a3bcf2SBram Moolenaarsyn match fortranUnitHeader	"\<submodule\>"
220071d4279SBram Moolenaarsyn keyword fortranUnitHeader	use only contains
221071d4279SBram Moolenaarsyn keyword fortranUnitHeader	result operator assignment
222071d4279SBram Moolenaarsyn match fortranUnitHeader	"\<interface\>"
223910f66f9SBram Moolenaarsyn keyword fortranKeyword	allocate deallocate nullify cycle exit
224071d4279SBram Moolenaarsyn match fortranConditional	"\<select\>"
225071d4279SBram Moolenaarsyn keyword fortranConditional	case default where elsewhere
226071d4279SBram Moolenaar
227071d4279SBram Moolenaarsyn match fortranOperator	"\(\(>\|<\)=\=\|==\|/=\|=\)"
228071d4279SBram Moolenaarsyn match fortranOperator	"=>"
229071d4279SBram Moolenaar
230071d4279SBram Moolenaarsyn region fortranString	start=+"+ end=+"+	contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
231071d4279SBram Moolenaarsyn keyword fortranIO		pad position action delim readwrite
232071d4279SBram Moolenaarsyn keyword fortranIO		eor advance nml
233071d4279SBram Moolenaar
2346be7f873SBram Moolenaarsyn 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
2356be7f873SBram Moolenaarsyn 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
2366be7f873SBram Moolenaarsyn match fortranIntrinsic		"\<not\>\(\s*\.\)\@!"me=s+3
2376be7f873SBram Moolenaarsyn match fortranIntrinsic	"\<kind\>\s*[(,]"me=s+4
238071d4279SBram Moolenaar
239071d4279SBram Moolenaarsyn match  fortranUnitHeader	"\<end\s*function"
240071d4279SBram Moolenaarsyn match  fortranUnitHeader	"\<end\s*interface"
241071d4279SBram Moolenaarsyn match  fortranUnitHeader	"\<end\s*module"
242e4a3bcf2SBram Moolenaarsyn match  fortranUnitHeader	"\<end\s*submodule"
243071d4279SBram Moolenaarsyn match  fortranUnitHeader	"\<end\s*program"
244071d4279SBram Moolenaarsyn match  fortranUnitHeader	"\<end\s*subroutine"
245e4a3bcf2SBram Moolenaarsyn match  fortranUnitHeader	"\<end\s*block"
246071d4279SBram Moolenaarsyn match  fortranRepeat	"\<end\s*do"
247071d4279SBram Moolenaarsyn match  fortranConditional	"\<end\s*where"
248071d4279SBram Moolenaarsyn match  fortranConditional	"\<select\s*case"
249071d4279SBram Moolenaarsyn match  fortranConditional	"\<end\s*select"
250071d4279SBram Moolenaarsyn match  fortranType	"\<end\s*type"
251071d4279SBram Moolenaarsyn match  fortranType	"\<in\s*out"
252071d4279SBram Moolenaar
253b6b046b2SBram Moolenaarsyn keyword fortranType	        procedure
25430b65817SBram Moolenaarsyn match  fortranType	        "\<module\ze\s\+procedure\>"
2556be7f873SBram Moolenaarsyn keyword fortranIOR		namelist
2566be7f873SBram Moolenaarsyn keyword fortranConditionalR	while
2576be7f873SBram Moolenaarsyn keyword fortranIntrinsicR	achar iachar transfer
258071d4279SBram Moolenaar
259071d4279SBram Moolenaarsyn keyword fortranInclude		include
2606be7f873SBram Moolenaarsyn keyword fortranStorageClassR	sequence
261071d4279SBram Moolenaar
262071d4279SBram Moolenaarsyn match   fortranConditional	"\<end\s*if"
263071d4279SBram Moolenaarsyn match   fortranIO		contains=fortranOperator "\<e\(nd\|rr\)\s*=\s*\d\+"
264071d4279SBram Moolenaarsyn match   fortranConditional	"\<else\s*if"
265071d4279SBram Moolenaar
2666ee8d89cSBram Moolenaarsyn keyword fortranUnitHeaderOb	entry
267071d4279SBram Moolenaarsyn match fortranTypeR		display "double\s\+precision"
268071d4279SBram Moolenaarsyn match fortranTypeR		display "double\s\+complex"
269071d4279SBram Moolenaarsyn match fortranUnitHeaderR	display "block\s\+data"
270071d4279SBram Moolenaarsyn keyword fortranStorageClassR	common equivalence data
2716be7f873SBram Moolenaarsyn keyword fortranIntrinsicR	dble dprod
2726be7f873SBram Moolenaarsyn match   fortranOperatorR	"\.\s*[gl][et]\s*\."
2736be7f873SBram Moolenaarsyn match   fortranOperatorR	"\.\s*\(eq\|ne\)\s*\."
274071d4279SBram Moolenaar
275071d4279SBram Moolenaarsyn keyword fortranRepeat		forall
276071d4279SBram Moolenaarsyn match fortranRepeat		"\<end\s*forall"
2776be7f873SBram Moolenaarsyn keyword fortranIntrinsic	null cpu_time
278071d4279SBram Moolenaarsyn match fortranType			"\<elemental\>"
279071d4279SBram Moolenaarsyn match fortranType			"\<pure\>"
280e4a3bcf2SBram Moolenaarsyn match fortranType			"\<impure\>"
2814f4d51a9SBram Moolenaarsyn match fortranType           	"\<recursive\>"
282071d4279SBram Moolenaarif exists("fortran_more_precise")
283560979edSBram Moolenaar  syn match fortranConstructName "\(\<end\s*forall\s\+\)\@15<=\a\w*\>"
284071d4279SBram Moolenaarendif
285071d4279SBram Moolenaar
2866be7f873SBram Moolenaarif b:fortran_dialect == "f08"
287e06c188bSBram Moolenaar  " F2003
2886be7f873SBram Moolenaar  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
289e06c188bSBram Moolenaar  " ISO_C_binding
2906be7f873SBram Moolenaar  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
2916be7f873SBram Moolenaar  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
2926be7f873SBram Moolenaar  syn keyword fortranIntrinsic        iso_c_binding c_loc c_funloc c_associated  c_f_pointer c_f_procpointer
2936be7f873SBram Moolenaar  syn keyword fortranType             c_ptr c_funptr
294e06c188bSBram Moolenaar  " ISO_Fortran_env
2956be7f873SBram Moolenaar  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
296e06c188bSBram Moolenaar  " IEEE_arithmetic
2976be7f873SBram Moolenaar  syn keyword fortranIntrinsic        ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode
298e06c188bSBram Moolenaar
2996be7f873SBram Moolenaar  syn keyword fortranReadWrite	flush wait
3006be7f873SBram Moolenaar  syn keyword fortranIO 	      decimal round iomsg
301e4a3bcf2SBram Moolenaar  syn keyword fortranType             asynchronous nopass non_overridable pass protected volatile extends import
3026be7f873SBram Moolenaar  syn keyword fortranType             non_intrinsic value bind deferred generic final enumerator
303e4a3bcf2SBram Moolenaar  syn match fortranType               "\<abstract\>"
3046be7f873SBram Moolenaar  syn match fortranType               "\<class\>"
3056be7f873SBram Moolenaar  syn match fortranType               "\<associate\>"
3066be7f873SBram Moolenaar  syn match fortranType               "\<end\s*associate"
3076be7f873SBram Moolenaar  syn match fortranType               "\<enum\s*,\s*bind\s*(\s*c\s*)"
3086be7f873SBram Moolenaar  syn match fortranType               "\<end\s*enum"
3096be7f873SBram Moolenaar  syn match fortranConditional	"\<select\s*type"
3106be7f873SBram Moolenaar  syn match fortranConditional        "\<type\s*is\>"
3116be7f873SBram Moolenaar  syn match fortranConditional        "\<class\s*is\>"
3126be7f873SBram Moolenaar  syn match fortranUnitHeader         "\<abstract\s*interface\>"
3136be7f873SBram Moolenaar  syn match fortranOperator           "\([\|]\)"
314e06c188bSBram Moolenaar
315e06c188bSBram Moolenaar  " F2008
3166be7f873SBram Moolenaar  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
3176be7f873SBram Moolenaar  syn keyword fortranIntrinsic        atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits
3186be7f873SBram Moolenaar  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
3196be7f873SBram Moolenaar  syn keyword fortranIO               newunit
3206be7f873SBram Moolenaar  syn keyword fortranType             contiguous
321e4a3bcf2SBram Moolenaar  syn keyword fortranRepeat           concurrent
3228a94d873SBram Moolenaar
3238a94d873SBram Moolenaar" CUDA fortran
3248a94d873SBram Moolenaar  syn match fortranTypeCUDA           "\<attributes\>"
3258a94d873SBram Moolenaar  syn keyword fortranTypeCUDA         host global device value
3268a94d873SBram Moolenaar  syn keyword fortranTypeCUDA         shared constant pinned texture
3278a94d873SBram Moolenaar  syn keyword fortranTypeCUDA         dim1 dim2 dim3 dim4
3288a94d873SBram Moolenaar  syn keyword fortranTypeCUDA         cudadeviceprop cuda_count_kind cuda_stream_kind
3298a94d873SBram Moolenaar  syn keyword fortranTypeCUDA         cudaEvent cudaFuncAttributes cudaArrayPtr
3308a94d873SBram Moolenaar  syn keyword fortranTypeCUDA         cudaSymbol cudaChannelFormatDesc cudaPitchedPtr
3318a94d873SBram Moolenaar  syn keyword fortranTypeCUDA         cudaExtent cudaMemcpy3DParms
3328a94d873SBram Moolenaar  syn keyword fortranTypeCUDA         cudaFuncCachePreferNone cudaFuncCachePreferShared
3338a94d873SBram Moolenaar  syn keyword fortranTypeCUDA         cudaFuncCachePreferL1 cudaLimitStackSize
3348a94d873SBram Moolenaar  syn keyword fortranTypeCUDA         cudaLimitPrintfSize cudaLimitMallocHeapSize
3358a94d873SBram Moolenaar  syn keyword fortranTypeCUDA         cudaSharedMemBankSizeDefault cudaSharedMemBankSizeFourByte cudaSharedMemBankSizeEightByte
3368a94d873SBram Moolenaar  syn keyword fortranTypeCUDA         cudaEventDefault cudaEventBlockingSync cudaEventDisableTiming
3378a94d873SBram Moolenaar  syn keyword fortranTypeCUDA         cudaMemcpyHostToDevice cudaMemcpyDeviceToHost
3388a94d873SBram Moolenaar  syn keyword fortranTypeCUDA         cudaMemcpyDeviceToDevice
3398a94d873SBram Moolenaar  syn keyword fortranTypeCUDA         cudaErrorNotReady cudaSuccess cudaErrorInvalidValue
3408a94d873SBram Moolenaar  syn keyword fortranTypeCUDA         c_devptr
3418a94d873SBram Moolenaar
3428a94d873SBram Moolenaar  syn match fortranStringCUDA         "blockidx%[xyz]"
3438a94d873SBram Moolenaar  syn match fortranStringCUDA         "blockdim%[xyz]"
3448a94d873SBram Moolenaar  syn match fortranStringCUDA         "griddim%[xyz]"
3458a94d873SBram Moolenaar  syn match fortranStringCUDA         "threadidx%[xyz]"
3468a94d873SBram Moolenaar
3478a94d873SBram Moolenaar  syn keyword fortranIntrinsicCUDA    warpsize syncthreads syncthreads_and syncthreads_count syncthreads_or threadfence threadfence_block threadfence_system gpu_time allthreads anythread ballot
3488a94d873SBram Moolenaar  syn keyword fortranIntrinsicCUDA    atomicadd atomicsub atomicmax atomicmin atomicand atomicor atomicxor atomicexch atomicinc atomicdec atomiccas sizeof __shfl __shfl_up __shfl_down __shfl_xor
3498a94d873SBram Moolenaar  syn keyword fortranIntrinsicCUDA    cudaChooseDevice cudaDeviceGetCacheConfig cudaDeviceGetLimit cudaDeviceGetSharedMemConfig cudaDeviceReset cudaDeviceSetCacheConfig cudaDeviceSetLimit cudaDeviceSetSharedMemConfig cudaDeviceSynchronize cudaGetDevice cudaGetDeviceCount cudaGetDeviceProperties cudaSetDevice cudaSetDeviceFlags cudaSetValidDevices
3508a94d873SBram Moolenaar  syn keyword fortranIntrinsicCUDA    cudaThreadExit cudaThreadSynchronize cudaGetLastError cudaGetErrorString cudaPeekAtLastError cudaStreamCreate cudaStreamDestroy cudaStreamQuery cudaStreamSynchronize cudaStreamWaitEvent cudaEventCreate cudaEventCreateWithFlags cudaEventDestroy cudaEventElapsedTime cudaEventQuery cudaEventRecord cudaEventSynchronize
3518a94d873SBram Moolenaar  syn keyword fortranIntrinsicCUDA    cudaFuncGetAttributes cudaFuncSetCacheConfig cudaFuncSetSharedMemConfig cudaSetDoubleForDevice cudaSetDoubleForHost cudaFree cudaFreeArray cudaFreeHost cudaGetSymbolAddress cudaGetSymbolSize
3528a94d873SBram Moolenaar  syn keyword fortranIntrinsicCUDA    cudaHostAlloc cudaHostGetDevicePointer cudaHostGetFlags cudaHostRegister cudaHostUnregister cudaMalloc cudaMallocArray cudaMallocHost cudaMallocPitch cudaMalloc3D cudaMalloc3DArray
3538a94d873SBram Moolenaar  syn keyword fortranIntrinsicCUDA    cudaMemcpy cudaMemcpyArraytoArray cudaMemcpyAsync cudaMemcpyFromArray cudaMemcpyFromSymbol cudaMemcpyFromSymbolAsync cudaMemcpyPeer cudaMemcpyPeerAsync cudaMemcpyToArray cudaMemcpyToSymbol cudaMemcpyToSymbolAsync cudaMemcpy2D cudaMemcpy2DArrayToArray cudaMemcpy2DAsync cudaMemcpy2DFromArray cudaMemcpy2DToArray cudaMemcpy3D cudaMemcpy3DAsync
3548a94d873SBram Moolenaar  syn keyword fortranIntrinsicCUDA    cudaMemGetInfo cudaMemset cudaMemset2D cudaMemset3D cudaDeviceCanAccessPeer cudaDeviceDisablePeerAccess cudaDeviceEnablePeerAccess cudaPointerGetAttributes cudaDriverGetVersion cudaRuntimeGetVersion
3558a94d873SBram Moolenaar
3568a94d873SBram Moolenaar  syn region none matchgroup=fortranType start="<<<" end=">>>" contains=ALLBUT,none
357e06c188bSBram Moolenaarendif
358e06c188bSBram Moolenaar
359071d4279SBram Moolenaarsyn cluster fortranCommentGroup contains=fortranTodo
360071d4279SBram Moolenaar
361071d4279SBram Moolenaarif (b:fortran_fixed_source == 1)
362071d4279SBram Moolenaar  if !exists("fortran_have_tabs")
363*130cbfc3SBram Moolenaar    " Fixed format requires a textwidth of 72 for code,
364*130cbfc3SBram Moolenaar    " but some vendor extensions allow longer lines
365*130cbfc3SBram Moolenaar    if exists("fortran_extended_line_length")
366*130cbfc3SBram Moolenaar      syn match fortranSerialNumber	excludenl "^.\{133,}$"lc=132
367*130cbfc3SBram Moolenaar    elseif exists("fortran_cardimage_line_length")
368*130cbfc3SBram Moolenaar      syn match fortranSerialNumber	excludenl "^.\{81,}$"lc=80
369*130cbfc3SBram Moolenaar    else
370071d4279SBram Moolenaar      syn match fortranSerialNumber	excludenl "^.\{73,}$"lc=72
371*130cbfc3SBram Moolenaar    endif
372071d4279SBram Moolenaar    "Flag left margin errors
373071d4279SBram Moolenaar    syn match fortranLabelError	"^.\{-,4}[^0-9 ]" contains=fortranTab
374071d4279SBram Moolenaar    syn match fortranLabelError	"^.\{4}\d\S"
375071d4279SBram Moolenaar  endif
3765c73622aSBram Moolenaar  syn match fortranComment		excludenl "^[!c*].*$" contains=@fortranCommentGroup,@spell
377071d4279SBram Moolenaar  syn match fortranLeftMargin		transparent "^ \{5}"
378071d4279SBram Moolenaar  syn match fortranContinueMark		display "^.\{5}\S"lc=5
379071d4279SBram Moolenaarelse
380071d4279SBram Moolenaar  syn match fortranContinueMark		display "&"
381071d4279SBram Moolenaarendif
382071d4279SBram Moolenaar
383910f66f9SBram Moolenaarsyn match fortranComment	excludenl "!.*$" contains=@fortranCommentGroup,@spell
3843e496b0eSBram Moolenaarsyn match fortranOpenMP		excludenl 		"^\s*!\$\(OMP\)\=&\=\s.*$"
385071d4279SBram Moolenaar
386071d4279SBram Moolenaar"cpp is often used with Fortran
387071d4279SBram Moolenaarsyn match	cPreProc		"^\s*#\s*\(define\|ifdef\)\>.*"
388071d4279SBram Moolenaarsyn match	cPreProc		"^\s*#\s*\(elif\|if\)\>.*"
389071d4279SBram Moolenaarsyn match	cPreProc		"^\s*#\s*\(ifndef\|undef\)\>.*"
390071d4279SBram Moolenaarsyn match	cPreCondit		"^\s*#\s*\(else\|endif\)\>.*"
3910c0734d5SBram Moolenaarsyn region	cIncluded	contained start=+"[^("]+ skip=+\\\\\|\\"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
3920c0734d5SBram Moolenaar"syn region	cIncluded	        contained start=+"[^("]+ skip=+\\\\\|\\"+ end=+"+
393071d4279SBram Moolenaarsyn match	cIncluded		contained "<[^>]*>"
394071d4279SBram Moolenaarsyn match	cInclude		"^\s*#\s*include\>\s*["<]" contains=cIncluded
395071d4279SBram Moolenaar
396071d4279SBram Moolenaar"Synchronising limits assume that comment and continuation lines are not mixed
397910f66f9SBram Moolenaarif exists("fortran_fold") || exists("fortran_more_precise")
398910f66f9SBram Moolenaar  syn sync fromstart
399910f66f9SBram Moolenaarelseif (b:fortran_fixed_source == 0)
400e06c188bSBram Moolenaar  syn sync linecont "&" minlines=30
401071d4279SBram Moolenaarelse
402e06c188bSBram Moolenaar  syn sync minlines=30
403071d4279SBram Moolenaarendif
404071d4279SBram Moolenaar
4056be7f873SBram Moolenaarif exists("fortran_fold")
406071d4279SBram Moolenaar
407071d4279SBram Moolenaar  if (b:fortran_fixed_source == 1)
408071d4279SBram Moolenaar    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
409e4a3bcf2SBram Moolenaar    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
410071d4279SBram Moolenaar    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
411e4a3bcf2SBram Moolenaar    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
412e4a3bcf2SBram Moolenaar    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
413e06c188bSBram Moolenaar    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
414c0514bf4SBram Moolenaar    syn region fortranAssociate transparent fold keepend start="^\s*\<associate\s\+" skip="^\([!c*]\|\s*#\).*$" excludenl end="\<end\s*associate" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction
415e4a3bcf2SBram Moolenaar    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
416e4a3bcf2SBram Moolenaar    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
417071d4279SBram Moolenaar  else
418071d4279SBram Moolenaar    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
419e4a3bcf2SBram Moolenaar    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
420071d4279SBram Moolenaar    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
421e4a3bcf2SBram Moolenaar    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
422e4a3bcf2SBram Moolenaar    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
423e06c188bSBram Moolenaar    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
424c0514bf4SBram Moolenaar    syn region fortranAssociate transparent fold keepend start="^\s*\<associate\s\+" skip="^\s*[!#].*$" excludenl end="\<end\s*associate" contains=ALLBUT,fortranProgram,fortranModule,fortranSubroutine,fortranFunction
425e4a3bcf2SBram Moolenaar    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
426e4a3bcf2SBram Moolenaar    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
427071d4279SBram Moolenaar  endif
428071d4279SBram Moolenaar
429071d4279SBram Moolenaar  if exists("fortran_fold_conditionals")
430071d4279SBram Moolenaar    if (b:fortran_fixed_source == 1)
431071d4279SBram Moolenaar      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
432071d4279SBram Moolenaar      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
433071d4279SBram Moolenaar      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
434c0514bf4SBram Moolenaar      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
435071d4279SBram Moolenaar    else
436071d4279SBram Moolenaar      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
437071d4279SBram Moolenaar      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
438dae8d21dSBram Moolenaar      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
439c0514bf4SBram Moolenaar      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
440071d4279SBram Moolenaar    endif
441071d4279SBram Moolenaar  endif
442071d4279SBram Moolenaar
443071d4279SBram Moolenaar  if exists("fortran_fold_multilinecomments")
444071d4279SBram Moolenaar    if (b:fortran_fixed_source == 1)
445071d4279SBram Moolenaar      syn match fortranMultiLineComments transparent fold "\(^[!c*].*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
446071d4279SBram Moolenaar    else
447071d4279SBram Moolenaar      syn match fortranMultiLineComments transparent fold "\(^\s*!.*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
448071d4279SBram Moolenaar    endif
449071d4279SBram Moolenaar  endif
450071d4279SBram Moolenaarendif
451071d4279SBram Moolenaar
452071d4279SBram Moolenaar" Define the default highlighting.
453071d4279SBram Moolenaar" The default highlighting differs for each dialect.
454071d4279SBram Moolenaar" Transparent groups:
455071d4279SBram Moolenaar" fortranParen, fortranLeftMargin
456071d4279SBram Moolenaar" fortranProgram, fortranModule, fortranSubroutine, fortranFunction,
457071d4279SBram Moolenaar" fortranBlockData
458071d4279SBram Moolenaar" fortran77Loop, fortran90Loop, fortranIfBlock, fortranCase
459071d4279SBram Moolenaar" fortranMultiCommentLines
4606be7f873SBram Moolenaarhi def link fortranKeyword 	Keyword
4616be7f873SBram Moolenaarhi def link fortranConstructName	Identifier
4626be7f873SBram Moolenaarhi def link fortranConditional	Conditional
4636be7f873SBram Moolenaarhi def link fortranRepeat	Repeat
4646be7f873SBram Moolenaarhi def link fortranTodo		Todo
4656be7f873SBram Moolenaarhi def link fortranContinueMark	Special
4666be7f873SBram Moolenaarhi def link fortranString	String
4676be7f873SBram Moolenaarhi def link fortranNumber	Number
4684f4d51a9SBram Moolenaarhi def link fortranBinary	Number
4694f4d51a9SBram Moolenaarhi def link fortranOctal	Number
4704f4d51a9SBram Moolenaarhi def link fortranHex  	Number
4716be7f873SBram Moolenaarhi def link fortranOperator	Operator
4726be7f873SBram Moolenaarhi def link fortranBoolean	Boolean
4736be7f873SBram Moolenaarhi def link fortranLabelError	Error
4746be7f873SBram Moolenaarhi def link fortranObsolete	Todo
4756be7f873SBram Moolenaarhi def link fortranType		Type
4766be7f873SBram Moolenaarhi def link fortranStructure	Type
4776be7f873SBram Moolenaarhi def link fortranStorageClass	StorageClass
4786be7f873SBram Moolenaarhi def link fortranCall		Function
4796be7f873SBram Moolenaarhi def link fortranUnitHeader	fortranPreCondit
4806be7f873SBram Moolenaarhi def link fortranReadWrite	Keyword
4816be7f873SBram Moolenaarhi def link fortranIO		Keyword
4826be7f873SBram Moolenaarhi def link fortranIntrinsic	Function
4836be7f873SBram Moolenaarhi def link fortranConstant	Constant
4846be7f873SBram Moolenaar
4856be7f873SBram Moolenaar" To stop deleted & obsolescent features being highlighted as Todo items,
4866be7f873SBram Moolenaar" comment out the next 5 lines and uncomment the 5 lines after that
4876be7f873SBram Moolenaarhi def link fortranUnitHeaderOb    fortranObsolete
4886be7f873SBram Moolenaarhi def link fortranKeywordOb       fortranObsolete
4896be7f873SBram Moolenaarhi def link fortranConditionalOb   fortranObsolete
4906be7f873SBram Moolenaarhi def link fortranTypeOb          fortranObsolete
4916be7f873SBram Moolenaarhi def link fortranKeywordDel      fortranObsolete
4926be7f873SBram Moolenaar"hi def link fortranUnitHeaderOb    fortranUnitHeader
4936be7f873SBram Moolenaar"hi def link fortranKeywordOb       fortranKeyword
4946be7f873SBram Moolenaar"hi def link fortranConditionalOb   fortranConditional
4956be7f873SBram Moolenaar"hi def link fortranTypeOb          fortranType
4966be7f873SBram Moolenaar"hi def link fortranKeywordDel      fortranKeyword
4976be7f873SBram Moolenaar
4986be7f873SBram Moolenaarif b:fortran_dialect == "F"
4996be7f873SBram Moolenaar  hi! def link fortranIntrinsicR	fortranObsolete
5006be7f873SBram Moolenaar  hi! def link fortranUnitHeaderR	fortranObsolete
5016be7f873SBram Moolenaar  hi! def link fortranTypeR		fortranObsolete
5026be7f873SBram Moolenaar  hi! def link fortranStorageClassR	fortranObsolete
5036be7f873SBram Moolenaar  hi! def link fortranOperatorR 	fortranObsolete
5046be7f873SBram Moolenaar  hi! def link fortranInclude   	fortranObsolete
5056be7f873SBram Moolenaar  hi! def link fortranLabelNumber	fortranObsolete
5066be7f873SBram Moolenaar  hi! def link fortranTarget	        fortranObsolete
5076be7f873SBram Moolenaar  hi! def link fortranFloatIll	        fortranObsolete
5086be7f873SBram Moolenaar  hi! def link fortranIOR		fortranObsolete
5096be7f873SBram Moolenaar  hi! def link fortranKeywordR	        fortranObsolete
5106be7f873SBram Moolenaar  hi! def link fortranStringR	        fortranObsolete
5116be7f873SBram Moolenaar  hi! def link fortranConditionalR	fortranObsolete
512e06c188bSBram Moolenaarelse
5136be7f873SBram Moolenaar  hi! def link fortranIntrinsicR	fortranIntrinsic
5146be7f873SBram Moolenaar  hi! def link fortranUnitHeaderR	fortranPreCondit
5156be7f873SBram Moolenaar  hi! def link fortranTypeR		fortranType
5166be7f873SBram Moolenaar  hi! def link fortranStorageClassR	fortranStorageClass
5176be7f873SBram Moolenaar  hi! def link fortranOperatorR	        fortranOperator
5186be7f873SBram Moolenaar  hi! def link fortranInclude	        Include
5196be7f873SBram Moolenaar  hi! def link fortranLabelNumber	Special
5206be7f873SBram Moolenaar  hi! def link fortranTarget	        Special
5216be7f873SBram Moolenaar  hi! def link fortranFloatIll	        fortranFloat
5226be7f873SBram Moolenaar  hi! def link fortranIOR		fortranIO
5236be7f873SBram Moolenaar  hi! def link fortranKeywordR	        fortranKeyword
5246be7f873SBram Moolenaar  hi! def link fortranStringR	        fortranString
5256be7f873SBram Moolenaar  hi! def link fortranConditionalR	fortranConditional
5266ee8d89cSBram Moolenaarendif
5276ee8d89cSBram Moolenaar
5288a94d873SBram Moolenaar" CUDA
5298a94d873SBram Moolenaarhi def link fortranIntrinsicCUDA        fortranIntrinsic
5308a94d873SBram Moolenaarhi def link fortranTypeCUDA             fortranType
5318a94d873SBram Moolenaarhi def link fortranStringCUDA           fortranString
5328a94d873SBram Moolenaar
5336be7f873SBram Moolenaarhi def link fortranFormatSpec	Identifier
5346be7f873SBram Moolenaarhi def link fortranFloat	Float
5356be7f873SBram Moolenaarhi def link fortranPreCondit	PreCondit
5366be7f873SBram Moolenaarhi def link cIncluded		fortranString
5376be7f873SBram Moolenaarhi def link cInclude		Include
5386be7f873SBram Moolenaarhi def link cPreProc		PreProc
5396be7f873SBram Moolenaarhi def link cPreCondit		PreCondit
54089bcfda6SBram Moolenaarhi def link fortranOpenMP       PreProc
5416be7f873SBram Moolenaarhi def link fortranParenError	Error
5426be7f873SBram Moolenaarhi def link fortranComment	Comment
5436be7f873SBram Moolenaarhi def link fortranSerialNumber	Todo
5446be7f873SBram Moolenaarhi def link fortranTab		Error
545071d4279SBram Moolenaar
5466be7f873SBram Moolenaar" Uncomment the next line if you use extra intrinsics provided by vendors
5476be7f873SBram Moolenaar"hi def link fortranExtraIntrinsic	Function
548071d4279SBram Moolenaar
549071d4279SBram Moolenaarlet b:current_syntax = "fortran"
550071d4279SBram Moolenaar
551b6b046b2SBram Moolenaarlet &cpo = s:cpo_save
552b6b046b2SBram Moolenaarunlet s:cpo_save
553071d4279SBram Moolenaar" vim: ts=8 tw=132
554