1# JOE syntax highlight file for Perl
2
3# Define colors
4
5=Idle
6=Ident
7=Comment
8=Pod		+Preproc
9=Variable	+DefinedIdent # TODO: Make this work.
10=Constant
11=Number		+Constant
12=String		+Constant
13=StringEscape	+Escape
14=StringVariable	+StringEscape
15=Regex		+String
16=RegexEscape	+StringEscape
17=Type
18=Keyword
19=Statement	+Keyword
20=Loop		+Statement
21=Conditional	+Statement
22=Structure	+Statement
23=Bad
24
25:begin Idle
26	*		begin noeat call=.perl()
27
28#
29# Perl as a subroutine for Mason
30#
31
32.subr perl
33
34# Detect pod
35
36:idle Idle
37	*		idle1		noeat
38.ifdef mason_line
39	"\n"		idle return
40.else
41	"\n"		idle
42.endif
43	"="		pod_start
44
45# allow keywords
46
47:idle1 Idle
48	*		idle1
49	"#"		line_comment_i	recolor=-1
50	"\n"		idle noeat
51	"0"		first_digit	recolor=-1
52	"1-9"		decimal	recolor=-1
53	"."		maybe_float
54	"\""		string		recolor=-1
55	"'"		char		recolor=-1
56	"`"		backtick	recolor=-1
57	"<"		maybe_inc
58	"$"		not_string	buffer recolor=-1
59.ifdef mason_block
60	"&%"		perl_maybe_done	buffer
61	"-@\i"		ident		buffer recolor=-1
62.else
63	"/"		regex		recolor=-1
64	"-\i@%&"	ident		buffer recolor=-1
65.endif
66
67:perl_maybe_done Idle
68	*		ident noeat
69	">"		idle1	recolor=-2 return
70
71# prevent keywords
72
73:rest Idle
74	*		rest
75	"({;~"		idle1
76	"#"		line_comment	recolor=-1
77	"\n"		idle noeat
78	"0"		first_digit	recolor=-1
79	"1-9"		decimal	recolor=-1
80	"."		maybe_float
81	"\""		string		recolor=-1
82	"'"		char		recolor=-1
83	"`"		backtick	recolor=-1
84	"$"		not_string	buffer recolor=-1
85	"<"		maybe_inc
86.ifdef mason_block
87	"&%"		perl_maybe_done buffer recolor=-1
88	"\i@"		maybe_string	buffer
89.else
90	"\i@%&"		maybe_string	buffer
91.endif
92
93:pod_start Idle
94	*		pod_start
95	"\n"		pod_block
96
97:pod_block Pod
98	*		pod_block
99	"="		pod_ident	buffer
100
101:pod_ident Pod
102	*		pod_block	noeat strings
103	"=cut"		rest
104done
105	"\c"		pod_ident
106
107:maybe_inc Idle
108	*		rest		noeat
109.ifdef mason_block
110	"/"		perl_maybe_done_2
111.endif
112	"<"		maybe_inc1
113
114:perl_maybe_done_2 Idle
115	*		perl_idle	noeat
116	"a-z"		perl_maybe_done_2
117	">"		idle
118
119
120:maybe_inc1 Idle
121	*		rest		noeat
122	" 	"	maybe_inc1
123	"'\""		quoted_inc_start	save_c recolor=-1
124	"\i"		inc		buffer noeat
125
126:quoted_inc_start Variable
127	*		quoted_inc	buffer
128
129:quoted_inc Variable
130	*		quoted_inc
131	&		skipline	save_s
132
133:inc Variable
134	*		skipline	save_s noeat
135	"\c"		inc
136
137# Should be treated as a normal line here...
138
139:skipline Idle
140	*		skipline
141	"\n"		next_line
142
143:todelim String string
144	*		todelim
145	"\n"		next_line	strings
146	"&"		founddelim
147done
148
149# eat \n so it's not in string.
150:next_line String string
151	*		todelim		buffer
152	"\n"		next_line
153
154:founddelim Variable
155	*		idle		noeat
156
157:regex Regex
158	*		regex
159	"\\"		regex_quote	recolor=-1
160	"/"		rest
161
162:regex_quote RegexEscape
163	*		regex
164
165:not_string Idle
166	*		rest noeat
167	"\i"		ident
168	"\"'`#"		rest
169
170:line_comment Comment comment
171	*		line_comment
172	"BFHNTX"	line_comment	noeat call=comment_todo.comment_todo()
173	"\n"		rest
174
175:line_comment_i Comment comment
176	*		line_comment_i
177	"BFHNTX"	line_comment_i	noeat call=comment_todo.comment_todo()
178	"\n"		idle noeat
179
180:end_of_file_comment Comment comment
181	"BFHNTX"	end_of_file_comment	noeat call=comment_todo.comment_todo()
182	*		end_of_file_comment
183
184:first_digit Number
185	*		rest	noeat
186	"x"		hex
187	"b"		binary
188	"."		float
189	"eE"		epart
190	"0-7"		octal
191	"89"		bad_number	recolor=-1
192
193:bad_number Bad
194	*		rest	noeat
195	"0-9"		bad_number
196
197:octal Number
198	*		rest	noeat
199	"0-7_"		octal
200	"89"		bad_number	recolor=-1
201
202:binary Number
203	*		rest	noeat
204	"01_"		binary
205	"2-9"		bad_number	recolor=-1
206
207:hex Number
208	*		rest	noeat
209	"0-9A-Fa-f_"	hex
210
211:decimal Number
212	*		rest	noeat
213	"0-9_"		decimal
214	"eE"		epart
215	"."		float
216
217:maybe_float Number
218	*		rest	recolor=-2	noeat
219	"0-9"		float		recolor=-2
220
221:float Number
222	*		rest	noeat
223	"eE"		epart
224	"0-9_"		float
225
226:epart Number
227	*		rest	noeat
228	"0-9+\-"	enum
229
230:enum Number
231	*		rest	noeat
232	"0-9_"		enum
233
234:string	String string
235	*		string
236	"\""		rest
237	"\\"		string_escape	recolor=-1
238	"$@"		string_subst	recolor=-1
239
240:string_subst StringVariable string
241	*		string	noeat recolor=-1
242	"\c"		string_subst
243
244:string_escape StringEscape string
245	*		string
246	"x"		string_hex1
247	"c"		string_ctrl
248	"N"		string_named
249	"0-7"		string_octal2
250	"\n"		string		recolor=-2
251
252:string_named StringEscape string
253	*		string
254	"{"		string_named_rest
255
256:string_named_rest StringEscape string
257	*		string_named_rest
258	"}"		string
259
260:string_ctrl StringEscape string
261	*		string
262
263:string_hex1 StringEscape string
264	*		string		noeat
265	"{"		string_unicode
266	"0-9a-fA-F"	string_hex2
267
268:string_unicode StringEscape string
269	*		string_unicode
270	"}"		string
271
272:string_hex2 StringEscape string
273	*		string		noeat
274	"0-9a-fA-F"	string
275
276:string_octal2 StringEscape string
277	*		string		noeat
278	"0-7"		string_octal3
279
280:string_octal3 StringEscape string
281	*		string		noeat
282	"0-7"		string
283
284:char String string
285	*		char
286	"\n"		idle noeat
287	"'"		rest
288	"\\"		char_escape	recolor=-1
289
290:char_escape	StringEscape string
291	*		char		recolor=-2
292	"\\'"		char
293
294:backtick	String string
295	*		backtick
296	"`"		rest
297	"\\"		backtick_escape	recolor=-1
298	"$@"		backtick_subst recolor=-1
299
300:backtick_subst StringVariable string
301	*		backtick	noeat recolor=-1
302	"\c"		backtick_subst
303
304:backtick_escape StringEscape string
305	*		backtick
306	"x"		backtick_hex1
307	"c"		backtick_ctrl
308	"N"		backtick_named
309	"0-7"		backtick_octal2
310	"\n"		backtick		recolor=-2
311
312:backtick_named StringEscape string
313	*		backtick
314	"{"		backtick_named_rest
315
316:backtick_named_rest StringEscape string
317	*		backtick_named_rest
318	"}"		backtick
319
320:backtick_ctrl StringEscape string
321	*		backtick
322
323:backtick_hex1 StringEscape string
324	*		backtick		noeat
325	"{"		backtick_unicode
326	"0-9a-fA-F"	backtick_hex2
327
328:backtick_unicode StringEscape string
329	*		backtick_unicode
330	"}"		backtick
331
332:backtick_hex2 StringEscape string
333	*		backtick		noeat
334	"0-9a-fA-F"	backtick
335
336:backtick_octal2 StringEscape string
337	*		backtick		noeat
338	"0-7"		backtick_octal3
339
340:backtick_octal3 StringEscape string
341	*		backtick		noeat
342	"0-7"		backtick
343
344# TODO: Tease out the variable logic from this so that we can highlight
345# variables separate from other identifiers.
346
347:ident Ident
348	*		rest		noeat strings
349	"BEGIN"		kw
350	"END"		kw
351	"if"		cond
352	"unless"	cond
353	"while"		loop
354	"until"		loop
355	"foreach"	loop
356	"sub"		struct
357	"my"		kw
358	"do"		loop
359	"if"		cond
360	"else"		cond
361	"elsif"		cond
362	"for"		loop
363	"continue"	loop
364	"last"		loop
365	"print"		stmt
366	"reset"		kw
367	"die"		stmt
368	"goto"		stmt
369	"require"	stmt
370	"use"		kw
371	"eval"		kw
372	"redo"		kw
373	"next"		loop
374	"warn"		stmt
375	"return"	stmt
376	"printf"	stmt
377	"close"		stmt
378	"package"	kw
379	"m"		match
380	"qr"		match
381	"qq"		match
382	"qx"		match
383	"qw"		match
384	"q"		match
385	"s"		subst
386	"tr"		subst
387	"y"		subst
388	"__END__"	end_of_file_comment
389	"__DATA__"	end_of_file_comment
390done
391	"\c"		ident
392
393:maybe_string Idle
394	*		rest		noeat strings
395	"qr"		match
396	"qq"		match
397	"qx"		match
398	"qw"		match
399	"q"		match
400done
401	"\c"		maybe_string
402
403:type Type
404	*		rest	noeat
405
406:kw Keyword
407	*		rest	noeat
408
409:cond Conditional
410	*		rest	noeat
411
412:loop Loop
413	*		rest	noeat
414
415:struct Structure
416	*		rest	noeat
417
418:stmt Statement
419	*		rest	noeat
420
421:match Idle
422	*		inmatch		save_c recolor=-1
423	" 	"	match
424
425:inmatch Regex
426	*		inmatch
427	%		inmatch		call=.inmatch()
428	&		rest
429	"\\"		inmatch_quote	recolor=-1
430
431:inmatch_quote RegexEscape
432	*		inmatch
433
434:subst Idle
435	*		insubst		save_c recolor=-1
436	"<([{`"		delim_insubst	save_c recolor=-1
437	" 	"	subst
438
439:insubst Regex
440	*		insubst
441	&		inrepl
442	"\\"		insubst_quote	recolor=-1
443
444:insubst_quote RegexEscape
445	*		insubst
446
447:inrepl Regex
448	*		inrepl
449	&		rest
450	"\\"		inrepl_quote
451
452:inrepl_quote RegexEscape
453	*		inrepl
454
455:delim_insubst Regex
456	*		delim_insubst
457	&		delim_repl
458	"\\"		delim_quote
459
460:delim_quote RegexEscape
461	*		delim_insubst
462
463:delim_repl Regex
464	*		repl		save_c recolor=-1
465	" 	"	delim_repl
466
467:repl Regex
468	*		repl
469	&		rest
470	"\\"		repl_quote
471
472:repl_quote RegexEscape
473	*		repl
474
475.end
476
477.subr inmatch
478
479:inmatch Regex
480	*		inmatch
481	%		inmatch		call=.inmatch()
482	&		inmatch		return
483	"\\"		inmatch_quote	recolor=-1
484
485:inmatch_quote RegexEscape
486	*		inmatch
487.end
488