ClassGraph = DList(ClassDef). ClassDef = ParamClassName ClassParts ".". ParamClassName = ClassName ["(" Commalist(ClassName) ")"]. ClassParts : ConstOrAltClass | RepetitionClass. ConstOrAltClass : ConstructionClass | AlternationClass *common* List(PartOrSyntax) ClassParents. ClassParents = [ "*extends*" ClassSpec ] [ "*implements*" Commalist(ClassSpec) ] . ConstructionClass = "=". PartOrSyntax : Part | OptionalPart | Syntax. Part = [ "<" EdgeName ">" ] ClassSpec. OptionalPart = "[" Sandwich(Part) "]". AlternationClass = ":" Barlist(Subclass) [ Common ]. Subclass = ClassSpec. Common = "*" "common" "*". RepetitionClass = "~" Sandwich(RepeatedPart). RepeatedPart = [ ClassSpec ] "{" Sandwich(ClassSpec) "}". Sandwich(S) = List(Syntax) S List(Syntax) . ClassSpec = ClassName ["(" Commalist(ClassSpec) ")" ]. Syntax = String. ClassName = Ident. EdgeName = Ident. List(S) ~ {S}. DList(S) ~ S { S }. Commalist(S) ~ S {"," S}. Barlist(S) ~ S { "|" S}. Main=. DemeterJavaVisitor = Ident String Ident. ClassSpecNameVisitor = Ident. ClassDefNameVisitor = Ident. EdgeNameVisitor = Ident. EdgeClassVisitor = Ident.