(@ import java.util.*; @) EdgeDistinctionVisitor = int int. ClassNameRetVisitor = ClassName. ClassNameTranspVisitor = ParamClassName. EdgeVisitor = ClassNameTranspVisitor. // demjava.cd -- class dictionary for Demeter/Java Program = [ JavaCode ] ClassGraph ["hashtable" MyHashtable]. MyHashtable = *extends* Hashtable. ClassGraph = DList(ClassDef). ClassDef = ParamClassName ClassParts [ ClassMethods ] "." [ DFS_mark ] [ PP_mark ] . 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) ")" ] [ PP_mark ] . Syntax : PlainSyntax | PrintCommand. PlainSyntax = String. PrintCommand : PrintIndent | PrintUnindent | PrintSkip | PrintSpace. PrintIndent = "+" . PrintUnindent = "-" . PrintSkip = "*l" . PrintSpace = "*s" . // Marks for traversal bookkeeping. DFS_mark = "*dfs*". PP_mark = "*pp*". ////////////////////// // Behavior (methods). ////////////////////// ProgramBehavior = [ DList(ClassBehavior) ] . ClassBehavior = ClassName ClassMethods. ClassMethods = "{" *l + [ SList(Method) ] - "}" . Method : Traversal | Wrapper | Verbatim. // Class graph traversal specifications. Traversal = "traversal" TraversalName TraversalArgs "{" *l + PathDirective ";" - *l "}". TraversalArgs = "(" [ Commalist(Visitor) ] ")" . Visitor = ClassName VisitorName. PathDirective = [ "bypassing" Bypassing ] Target. Bypassing = Commalist(Glob). Glob : ClassGlob | EdgeGlob. EdgeGlob : PartGlob | SubclassGlob. ClassGlob = ClassNameGlob. PartGlob = "->" ClassNameGlob "," PartNameGlob "," ClassNameGlob. SubclassGlob = "=>" ClassNameGlob "," ClassNameGlob. ClassNameGlob : ClassNameExact | AnyClass. ClassNameExact = ClassName. AnyClass = "*". PartNameGlob : PartNameExact | AnyPart. PartNameExact = PartName. AnyPart = "*". Target : To | ToStop *common* ClassName. To = "to". ToStop = "to-stop". // Before and after wrappers. Wrapper : Before | After *common* ClassName JavaCode. Before = "before". After = "after". // Verbatim java code. Verbatim = JavaCode. // Terminal buffer classes. 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. PrintVisitor = . Main = .