TraversalPP = "traversal-pp" ClassName FunctionName Args Body. Body = "{" Initialize Traversal VisitorMethods "}". Initialize = "initialize" JavaCode. Traversal : Simple | Compound. Simple = [ From ] Constraints To. Compound = Op Traversals. Op : Join. Join = "join". From = "from" ClassName. To = "to" ClassName. Constraint = [ Bypassing] Through. Bypassing = "bypassing" Edges. Through = "through" Edges. Edge = "->" ClassName LabelName ClassName. Arg = JavaTypeName Variable. VisitorMethod : Before | After *common* ClassNames JavaCode. Before = "before". After = "after". // Terminal-Buffer rule ClassName = Ident. JavaTypeName = Ident. Variable = Ident. LabelName = Ident. FunctionName = Ident. JavaCode = Text. // Repetition-Buffer rule Args = "(" [ CList(Arg) ] ")". ClassNames = "{" CList(ClassName) "}". VisitorMethods = NList(VisitorMethod) . Traversals = "(" CList(Traversal) ")". Edges = NList(Edge). Constraints = List(Constraint). // Repetition classes CList(S) ~ S {"," S}. NList(S) ~ S {S}. List(S) ~ {S}. Main = . // Visitors PrintingVisitor = . SelectiveVisitor = PrintingVisitor SelectorVisitor. SelectorVisitor = Boolean. Test = int.