// demjava.cd -- class dictionary for Demeter/Java (@ import java.util.*; import java.io.*; @) Main = . Program = [ Package ] [ JavaCode ] ClassGraph. Package ~ "package" DirName { "." DirName } ";". ClassGraph = DList(ClassDef). ClassDef = ParamClassName ClassParts "." . ParamClassName = ClassName ["(" Commalist(ClassName) ")"]. ClassParts : ConstOrAltClass | RepetitionClass. ConstOrAltClass : ConstructionClass | AlternationClass *common* + + + List(PartOrSyntax) ClassParents - - -. PartOrSyntax : Part | OptionalPart | Syntax. Part = [ "<" PartName ">" ] ClassSpec. OptionalPart = "[" Sandwich(Part) "]". ClassParents = [ "*extends*" ClassSpec ] [ "*implements*" Commalist(ClassSpec) ] . ConstructionClass = "=". AlternationClass = ":" + + + Barlist(Subclass) - - - [ Common ]. Subclass = ClassSpec. Common = *l + + + "*" "common" "*" - - -. RepetitionClass = "~" Sandwich(RepeatedPart). RepeatedPart = [ ClassSpec ] "{" Sandwich(ClassSpec) "}". Sandwich(S) = List(Syntax) S List(Syntax) . ClassSpec = ClassName ["(" Commalist(ClassSpec) ")" ] . Syntax : PlainSyntax | PrintCommand. PlainSyntax = String. PrintCommand : PrintIndent | PrintUnindent | PrintSkip | PrintSpace. PrintIndent = "+" . PrintUnindent = "-" . PrintSkip = "*l" . PrintSpace = "*s" . // Terminal buffer classes. DirName = Ident. ClassName = Ident. PartName = Ident. TraversalName = Ident. VisitorName = Ident. MethodName = Ident. JavaCode = "(@" String "@)". // Parameterized class definitions. List(S) ~ {S}. SList(S) ~ S { *l S } *l . DList(S) ~ S { *l *l S } *l . Commalist(S) ~ S {"," S}. Barlist(S) ~ S { *l "|" S}. // Extra utility parameterized classes. Parameterized = Commalist(Part). SyntaxTable = List(PlainSyntax). // Visitors // vector of cd defined class names LeftSide_ClassVisitor = NameContainer. RightSide_ClassVisitor = NameContainer. NameContainer = *extends* Vector. // Vector(String)