
DOCUMENT START
NON-TERMINALS
	Program	:=	( Statement )*
	Statement	:=	( ClassStmt | LinkStmt | <TERM> )
	StereoTypeName	:=	<IDENTIFIER>
	StereoType	:=	<LEFT_STEREO_TYPE> StereoTypeName <RIGHT_STEREO_TYPE>
	ConstraintValue	:=	<IDENTIFIER>
	Constraint	:=	<LBRACE> ConstraintValue <RBRACE>
	Visibility	:=	<VISIBILITY>
	ClassStmt	:=	<EQUAL_LINE> <TERM> ClassNameDef <TERM> <HYPHEN_LINE_SEPARATOR> ( PropertyDef <TERM> )* <HYPHEN_LINE_SEPARATOR> ( MethodDef <TERM> )* <EQUAL_LINE>
	ClassName	:=	<IDENTIFIER>
	ClassNameDef	:=	( StereoType ( <TERM> )* )? ( Constraint ( <TERM> )* )? ClassName ( LinkSymbol ClassName )*
	VName	:=	<IDENTIFIER>
	VType	:=	<IDENTIFIER>
	PropertyName	:=	<IDENTIFIER>
	PropertyDef	:=	Visibility PropertyName ( <COLON> VType )? ( Constraint )?
	MethodArgv	:=	VName <COLON> VType
	MethodReturnType	:=	<IDENTIFIER>
	MethodName	:=	<IDENTIFIER>
	MethodDef	:=	Visibility MethodName <LPAREN> ( MethodArgv ( <COMMA> MethodArgv )* )* <RPAREN> ( <COLON> MethodReturnType )? ( Constraint )?
	ArrowHead	:=	<ARROWHEAD>
	Line	:=	<LINE>
	LinkStmt	:=	ClassName ( LinkSymbol ClassName )+ <TERM>
	LinkSymbol	:=	( ArrowHead )? Line ( StereoType Line )? ( ArrowHead )?

DOCUMENT END
