package edu.neu.ccs.demeter.tools.daj; import edu.neu.ccs.demeter.dj.*; import java.io.*; import java.lang.reflect.*; import java.util.*; // Class dictionary for the traversal aspect declaration TraversalAspectList = ListL(TraversalAspect). TraversalAspect = "aspect" AspectName "{" *l List(AspectDecl) *l "}" *l. AspectDecl : TraversalDecl | ClassGraphDecl | VisitorDecl. TraversalDecl = "declare" "traversal" TraversalVar [ TraversalDeclOptions ] ":" TraversalStrategy ";" . TraversalDeclOptions = "(" ClassGraphVar [ "," VisitorVar ] ")". TraversalVar = Ident. TraversalStrategy = String. VisitorDecl = "Visitor" VisitorVar ";". VisitorVar = Ident. ListL(s) ~ { *l s}. List(S) ~ { S }. AspectName = Ident. ClassGraphDecl : lookahead {{3}} ClassGraphSliceDecl | DefaultClassGraphDecl . ClassGraphVar = Ident. ClassGraphVarDecl = "ClassGraph" ClassGraphVar. DefaultClassGraphDecl = ClassGraphVarDecl ";". ClassGraphSliceDecl = ClassGraphVarDecl "=" "new" "ClassGraph" "(" Ident "," TraversalStrategy ")" ";". public ClassGraphListenerFactory = . public ClassGraphListener : MyClassGraphListener. MyClassGraphListener = java.util.Hashtable . // class dictionary for the visitor code generation // it's used to parse a visitor class and it's methods VisitorClass = "class" ClassName *s "{" *l LineList(VisitorMethod) "}" *l. VisitorMethod = ReturnType MethodName "(" [AdviceArgumentList] ")" ";" *l. MethodName = Ident. ReturnType = Ident. Argument = Ident. ClassName = Ident. AdviceArgumentList = CommaList(Argument). LineList(S) ~ { S *l }. CommaList(S) ~ S { "," S}. noparse StreamFunnel = StreamConnector StreamConnector. StreamConnector = java.io.InputStream java.io.OutputStream extends Thread.