# $MirOS: contrib/code/jupp/syntax/perl.jsf.in,v 1.4 2017/12/02 05:38:06 tg Exp $
#-
# JOE syntax highlight file for Perl

# Still need:

# _ in numbers
# 0b for binary
# \cC for Ctrl-C
# \x{hex} unicode
# no escapes in single quotes (except \\ and \')
# \N{NAME} named character

# / .. / regex
# s/ .. / .. /
# $name allowed in regex
# m//  same as //
# s///
# tr/// y///
# qr//

# can also do this: s(egg)<larva>
# s' ' ' - no interpolation


# Always reparse from beginning
-


# Define colors

=Idle
=Preproc yellow
=Comment green
=Constant cyan
=Escape bold cyan
=Type bold
=Keyword bold
=Bad bold red

:idle Idle
	*		idle
	"#"		line_comment	recolor=-1
	"\n"		idle
	"0"		first_digit	recolor=-1
	"1-9"		decimal	recolor=-1
	"."		maybe_float
	"\""		string		recolor=-1
	"\\"		not_string
	"'"		char		recolor=-1
	"`"		backtick	recolor=-1
	"a-zA-Z_"	ident		buffer

:not_string Idle
	*		idle noeat
	"\"'`"		idle

:line_comment Comment
	*		line_comment
	"\n"		idle

:first_digit Constant
	*		idle	noeat
	"x"		hex
	"b"		binary
	"."		float
	"eE"		epart
	"0-7"		octal
	"89"		bad_number	recolor=-1

:bad_number Bad
	*		idle	noeat
	"0-9"		bad_number

:octal Constant
	*		idle	noeat
	"0-7_"		octal
	"89"		bad_number	recolor=-1

:binary Constant
	*		idle	noeat
	"01_"		binary
	"2-9"		bad_number	recolor=-1

:hex Constant
	*		idle	noeat
	"0-9A-Fa-f_"	hex

:decimal Constant
	*		idle	noeat
	"0-9_"		decimal
	"eE"		epart
	"."		float

:maybe_float Constant
	*		idle	recolor=-2	noeat
	"0-9"		float		recolor=-2

:float Constant
	*		idle	noeat
	"eE"		epart
	"0-9_"		float

:epart Constant
	*		idle	noeat
	"0-9+\-"	enum

:enum Constant
	*		idle	noeat
	"0-9_"		enum

:string	Constant
	*		string
	"\""		idle
	"\\"		string_escape	recolor=-1
	"$@"		string_subst	recolor=-1

:string_subst Escape
	*		string	noeat recolor=-1
	"a-zA-Z_0-9"	string_subst

:string_escape Escape
	*		string
	"x"		string_hex1
	"c"		string_ctrl
	"N"		string_named
	"0-7"		string_octal2
	"\n"		string		recolor=-2

:string_named Escape
	*		string
	"{"		string_named_rest

:string_named_rest Escape
	*		string_named_rest
	"}"		string

:string_ctrl Escape
	*		string

:string_hex1 Escape
	*		string		noeat
	"{"		string_unicode
	"0-9a-fA-F"	string_hex2

:string_unicode Escape
	*		string_unicode
	"}"		string

:string_hex2 Escape
	*		string		noeat
	"0-9a-fA-F"	string

:string_octal2 Escape
	*		string		noeat
	"0-7"		string_octal3

:string_octal3 Escape
	*		string		noeat
	"0-7"		string

:char Constant
	*		char
	"\n"		reset
	"'"		idle
	"\\"		char_escape	recolor=-1

:char_escape	Escape
	*		char		recolor=-2
	"\\'"	char

:backtick	Constant
	*		backtick
	"`"		idle
	"\\"		backtick_escape	recolor=-1
	"$@"		backtick_subst recolor=-1

:backtick_subst Escape
	*		backtick	noeat recolor=-1
	"a-zA-Z_0-9"	backtick_subst

:backtick_escape Escape
	*		backtick
	"x"		backtick_hex1
	"c"		backtick_ctrl
	"N"		backtick_named
	"0-7"		backtick_octal2
	"\n"		backtick		recolor=-2

:backtick_named Escape
	*		backtick
	"{"		backtick_named_rest

:backtick_named_rest Escape
	*		backtick_named_rest
	"}"		backtick

:backtick_ctrl Escape
	*		backtick

:backtick_hex1 Escape
	*		backtick		noeat
	"{"		backtick_unicode
	"0-9a-fA-F"	backtick_hex2

:backtick_unicode Escape
	*		backtick_unicode
	"}"		backtick

:backtick_hex2 Escape
	*		backtick		noeat
	"0-9a-fA-F"	backtick

:backtick_octal2 Escape
	*		backtick		noeat
	"0-7"		backtick_octal3

:backtick_octal3 Escape
	*		backtick		noeat
	"0-7"		backtick

:ident	Idle
	*		idle		noeat strings
	"if"		kw
	"unless"	kw
	"while"		kw
	"until"		kw
	"foreach"	kw
	"sub"		kw
	"my"		kw
	"do"		kw
	"if"		kw
	"else"		kw
	"elsif"		kw
	"for"		kw
	"continue"	kw
	"last"		kw
	"print"		kw
	"reset"		kw
	"die"		kw
	"goto"		kw
	"require"	kw
	"use"		kw
	"eval"		kw
	"redo"		kw
	"next"		kw
	"warn"		kw
done
	"a-zA-Z0-9_"	ident

:type Type
	*	idle	noeat

:kw Keyword
	*	idle	noeat
