# PASCAL highlighter for JOE
# With support for Delphi and FPC by Michael Van Canneyt

=Idle
=Comment
=Constant
=String		+Constant
=Number		+Constant
=Type
=Keyword
=Statement	+Keyword
=Operator	+Keyword
=Loop		+Statement
=Conditional	+Statement
=DefinedFunction +DefinedIdent
=Builtin	+DefinedFunction
=Structure	+Type
=Bad

:idle Idle
	*		idle
	"\i"		ident		buffer
	"("		maybe_comment
	"/"		maybe_linecomment
	"{"		comment		recolor=-1
	"'"		string		recolor=-1
	"$"		maybe_hex_number
	"%"		maybe_bin_number
	"&"		maybe_oct_number
	"0-9"		number		recolor=-1 

# Comments

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

:maybe_linecomment Idle
	*		idle		noeat
	"/"		line_comment    recolor=-2

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

:comment Comment comment
	*		comment
	"BFHNTX"	comment		noeat call=comment_todo.comment_todo()
	"*"		maybe_end_comment
	"}"		idle

:maybe_end_comment Comment comment
	*		comment		noeat
	")"		idle

# String constant

:string String string
	*		string
	"\n"		idle
	"'"		maybe_end_string

:maybe_end_string String string
	*		idle		recolor=-1 noeat
	"'"		string

# Numeric constant

:maybe_hex_number Idle
	*		idle		noeat
	"0-9A-Fa-f"	hex_number	recolor=-2

:maybe_bin_number Idle
	*		idle		noeat
	"01"		bin_number	recolor=-2

:maybe_oct_number Idle
	*		idle		noeat
	"0-7"		oct_number	recolor=-2

:bad Bad
	*		idle		noeat

:hex_number	Number
	*		idle		noeat
	"0-9"		hex_number
	"a-fA-F"	hex_number

:bin_number	Number
	*		idle		noeat
	"01"		bin_number
	"2-9"		bad		recolor=-1

:oct_number	Number
	*		idle		noeat
	"0-7"		oct_number
	"89"		bad		recolor=-1

:number Number
	*		idle		noeat
	"0-9"		number
	"eE"		epart
	"."		dot

:dot Number
	*		idle	noeat
	"0-9"		float

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

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

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


# Keywords

:ident Idle
	*		idle		noeat istrings
	"and"		operator
	"array"		type
	"begin"		kw
	"case"		cond
	"const"		kw
	"div"		operator
	"do"		kw
	"downto"	kw
	"else"		cond
	"end"		kw
	"file"		kw
	"for"		loop
	"function"	kw
	"goto"		loop
	"if"		cond
	"in"		kw
	"label"		kw
	"mod"		operator
	"nil"		word_constant
	"not"		operator
	"of"		kw
	"or"		operator
	"packed"	kw
	"procedure"	kw
	"program"	kw
	"record"	kw
	"repeat"	loop
	"set"		kw
	"then"		kw
	"type"		kw
	"until"		loop
	"var"		kw
	"while"		loop
	"with"		kw
# Delphi keywords
	"to"		kw
	"try"		kw
	"finally"	kw
	"raise"		kw
	"absolute"      kw
	"cdecl"		kw
	"stdcall"	kw
	"register"	kw
	"interface"	struct
	"library"	kw
	"constructor"	kw
	"destructor"	kw
	"dispinterface" kw
	"inherited"	kw
	"public"	kw
	"private"	kw
	"published"	kw
	"protected"	kw
	"initialization"	kw
	"finalization"	kw
	"class"		struct
	"object"	kw
	"resourcestring"	kw
	"property"	kw
	"threadvar"	kw
	"integer"	type
	"boolean"	type
	"real"		type
	"char"		type
	"string"	type
	"text"		type
	"abs"		function
	"atan"		function
	"arctan"	function
	"concat"	function
	"cos"		function
	"eof"		function
	"eoln"		function
	"exp"		function
	"insert"	function
	"length"	function
	"ln"		function
	"log"		function
	"odd"		function
	"ord"		function
	"page"		function
	"pred"		function
	"round"		function
	"sin"		function
	"sqr"		function
	"sqrt"		function
	"succ"		function
	"trun"		function
done
	"\c"		ident

:kw Keyword
	*	idle	noeat

:type Type
	*	idle	noeat

:loop Loop
	*	idle	noeat

:cond Conditional
	*	idle	noeat

:struct Structure
	*	idle	noeat

:operator Operator
	*	idle	noeat

:word_constant Constant
	*	idle	noeat

:function Builtin
	*	idle	noeat
