# JOE syntax highlight file for Progress 4GL
# by Gediminas http://proc.w3.lt
# Version 1.04

=Idle
=Comment
=Constant
=String		+Constant
=Number		+Constant
=Type
=Ident

# conditional operators, blocks
=Keyword
=Conditional	+Keyword
=Operator	+Keyword

# preprocessor include, definition, reference
=Preproc
=Include	+Preproc
=PreRef		+Ident

:idle Idle
	*		idle
	"/"		slash
	"{"		brace
	"&"		prep		buffer
	"a-zA-Z"	ident		buffer
	"'"		string		recolor=-1
	"\""		string2		recolor=-1
	"0-9"		number		recolor=-1 
	"?"		question	recolor=-1

# Comments - 2 levels of nesting allowed

:slash Idle
	*		idle		noeat
	"*"		comment		recolor=-2
:comment Comment comment
	*		comment
	"/"		slash2
	"*"		maybe_end_comment
	"BFHNTX"        comment         noeat call=comment_todo.comment_todo()
:maybe_end_comment Comment comment
	*		comment
	"/"		idle
	"*"		maybe_end_comment

:slash2 Idle
	*		comment		noeat
	"*"		comment2	recolor=-2
:comment2 Comment comment
	*		comment2
	"*"		maybe_end_comment2
	"BFHNTX"        comment2         noeat call=comment_todo.comment_todo()
:maybe_end_comment2 Comment comment
	*		comment2
	"/"		comment
	"*"		maybe_end_comment2

# Preprocessor
#     Allow preprocessor name reference inside include file reference:
#     {include/trace {&FILE-NAME} {&LINE-NUMBER}}

:brace Include
	*		include		noeat
	"&"		scoped		recolor=-2
	"}"		idle

:include Include
	*		include		recolor=-2
	"{"		brace2
	"}"		idle

:brace2 Include
	*		include2	noeat
	"}"		idle

:include2 Include
	*		include2	recolor=-2
	"}"		include

:scoped PreRef
	*		scoped
	"}"		idle

:prep Preproc
	*			idle		noeat istrings
	"&IF"			predir
	"&THEN"			predir
	"&ELSEIF"		predir
	"&ELSE"			predir
	"&ENDIF"		predir
	"&SCOPED-DEFINE"	predir
	"&SCOP"			predir
	"&GLOBAL-DEFINE"	predir
	"&GLOB"			predir
	"&MESSAGE"		predir
	"&UNDEFINE"		predir
	"&UNDEF"		predir
done
	"-a-zA-Z0-9_"		prep

:predir Preproc
	*		idle		noeat


# String constants, copied from pascal.jsf with " added

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

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

:string2 String string
	*		string2
	"\n"		idle
	"\""		maybe_end_string2

:maybe_end_string2 String string
	*		idle		recolor=-1 noeat
	"\""		string2

# Numeric constant, same as pascal.jsf

: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

:question Constant
	*		idle noeat

# Keywords
# Available jumps: cond type oper kw

# TODO: This needs to be vastly expanded, it seems like every other
# token in this language is a keyword.

:ident Ident
	*		idle		noeat istrings
	"assign"	cond
	"case"		cond
	"cha"		type
	"char"		type
	"character"	type
	"create"	reserved
	"dat"		type
	"date"		type
	"dec"		type
	"decimal"	type
	"defined"	oper
	"delete"	reserved
	"do"		reserved
	"else"		cond
	"end"		cond
	"find"		reserved
	"for"		reserved
	"function"	cond
	"get"		reserved
	"handle"	type
	"if"		cond
	"int"		type
	"integer"	type
	"leave"		cond
	"log"		type
	"logical"	type
	"memptr"	type
	"next"		cond
	"otherwise"	cond
	"param"		cond
	"parameter"	cond
	"procedure"	cond
	"raw"		type
	"rec"		type
	"repeat"	cond
	"reposition"	reserved
	"return"	cond
	"rowid"		type
	"run"		cond
	"then"		cond
	"when"		cond
	"widget-handle"	type
done
	"-a-zA-Z0-9_"	ident

:cond Conditional
	*	idle	noeat

:type Type
	*	idle	noeat

:oper Operator
	*	idle	noeat

:reserved Keyword
	*	idle	noeat
