#
#  Bounded stack language for Java
#
BSL type finite-state trans-line

typefaces
r----	Java-Plain
i--B-	Java-Comment
rb-R-	Java-Package
rb---	Java-Keyword
rb---	Java-Datatype
r----	Java-Lang
r----	Java-Identifier
r----	Java-Operator
r----	Java-Sequencer
t--Gi	Java-String
r--G-	Java-Number
t--Ri	Java-Escape

state set
T	Java-Plain
C	Java-Comment
S	Java-String
H	Java-String

demo string public class hi char " hi\n" + 1 /* hm... */

word range a-zA-Z0-9_

rules
#
#  Java keywords originating from C
#
T	\{Java-Keyword}\<break\>:\<case\>:\<continue\>:\<default\>:\<do\>:\<else\>:\<for\>:\<if\>:\<return\>:\<static\>:\<switch\>:\<void\>:\<while\>	nop
#
#  Java keywords originating from C++
#
T	\{Java-Keyword}\<catch\>:\<class\>:\<new\>:\<private\>:\<protected\>:\<public\>:\<this\>:\<throw\>:\<try\>	nop
#
#  Java datatypes
#
T	\{Java-Datatype}\<boolean\>:\<char\>:\<byte\>:\<short\>:\<int\>:\<long\>:\<float\>:\<double\>	nop
#
#  Some Java lang package classes
#
T	\{Java-Lang}\<Boolean\>:\<Character\>:\<Class\>:\<Math\>:\<Number\>:\<Byte\>:\<Double\>:\<Float\>:\<Integer\>:\<Long\>:\<Short\>:\<Process\>	nop
T	\{Java-Lang}\<Runtime\>:\<String\>:\<StringBuffer\>:\<System\>:\<Thread\>:\<ThreadGroup\>:\<Throwable\>:\<Void\>	nop
T	\{Java-Lang}\<Object\>:\<Throwable\>:\<Exception\>:\<Error\>	nop
#
#  Additional Java keywords
#
T	\{Java-Keyword}\<abstract\>:\<extends\>:\<final\>:\<implements\>:\<instanceof\>:\<interface\>:\<length\>:\<native\>:\<null\>:\<super\>:\<synchronized\>:\<transient\>:\<throws\>:\<volatile\>	nop
T	\{Java-Number}\<true\>:\<false\>	nop
#
#  Other plain Java elements
#
#
T	\{Java-Package}package[ \t]+*;	nop
T	\{Java-Package}import[ \t]+*;	nop
T	\{Java-Plain}[ \t]+	nop
T	\{Java-Identifier}\<[a-zA-Z_][a-zA-Z0-9_]*\>	nop
#
T	\{Java-Number}0[xX][0-9a-fA-F]+:-0[xX][0-9a-fA-F]+:[\-0-9]*.[0-9]+[eE][0-9]+:[\-0-9]+.[0-9]*[eE][0-9]+:[\-0-9]+.[0-9]*:[\-0-9]*.[0-9]+:[0-9]+:-[0-9]+	nop
T	/\*	goto C
T	//\{Java-Comment}*$	nop
T	"	goto S
T	'	goto H
T	\{Java-Operator}<<=:>>=:>>>:\+\+:--:<<:>>:<=:>=:==:\!=:>=:\&\&:||:\?:->:\*=:/=:%=:\+=:-=:\&=:|=:\^=:,:=:\:|:\^:>:<:(:):\[:\]:.:-:\+:~:\!:\*:\&:/:%	nop
T	\{Java-Sequencer};:{:}	nop
#
#  Comments.   The  C++ style comment prefix  within  a Java
#  comment, as well as **, are rendered as not belonging to the comment.
#
C	\{Java-Plain}\*/	goto T
C	\{Java-Plain}//:\*\*	nop
C	[^/*]+	nop
#
#  Characters (H) and strings (S)
#
S	\{Java-Plain}"	goto T
H	\{Java-Plain}'	goto T
SH	\{Java-Escape}\\[0-9][0-9][0-9]:\\x[0-9A-Fa-f][0-9A-Fa-f]:\\a:\\b:\\e:\\f:\\n:\\r:\\t:\\v:\\0	nop
SH	\{Java-Escape}\\\{Java-String}?	nop
SH	$	goto T
SH	[^"'\\]+	nop

