# m4

=Idle
=Ident
=Comment
=Constant
=Variable	+Escape
=Brace
=Keyword

:start Idle
	*		start noeat call=.m4()

.subr m4

.ifdef quote
:idle Constant
.else
:idle Idle
.endif
	*		idle
	"["		idle recolor=-1 call=.m4(quote -brace)
#	"["		idle recolor=-1 call=.quote()
	"a-zA-Z_"	ident buffer mark
.ifdef quote
	"]"		idle return
.endif
.ifdef brace
	")"		endbrace recolor=-1
.endif

:quote Constant string
	*		quote
	"]"		idle

:endbrace Brace
	*		idle noeat return

.ifdef quote
:ident Constant string
.else
:ident Ident
.endif
	*		maybe_macro noeat strings
	"builtin"	maybe_kw
	"changecom"	maybe_kw
	"changequote"	maybe_kw
	"changeword"	maybe_kw
	"debugfile"	maybe_kw
	"debugmode"	maybe_kw
	"decr"		maybe_kw
	"define"	maybe_kw
	"defn"		maybe_kw
	"divert"	maybe_kw
	"divnum"	maybe_kw
	"dnl"		comment
	"dumpdef"	maybe_kw
	"errprint"	maybe_kw
	"esyscmd"	maybe_kw
	"eval"		maybe_kw
	"file"		maybe_kw
	"format"	maybe_kw
	"ifdef"		maybe_kw
	"ifelse"	maybe_kw
	"include"	maybe_kw
	"incr"		maybe_kw
	"index"		maybe_kw
	"indir"		maybe_kw
	"len"		maybe_kw
	"line"		maybe_kw
	"m4exit"	maybe_kw
	"m4wrap"	maybe_kw
	"maketemp"	maybe_kw
	"patsubst"	maybe_kw
	"popdef"	maybe_kw
	"pushdef"	maybe_kw
	"regexp"	maybe_kw
	"shift"		maybe_kw
	"sinclude"	maybe_kw
	"substr"	maybe_kw
	"syscmd"	maybe_kw
	"sysval"	maybe_kw
	"traceoff"	maybe_kw
	"traceon"	maybe_kw
	"translit"	maybe_kw
	"undefine"	maybe_kw
	"undivert"	maybe_kw
done
	"a-zA-Z0-9_"	ident

:maybe_macro Idle
	*		idle noeat
	"("		macro recolormark noeat

:maybe_kw Idle
	*		idle noeat
	"("		kw recolormark noeat

:kw Keyword
	*		idle noeat
	"("		macro noeat

:comment Comment comment
	*		comment
	"\n"		idle

:macro Variable
	*		idle noeat
	"("		brace recolor=-1

:brace Brace
	*		idle noeat call=.m4(brace -quote)

.end

.subr quote
:idle Constant string
	*	idle
	"]"	idle return
	"["	idle call=.quote()

.end
