GelloPackage::= PackageStatement

PackageStatement::=
	<PACKAGE> NameOrLiteral ImportsStatement? PackageElement* <ENDPACKAGE>

ImportsStatement::=
	<IMPORTS> ImportName ("," ImportName)*

ImportName::=	NameOrLiteral

PackageElement::= PackageStatement | ClassDefinition

ClassDefinition::=
	<CLASS> ClassDefName (<EXTENDS> ClassRef)? ClassMember* |
	<CLASS> ClassDefName <EQUAL> ClassRef |
	<CLASS> ClassName EnumerationType

ClassDefName::=
	NameOrLiteral |
	NameOrLiteral "(" ClassRefList ")" |
	NameOrLiteral "<" NameList ">"

ClassRefList::= ClassRef ("," ClassRef)*

NameList::= Name ( Name "," )*

ClassRef::=
	ClassName |
	ClassName "(" ClassRef ")" |
	<TUPLE>

ClassMember::=		NameOrLiteral ( "(" ClassFormalParams? ")" )? ":" ClassRef

ClassFormalParams::=	ClassFormalParam ("," ClassFormalParam )*

ClassFormalParam::=	Name ":" ClassRef

EnumerationType::=      <ENUM> "(" (EnumLiteral ( "," EnumLiteral )*) ")"

EnumLiteral::=		NameOrLiteral

NameOrLiteral::=	Name | <STRING_LITERAL>

ClassName::=		NameWithPath | <STRING_LITERAL>

NameWithPath::= 	Name ("::" Name)*

Name::=			<ID> ("." <ID>)*

<STRING_LITERAL: ('\"' (~[ '\"' , "\n", "\r"])* '\"' | "\'" (~[ "\'" , "\n", "\r"])* "\'" ) >

<ID: ["a"-"z","A"-"Z"] (["a"-"z","A"-"Z","0"-"9"] | "_"(["a"-"z","A"-"Z","0"-"9"])+)* >

<ENUM: "Enum">

<TUPLE: "Tuple" >

<EQUAL: "=" >

<ENDPACKAGE: "endPackage" | "EndPackage" | "endpackage">

<CLASS: "class"| "Class">

<EXTENDS: "extends" >

<IMPORTS: "Imports" | "imports">

<PACKAGE: "Package" | "package">