// demjava.cd -- class dictionary for Demeter/Java (@ import java.util.*; import java.io.*; @) Main = . GenerateEqualVisitor = . GenerateEdgeVisitor = . // Begin Utility function visitors GetCSNameVisitor = Ident. GetCDNameVisitor = Ident. GetPNameVisitor = Ident. GetPCNameVisitor = Ident. IsDemeterClassVisitor = . IsAlternationClassVisitor = . // End Utility function visitors Program = [ Package ] [ JavaCode ] ClassGraph. Package ~ "package" DirName { "." DirName } ";". ClassGraph = DList(ClassDef). ClassDef = ParamClassName ClassParts [ ClassMethods ] "." . 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*" Superclass ] [ "*implements*" Commalist(Interface) ] . Superclass = ClassSpec. Interface = 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" . ////////////////////// // Behavior (methods). ////////////////////// ProgramBehavior = [ DList(ClassBehavior) ]. ClassBehavior = ClassGlobSpec ClassMethods. ClassMethods = "{" *l + [ SList(Method) ] - "}" . Method : Traversal | Behavior. Behavior : Wrapper | Verbatim. // Class graph traversal specifications. Traversal = "traversal" TraversalName TraversalParms "{" *l + PathDirective ";" - *l "}". TraversalParms = "(" [ Commalist(Visitor) ] ")" . Visitor = ClassName VisitorName. PathDirective = [ BypassingDirective ] [ ThroughDirective ] TargetDirective. BypassingDirective = "bypassing" GlobSpec. ThroughDirective = "through" GlobSpec. TargetDirective : To | ToStop *common* ClassGlobSpec. To = "to". ToStop = "to-stop". GlobSpec : OneGlob | GlobSet. OneGlob = Glob. GlobSet = "{" [ Commalist(Glob) ] "}". Glob : ClassGlob | EdgeGlob. EdgeGlob : PartGlob | SubclassGlob | SuperclassGlob. ClassGlob = ClassNameGlob. PartGlob = "->" SourceGlob "," PartNameGlob "," DestGlob. SubclassGlob = "=>" SourceGlob "," DestGlob. SuperclassGlob = ":>" SourceGlob "," DestGlob. SourceGlob = ClassNameGlob. DestGlob = ClassNameGlob. ClassNameGlob : ClassNameExact | AnyClass. ClassNameExact = ClassName. AnyClass = "*". PartNameGlob : PartNameExact | AnyPart. PartNameExact = PartName. AnyPart = "*". ClassGlobSpec : OneClassGlob | ClassGlobSet. OneClassGlob = ClassGlob. ClassGlobSet = "{" Commalist(ClassGlob) "}". // Before and after wrappers. Wrapper : Before | After *common* HostSpec JavaCode. Before = "before". After = "after". HostSpec : GlobSpec. // Verbatim java code. Verbatim = JavaCode. // Terminal buffer classes. DirName = Ident. ClassName = Ident. PartName = Ident. TraversalName = Ident. VisitorName = Ident. MethodName = Ident. JavaCode = Text. // 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. SimplePrinter = . PackagePrinter = . SubclassBacklinker = ClassName. SuperclassNameGetter = [ ClassName ]. ClassNameExpander = ClassName. ClassNameFinder = Integer ClassName. KeywordPrinter = . NameConcatenator = String. ParamListGetter = ClassName_Commalist. RepetitionConverter = ClassName ConstructionClass ConstructionClass ClassName . RepetitionNodesCompleter = ConstructionClass ConstructionClass ClassName . PartOrSyntaxAdder = PartOrSyntax. BehaviorCollector = String ClassGlobSpec. ClassGlobVisitor : BehaviorAttacher | BackwardMarkerCarrier. BehaviorAttacher = "_BehaviorAttacher" String ClassMethods. BackwardMarkerCarrier = "_BackwardMarkerCarrier". BehaviorCodeGenerator = String HostSpec. WrapperCodeGenerator = String Text. TraversalExpander = ClassDef. MethodAdder = Method. WrapperClassChecker = ClassName. Visitor_CommalistReverser = Nonempty_Visitor_Commalist. RuleVisitor = . DeclVisitor = . RHSVisitor = ClassName. ParseCodeGenerator = ClassName. ClassNameAccessor : ClassNameSetter | ClassNameGetter *common* ClassName. ClassNameGetter = "_ClassNameGetter". ClassNameSetter = "_ClassNameSetter". ClassSpecVisitor : ParamExpander | ClassSpecFinder. ParamExpander = "_ParamExpander". ClassSpecFinder = "_ClassSpecFinder" Integer ClassSpec. ParentsVisitor : ParentSetter | ParentPrinter. ParentSetter = "_ParentSetter" ClassName [ ClassName ]. ParentPrinter = "_ParentPrinter". ClassGraphVisitor : ClassDefAdder | ClassesSetter. ClassDefAdder = "_ClassDefAdder" ClassDef. ClassesSetter = "_ClassesSetter" ClassDef_DList. ClassDefVisitor : ClassDefCollector | ClassDefCounter | NonParamDefCollector | GlobalBehaviorAttacher | SCCchecker | CodeGenerator. ClassDefCollector = "_ClassDefCollector". ClassDefCounter = "_ClassDefCounter" . // int NonParamDefCollector = "_NonParamDefCollector" ClassDef_DList. GlobalBehaviorAttacher = "_GlobalBehaviorAttacher" ClassMethods. SCCchecker = "_SCCchecker" SCCstate. CodeGenerator = "_CodeGenerator". PartVisitor : PartPrinter | PartCollector | PartNameSetter | ConstructorArgsGenerator | ConstructorInitsGenerator | ConstructorSuperInitGenerator | ParamReplacer . PartPrinter = "_PartPrinter". PartCollector = "_PartCollector" Commalist(Part). PartNameSetter = "_PartNameSetter". ConstructorArgsGenerator = "_ConstructorArgsGenerator". ConstructorSuperInitGenerator = "_ConstructorSuperInitGenerator". ConstructorInitsGenerator = "_ConstructorInitsGenerator". ParamReplacer = "_ParamReplacer" Commalist(ClassName) Commalist(ClassSpec). EdgeVisitor : SCC | SubgraphMarker | TraversalMethodGenerator. SCC = ClassDef [ Superclass ] SCCstate. SCCstate = . SubgraphMarker : ForwardMarker | BackwardMarker | AllBackwardMarker *common* ClassName. ForwardMarker = "_ForwardMarker" TraversalInfo. BackwardMarker = "_BackwardMarker" ClassDef. AllBackwardMarker = "_AllBackwardMarker". TraversalInfo = ClassDef "_bypass" GlobSpec [ "_targets" ClassGlobSpec ]. TraversalMethodGenerator = "_TraversalMethodGenerator" TraversalMethodInfo ClassName. TraversalMethodInfo = MethodName TraversalParms TraversalParms String. GlobMatcher = Glob. ClassNameMatcher = ClassName. VisitorNameVisitor : VisitorNameCollector | WrapperCallGenerator. VisitorNameCollector = "_VisitorNameCollector" String. WrapperCallGenerator : BeforeCallGenerator | AfterCallGenerator *common* ClassName Glob. BeforeCallGenerator = "_BeforeCallGenerator". AfterCallGenerator = "_AfterCallGenerator". WrapperChecker = Glob.