1# JOE syntax highlight file for FORTRAN
2# Heavily improved by: Malte Thoma (thoma@uni-muenster.de)
3
4# Bugs:
5#  in:  4.  eq.   -- does not recognize the .eq.
6#  needs more intrinsics.
7
8=Idle
9=Ident
10=Comment
11=Constant
12=Number		+Constant
13=Boolean	+Constant
14=String		+Constant
15=Type
16=Keyword
17=Operator	+Keyword
18=Statement	+Keyword
19=Builtin	+DefinedFunction
20=Loop		+Statement
21=Conditional	+Statement
22=Label		+Statement
23=Preproc
24=Bad
25
26# First character of line...
27
28:reset Idle
29	*		idle		noeat
30	"\n"		reset
31	"cC*"		comment		recolor=-1
32	"#"		pre		recolor=-1
33
34:pre	Preproc
35	*		pre
36	"\n"		reset
37
38:comment Comment comment
39	*		comment
40	"BFHNTX"	comment		noeat call=comment_todo.comment_todo()
41	"\n"		reset
42
43:idle Idle
44	*		idle
45	"!"		comment		recolor=-1
46	"\n"		reset
47	"0-9"		first_number	recolor=-1
48	"."		have_dot
49	"'"		string		recolor=-1
50	"a-zA-Z_"	ident		buffer
51
52:first_number Number
53	*		idle	noeat
54	"0-9"		first_number
55	"."		second_start
56	"eEdD"		epart
57
58:have_dot Number
59	*		idle	recolor=-2	noeat
60	"0-9"		second_number		recolor=-2
61	" \ta-zA-Z"	operator1	noeat recolor=-2
62
63# Color the left .
64
65:operator1 Operator
66	*	operator	buffer noeat
67	" \t"	operator1
68
69# Default color is Idle for unknown operator
70
71:operator Idle
72	*		idle	noeat
73	"a-zA-Z"	operator
74	". \t"		unknown	noeat istrings
75	"gt"		op
76	"ge"		op
77	"eq"		op
78	"le"		op
79	"ne"		op
80	"lt"		op
81	"and"		op
82	"or"		op
83	"llt"		op
84	"lle"		op
85	"lgt"		op
86	"lge"		op
87	"not"		op
88	"false"		bool
89	"true"		bool
90done
91
92# Eat the right .
93
94:unknown Operator
95	*	idle
96	" \t"	unknown
97
98:op Operator
99	*	idle
100	" \t"	op
101
102:bool Boolean
103	*	idle
104	"."	op noeat
105	" \t"	const
106
107# For distrinuishing between 4.e1 and 4.eq.
108
109:second_start Number
110	*	idle	noeat
111	"a-zA-Z"	operator1	noeat recolor=-2
112	"dD"	epart
113	"eE"	epart1
114	"0-9"	second_number
115
116:epart1 Number
117	*		idle	noeat
118	"q"		epart2
119	"0-9+\-"	enum
120
121:epart2	Idle
122	*		idle	noeat
123	". \t"		op	noeat recolor=-4
124
125:second_number Number
126	*		idle	noeat
127	"eEdD"		epart
128	"0-9"		second_number
129
130:epart Number
131	*		idle	noeat
132	"0-9+\-"	enum
133
134:enum Number
135	*		idle	noeat
136	"0-9"		enum
137
138:string	String string
139	*		string
140	"\n"		reset
141	"'"		maybe_end_string
142
143:maybe_end_string String string
144	*		idle	noeat
145	"'"		string
146
147:ident Ident
148	*		idle		noeat istrings
149	"allocate"	kw
150	"allocatable"	kw
151	"assign"	kw
152	"assignment"	kw
153	"backspace"	kw
154	"block"		kw
155	"blockdata"	kw
156	"call"		kw
157	"case"		label
158	"character"	type
159	"close"		kw
160	"common"	kw
161	"complex"	type
162	"contains"	kw
163	"continue"	loop
164	"cycle"		kw
165	"data"		kw
166	"deallocate"	kw
167	"default"	label
168	"dimension"	type
169	"do"		loop
170	"double"	type
171	"doubleprecision"	type
172	"elemental"	kw
173	"else"		cond
174	"elseif"	cond
175	"elsewhere"	cond
176	"end"		kw
177	"endblock"	kw
178	"endblockdata"	kw
179	"enddo"		loop
180	"endfile"	kw
181	"endforall"	loop
182	"endif"		cond
183	"endinterface"	kw
184	"endmodule"	kw
185	"endselect"	cond
186	"endtype"	kw
187	"endwhere"	kw
188	"entry"		kw
189	"equivalence"	kw
190	"exit"		kw
191	"external"	kw
192	"forall"	loop
193	"format"	kw
194	"function"	kw
195	"go"		loop
196	"goto"		loop
197	"if"		cond
198	"implicit"	kw
199	"in"		kw
200	"inout"		kw
201	"inquire"	kw
202	"integer"	type
203	"intent"	kw
204	"interface"	kw
205	"intrinsic"	kw
206	"iolength"	kw
207	"kind"		kw
208	"logical"	type
209	"module"	kw
210	"namelist"	kw
211	"none"		kw
212	"nullify"	kw
213	"only"		kw
214	"open"		kw
215	"optional"	kw
216	"out"		kw
217	"parameter"	kw
218	"pause"		kw
219	"pointer"	kw
220	"precision"	type
221	"print"		kw
222	"private"	kw
223	"procedure"	kw
224	"program"	kw
225	"publc"		kw
226	"public"	kw
227	"pure"		kw
228	"read"		kw
229	"real"		type
230	"recursive"	kw
231	"result"	kw
232	"return"	kw
233	"rewind"	kw
234	"save"		kw
235	"select"	cond
236	"selectcase"	cond
237	"sequence"	kw
238	"stat"		kw
239	"stop"		kw
240	"subroutine"	kw
241	"target"	kw
242	"then"		cond
243	"to"		loop
244	"type"		kw
245	"use"		kw
246	"where"		kw
247	"while"		loop
248	"write"		kw
249done
250	"("		idle	noeat istrings
251# Keywords have to be duplicated here...
252	"allocate"	kw
253	"allocatable"	kw
254	"assign"	kw
255	"assignment"	kw
256	"backspace"	kw
257	"block"		kw
258	"blockdata"	kw
259	"call"		kw
260	"case"		label
261	"character"	type
262	"close"		kw
263	"common"	kw
264	"complex"	type
265	"contains"	kw
266	"continue"	loop
267	"cycle"		kw
268	"data"		kw
269	"deallocate"	kw
270	"default"	label
271	"dimension"	type
272	"do"		loop
273	"double"	type
274	"doubleprecision"	type
275	"elemental"	kw
276	"else"		cond
277	"elseif"	cond
278	"elsewhere"	cond
279	"end"		kw
280	"endblock"	kw
281	"endblockdata"	kw
282	"enddo"		loop
283	"endfile"	kw
284	"endforall"	loop
285	"endif"		cond
286	"endinterface"	kw
287	"endmodule"	kw
288	"endselect"	cond
289	"endtype"	kw
290	"endwhere"	kw
291	"entry"		kw
292	"equivalence"	kw
293	"exit"		kw
294	"external"	kw
295	"forall"	loop
296	"format"	kw
297	"function"	kw
298	"go"		loop
299	"goto"		loop
300	"if"		cond
301	"implicit"	kw
302	"in"		kw
303	"inout"		kw
304	"inquire"	kw
305	"integer"	type
306	"intent"	kw
307	"interface"	kw
308	"intrinsic"	kw
309	"iolength"	kw
310	"kind"		kw
311	"logical"	type
312	"module"	kw
313	"namelist"	kw
314	"none"		kw
315	"nullify"	kw
316	"only"		kw
317	"open"		kw
318	"optional"	kw
319	"out"		kw
320	"parameter"	kw
321	"pause"		kw
322	"pointer"	kw
323	"precision"	type
324	"print"		kw
325	"private"	kw
326	"procedure"	kw
327	"program"	kw
328	"publc"		kw
329	"public"	kw
330	"pure"		kw
331	"read"		kw
332	"real"		kw
333	"recursive"	kw
334	"result"	kw
335	"return"	kw
336	"rewind"	kw
337	"save"		kw
338	"select"	cond
339	"selectcase"	cond
340	"sequence"	kw
341	"stat"		kw
342	"stop"		kw
343	"subroutine"	kw
344	"target"	kw
345	"then"		cond
346	"to"		loop
347	"type"		kw
348	"use"		kw
349	"where"		kw
350	"while"		loop
351	"write"		kw
352# Here are instrinsics
353	"abs"		intrinsic
354	"achar"		intrinsic
355	"acos"		intrinsic
356	"adjustl"		intrinsic
357	"adjustr"		intrinsic
358	"aimag"		intrinsic
359	"aint"		intrinsic
360	"all"		intrinsic
361	"allocated"		intrinsic
362	"alog"		intrinsic
363	"alog10"	intrinsic
364	"anint"		intrinsic
365	"any"		intrinsic
366	"asin"		intrinsic
367	"associated"		intrinsic
368	"atan"		intrinsic
369	"atan2"		intrinsic
370	"bit_size"		intrinsic
371	"btest"		intrinsic
372	"ceiling"		intrinsic
373	"char"		intrinsic
374	"cmplx"		intrinsic
375	"conjg"		intrinsic
376	"cos"		intrinsic
377	"cosh"		intrinsic
378	"count"		intrinsic
379	"cpu_time"		intrinsic
380	"cshift"		intrinsic
381	"date_and_time"		intrinsic
382	"dble"		intrinsic
383	"digits"		intrinsic
384	"dim"		intrinsic
385	"dot_product"		intrinsic
386	"dprod"		intrinsic
387	"eoshift"		intrinsic
388	"epsilon"		intrinsic
389	"exp"		intrinsic
390	"exponent"		intrinsic
391	"false"		bool
392	"floor"		intrinsic
393	"float"		intrinsic
394	"fraction"		intrinsic
395	"huge"		intrinsic
396	"iachar"		intrinsic
397	"iand"		intrinsic
398	"ibclr"		intrinsic
399	"ibits"		intrinsic
400	"ibset"		intrinsic
401	"ichar"		intrinsic
402	"ieor"		intrinsic
403	"index"		intrinsic
404	"int"		intrinsic
405	"int2"		intrinsic
406	"ior"		intrinsic
407	"ishft"		intrinsic
408	"ishftc"		intrinsic
409	"kind"		intrinsic
410	"lbound"		intrinsic
411	"len"		intrinsic
412	"len_trim"		intrinsic
413	"lge"		intrinsic
414	"lgt"		intrinsic
415	"lle"		intrinsic
416	"llt"		intrinsic
417	"log"		intrinsic
418	"log10"		intrinsic
419	"matmul"		intrinsic
420	"max"		intrinsic
421	"maxexponent"		intrinsic
422	"maxloc"		intrinsic
423	"maxval"		intrinsic
424	"merge"		intrinsic
425	"min"		intrinsic
426	"minexponent"		intrinsic
427	"minloc"		intrinsic
428	"minval"		intrinsic
429	"mod"		intrinsic
430	"modulo"		intrinsic
431	"mvbits"		intrinsic
432	"nearest"		intrinsic
433	"nint"		intrinsic
434	"not"		intrinsic
435	"null"		intrinsic
436	"pack"		intrinsic
437	"present"		intrinsic
438	"product"		intrinsic
439	"radix"		intrinsic
440	"random_number"		intrinsic
441	"random_seed"		intrinsic
442	"range"		intrinsic
443	"real"		intrinsic
444	"repeat"		intrinsic
445	"reshape"		intrinsic
446	"rrspacing"		intrinsic
447	"scale"		intrinsic
448	"scan"		intrinsic
449	"selected_int_kind"		intrinsic
450	"selected_real_kind"		intrinsic
451	"set_exponent"		intrinsic
452	"shape"		intrinsic
453	"sign"		intrinsic
454	"sin"		intrinsic
455	"sinh"		intrinsic
456	"size"		intrinsic
457	"spacing"		intrinsic
458	"spread"		intrinsic
459	"sqrt"		intrinsic
460	"sum"		intrinsic
461	"system_clock"		intrinsic
462	"tan"		intrinsic
463	"tanh"		intrinsic
464	"tiny"		intrinsic
465	"transfer"		intrinsic
466	"transpose"		intrinsic
467	"trim"		intrinsic
468	"true"		intrinsic
469	"ubound"		intrinsic
470	"unpack"		intrinsic
471	"verify"		intrinsic
472done
473	"a-zA-Z0-9_"	ident
474	" \t"	ws_ident	hold
475
476
477# Whitespace after an identifier... we wait to see if there is a "("
478:ws_ident Idle
479	*		idle		noeat istrings
480	"allocate"	kw
481	"allocatable"	kw
482	"assign"	kw
483	"assignment"	kw
484	"backspace"	kw
485	"block"		kw
486	"blockdata"	kw
487	"call"		kw
488	"case"		label
489	"character"	type
490	"close"		kw
491	"common"	kw
492	"complex"	type
493	"contains"	kw
494	"continue"	loop
495	"cycle"		kw
496	"data"		kw
497	"deallocate"	kw
498	"default"	label
499	"dimension"	type
500	"do"		loop
501	"double"	type
502	"doubleprecision"	type
503	"elemental"	kw
504	"else"		cond
505	"elseif"	cond
506	"elsewhere"	cond
507	"end"		kw
508	"endblock"	kw
509	"endblockdata"	kw
510	"enddo"		loop
511	"endfile"	kw
512	"endforall"	loop
513	"endif"		cond
514	"endinterface"	kw
515	"endmodule"	kw
516	"endselect"	cond
517	"endtype"	kw
518	"endwhere"	kw
519	"entry"		kw
520	"equivalence"	kw
521	"exit"		kw
522	"external"	kw
523	"forall"	loop
524	"format"	kw
525	"function"	kw
526	"go"		loop
527	"goto"		loop
528	"if"		cond
529	"implicit"	kw
530	"in"		kw
531	"inout"		kw
532	"inquire"	kw
533	"integer"	type
534	"intent"	kw
535	"interface"	kw
536	"intrinsic"	kw
537	"iolength"	kw
538	"kind"		kw
539	"logical"	type
540	"module"	kw
541	"namelist"	kw
542	"none"		kw
543	"nullify"	kw
544	"only"		kw
545	"open"		kw
546	"optional"	kw
547	"out"		kw
548	"parameter"	kw
549	"pause"		kw
550	"pointer"	kw
551	"precision"	type
552	"print"		kw
553	"private"	kw
554	"procedure"	kw
555	"program"	kw
556	"publc"		kw
557	"public"	kw
558	"pure"		kw
559	"read"		kw
560	"real"		type
561	"recursive"	kw
562	"result"	kw
563	"return"	kw
564	"rewind"	kw
565	"save"		kw
566	"select"	cond
567	"selectcase"	cond
568	"sequence"	kw
569	"stat"		kw
570	"stop"		kw
571	"subroutine"	kw
572	"target"	kw
573	"then"		cond
574	"to"		loop
575	"type"		kw
576	"use"		kw
577	"where"		kw
578	"while"		loop
579	"write"		kw
580done
581	"("		idle	noeat istrings
582# Keywords have to be duplicated here...
583	"allocate"	kw
584	"allocatable"	kw
585	"assign"	kw
586	"assignment"	kw
587	"backspace"	kw
588	"block"		kw
589	"blockdata"	kw
590	"call"		kw
591	"case"		label
592	"character"	type
593	"close"		kw
594	"common"	kw
595	"complex"	type
596	"contains"	kw
597	"continue"	loop
598	"cycle"		kw
599	"data"		kw
600	"deallocate"	kw
601	"default"	label
602	"dimension"	type
603	"do"		loop
604	"double"	type
605	"doubleprecision"	type
606	"elemental"	kw
607	"else"		cond
608	"elseif"	cond
609	"elsewhere"	cond
610	"end"		kw
611	"endblock"	kw
612	"endblockdata"	kw
613	"enddo"		loop
614	"endfile"	kw
615	"endforall"	loop
616	"endif"		cond
617	"endinterface"	kw
618	"endmodule"	kw
619	"endselect"	cond
620	"endtype"	kw
621	"endwhere"	kw
622	"entry"		kw
623	"equivalence"	kw
624	"exit"		kw
625	"external"	kw
626	"forall"	loop
627	"format"	kw
628	"function"	kw
629	"go"		loop
630	"goto"		loop
631	"if"		cond
632	"implicit"	kw
633	"in"		kw
634	"inout"		kw
635	"inquire"	kw
636	"integer"	kw
637	"intent"	kw
638	"interface"	kw
639	"intrinsic"	kw
640	"iolength"	kw
641	"kind"		kw
642	"logical"	type
643	"module"	kw
644	"namelist"	kw
645	"none"		kw
646	"nullify"	kw
647	"only"		kw
648	"open"		kw
649	"optional"	kw
650	"out"		kw
651	"parameter"	kw
652	"pause"		kw
653	"pointer"	kw
654	"precision"	type
655	"print"		kw
656	"private"	kw
657	"procedure"	kw
658	"program"	kw
659	"publc"		kw
660	"public"	kw
661	"pure"		kw
662	"read"		kw
663	"real"		type
664	"recursive"	kw
665	"result"	kw
666	"return"	kw
667	"rewind"	kw
668	"save"		kw
669	"select"	cond
670	"selectcase"	cond
671	"sequence"	kw
672	"stat"		kw
673	"stop"		kw
674	"subroutine"	kw
675	"target"	kw
676	"then"		cond
677	"to"		loop
678	"type"		kw
679	"use"		kw
680	"where"		kw
681	"while"		loop
682	"write"		kw
683# Here are instrinsics
684	"abs"		intrinsic
685	"achar"		intrinsic
686	"acos"		intrinsic
687	"adjustl"		intrinsic
688	"adjustr"		intrinsic
689	"aimag"		intrinsic
690	"aint"		intrinsic
691	"all"		intrinsic
692	"allocated"		intrinsic
693	"alog"		intrinsic
694	"alog10"	intrinsic
695	"anint"		intrinsic
696	"any"		intrinsic
697	"asin"		intrinsic
698	"associated"		intrinsic
699	"atan"		intrinsic
700	"atan2"		intrinsic
701	"bit_size"		intrinsic
702	"btest"		intrinsic
703	"ceiling"		intrinsic
704	"char"		intrinsic
705	"cmplx"		intrinsic
706	"conjg"		intrinsic
707	"cos"		intrinsic
708	"cosh"		intrinsic
709	"count"		intrinsic
710	"cpu_time"		intrinsic
711	"cshift"		intrinsic
712	"date_and_time"		intrinsic
713	"dble"		intrinsic
714	"digits"		intrinsic
715	"dim"		intrinsic
716	"dot_product"		intrinsic
717	"dprod"		intrinsic
718	"eoshift"		intrinsic
719	"epsilon"		intrinsic
720	"exp"		intrinsic
721	"exponent"		intrinsic
722	"false"		intrinsic
723	"floor"		intrinsic
724	"float"		intrinsic
725	"fraction"		intrinsic
726	"huge"		intrinsic
727	"iachar"		intrinsic
728	"iand"		intrinsic
729	"ibclr"		intrinsic
730	"ibits"		intrinsic
731	"ibset"		intrinsic
732	"ichar"		intrinsic
733	"ieor"		intrinsic
734	"index"		intrinsic
735	"int"		intrinsic
736	"int2"		intrinsic
737	"ior"		intrinsic
738	"ishft"		intrinsic
739	"ishftc"		intrinsic
740	"kind"		intrinsic
741	"lbound"		intrinsic
742	"len"		intrinsic
743	"len_trim"		intrinsic
744	"lge"		intrinsic
745	"lgt"		intrinsic
746	"lle"		intrinsic
747	"llt"		intrinsic
748	"log"		intrinsic
749	"log10"		intrinsic
750	"matmul"		intrinsic
751	"max"		intrinsic
752	"maxexponent"		intrinsic
753	"maxloc"		intrinsic
754	"maxval"		intrinsic
755	"merge"		intrinsic
756	"min"		intrinsic
757	"minexponent"		intrinsic
758	"minloc"		intrinsic
759	"minval"		intrinsic
760	"mod"		intrinsic
761	"modulo"		intrinsic
762	"mvbits"		intrinsic
763	"nearest"		intrinsic
764	"nint"		intrinsic
765	"not"		intrinsic
766	"null"		intrinsic
767	"pack"		intrinsic
768	"present"		intrinsic
769	"product"		intrinsic
770	"radix"		intrinsic
771	"random_number"		intrinsic
772	"random_seed"		intrinsic
773	"range"		intrinsic
774	"real"		intrinsic
775	"repeat"		intrinsic
776	"reshape"		intrinsic
777	"rrspacing"		intrinsic
778	"scale"		intrinsic
779	"scan"		intrinsic
780	"selected_int_kind"		intrinsic
781	"selected_real_kind"		intrinsic
782	"set_exponent"		intrinsic
783	"shape"		intrinsic
784	"sign"		intrinsic
785	"sin"		intrinsic
786	"sinh"		intrinsic
787	"size"		intrinsic
788	"spacing"		intrinsic
789	"spread"		intrinsic
790	"sqrt"		intrinsic
791	"sum"		intrinsic
792	"system_clock"		intrinsic
793	"tan"		intrinsic
794	"tanh"		intrinsic
795	"tiny"		intrinsic
796	"transfer"		intrinsic
797	"transpose"		intrinsic
798	"trim"		intrinsic
799	"true"		bool
800	"ubound"		intrinsic
801	"unpack"		intrinsic
802	"verify"		intrinsic
803done
804	" \t"	ws_ident
805
806:intrinsic Builtin
807	*	idle	noeat
808
809:kw Keyword
810	*	idle	noeat
811
812:type Type
813	*	idle	noeat
814
815:label Label
816	*	idle	noeat
817
818:cond Conditional
819	*	idle	noeat
820
821:loop Loop
822	*	idle	noeat
823