# JOE syntax highlight file for ADA

# Define colors

=Idle
=Comment
=Constant
=Character +Constant
=Number +Constant
=String +Constant
=StringEscape +Escape +String
=Keyword
=Operator +Keyword

:idle Idle
	*		idle
	"-"		maybe_comment
	"'"		char		recolor=-1
	"\""		string		recolor=-1
	"0-9"		first_digit	recolor=-1
	"."		maybe_float
	"\""		string		recolor=-1
	"Bb"		maybe_binary	buffer
	"Oo"		maybe_octal	buffer
	"Xx"		maybe_hex	buffer
	"ac-np-wyzAC-NP-WYZ"	ident	buffer

:maybe_comment Idle
	*		idle		noeat
	"-"		comment		recolor=-2

:comment Comment comment
	*		comment
	"BFHNTX"        comment         noeat call=comment_todo.comment_todo()
	"\n"		idle


# Character constant

:char Idle
	*		char1

:char1 Idle
	*		idle
	"'"		char2		recolor=-3

:char2 Character
	*		idle		noeat

# Strings

:maybe_binary Idle
	*		ident		noeat
	"\""		string		recolor=-2

:maybe_octal Idle
	*		ident		noeat
	"\""		string		recolor=-2

:maybe_hex Idle
	*		ident		noeat
	"\""		string		recolor=-2

:string	String string
	*		string
	"\n"		idle
	"\""		idle
	"\\"		string_escape	recolor=-1

:string_escape StringEscape string
	*		string
	"\n"		string		recolor=-2

# Integer constants

:first_digit Number
	*		idle		noeat
	"."		float
	"_"		first_digit
	"0-9"		first_digit

# Floating point

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

:float Number
	*		idle	noeat
	"eE"		epart
	"0-9"		float

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

:enum	Number
	*		idle	noeat
	"0-9"		enum

# Identifiers

:ident	Idle
	*		quote		noeat istrings
	"abort"		kw
	"abs"		operator
	"abstract"	kw
	"accept"	kw
	"aliased"	kw
	"all"		kw
	"and"		operator
	"array"		kw
	"at"		kw
	"begin"		kw
	"body"		kw
	"case"		kw
	"constant"	kw
	"declare"	kw
	"delay"		kw
	"delta"		kw
	"digits"	kw
	"do"		kw
	"else"		kw
	"elsif"		kw
	"end"		kw
	"entry"		kw
	"exception"	kw
	"exit"		kw
	"for"		kw
	"function"	kw
	"generic"	kw
	"goto"		kw
	"if"		kw
	"in"		kw
	"interface"	kw
	"is"		kw
	"limited"	kw
	"loop"		kw
	"mod"		kw
	"new"		kw
	"not"		operator
	"null"		kw
	"of"		kw
	"or"		operator
	"others"	kw
	"out"		kw
	"overriding"	kw
	"package"	kw
	"pragma"	kw
	"private"	kw
	"procedure"	kw
	"protected"	kw
	"raise"		kw
	"range"		kw
	"record"	kw
	"rem"		operator
	"renames"	kw
	"requeue"	kw
	"return"	kw
	"reverse"	kw
	"select"	kw
	"separate"	kw
	"subtype"	kw
	"synchronized"	kw
	"tagged"	kw
	"task"		kw
	"terminate"	kw
	"then"		kw
	"type"		kw
	"until"		kw
	"use"		kw
	"when"		kw
	"while"		kw
	"with"		kw
	"xor"		operator
done
	"a-zA-Z0-9_"	ident

:operator Operator
	*	idle	noeat

:kw Keyword
	*	idle	noeat

# identifiers separated with quote '

:quote	Idle
	*	idle	noeat
	"'"	quote_word

:quote_word	Idle
	*	idle	noeat
	"a-zA-Z"	ident	buffer
