For those of you who do an aspect-related project, here are the weaver instructions which Josh Marshall's generic weaver uses to compose your Java programs. Demeter/Java (with the -aspect flag) uses this mechanism. -- Karl L. From jayantha@ccs.neu.edu Fri Nov 21 14:25:52 1997 Subject: weaver instructions There are 5 types of weaver instructions (so far): o Add class/interface o Add field/method o Augment method o Implement interface o Rename Method Examples: add: abstract class MyHashTable extends java.util.Hashtable { constructor MyHashTable() (@ ... @) private int length = (@ 0 @) // etc } add: to: MyHashTable { public int getLength() (@ return length; @) } before: MyHashTable.getLength (@ ... @) implement: SomeInterface in: MyHashTable; rename: MyHashTable getLength to: get_length; I have also attached the cd. josh //package EDU.neu.ccs.demeter.tools.weaver; import java.io.*; import java.util.*; /* * Weaver */ Weaver = Aspect ":" [Pack] [ImportPacks] CodeFrags *EOF* . Aspect = Ident . Pack = "package" DotList(Ident) ";" . ImportPacks : TextImport | ParsableImports . TextImport = Text . ParsableImports ~ ParsableImport {ParsableImport} . ParsableImport = "import" PackageName ";" . PackageName ~ PackagePart {"." PackagePart} . PackagePart : PackageIdent | PackageStar . PackageIdent = Ident . PackageStar = "*" . CodeFrags ~ {CodeFrag} . CodeFrag = [Priority] AdjustItem . Priority = "priority" . AdjustItem : *lookahead* (@ "add:" ("public"|"final"|"abstract")* "class" @) AddClass | *lookahead* (@ "add:" ("public"|"final"|"abstract")* "interface" @) AddInterface | *lookahead* (@2@) AddAttribute | AugmentMethod | ImplementInterface | RenameMethod . /* * Keywords */ Options ~ Option {Option} *s . Option : PubOpt | PrivOpt | ProtOpt | StaticOpt | FinalOpt | SynchOpt | TransOpt | VolOpt | AbsOpt. PubOpt = "public" . PrivOpt = "private" . ProtOpt = "protected" . StaticOpt = "static" . FinalOpt = "final" . SynchOpt = "synchronized" . TransOpt = "transient" . VolOpt = "volatile" . AbsOpt = "abstract" . /* * AddClass */ AddClass = "add:" [Options] "class" AddClassName ClassParentFeature "{" ClassParts "}" . AddClassName = Ident . ClassParentFeature = ["extends" ParentClass] ["implements" Interfaces] . ParentClass = DottedName . DottedName = DotList(Ident) . Interfaces = ComListOfDotList . ClassParts ~ {ClassPart} . ClassPart : TextClassPart | ParsableClassPart . TextClassPart = JavaCode . JavaCode = Text . ParsableClassPart = [Options] MemberType MemberName ClassFieldVsMethod . MemberType : ConstructorType | DataType . ConstructorType = "constructor" . DataType = DottedName [SquareBracketses] . SquareBracketses ~ SquareBrackets {SquareBrackets} *s . SquareBrackets = "[" "]" . MemberName = Ident [SquareBracketses] . ClassFieldVsMethod : IncompleteClassField | IncompleteClassMethod . IncompleteClassField : IncompleteInitField | IncompleteUninitField . IncompleteInitField = "=" JavaCode . IncompleteUninitField = ";" . IncompleteClassMethod = "(" [Arguments] ")" [MethodThrows] MethodBody . Arguments ~ Argument {"," *s Argument} . Argument = DataType VarName . VarName = Ident [SquareBracketses] . MethodThrows = "throws" SomeExceptions . SomeExceptions = ComListOfDotList . MethodBody = JavaCode . /* * AddInterface */ AddInterface = "add:" [Options] "interface" InterfaceName InterfaceParentFeature "{" InterfaceParts "}" . InterfaceName = DottedName . InterfaceParentFeature = ["extends" Interfaces] . InterfaceParts ~ {InterfacePart} . InterfacePart = [Options] DataType MemberName InterfaceFieldVsMethod . InterfaceFieldVsMethod : IncompleteInterField | IncompleteMethodSig . IncompleteInterField = IncompleteInitField . IncompleteMethodSig = "(" [Arguments] ")" [MethodThrows] ";" . /* * AddAttribute */ AddAttribute = "add:" "to:" ClassName "{" ClassParts "}" . ClassName = Ident . /* * AugmentMethod */ AugmentMethod = InsertPlace FullMethodName JavaCode . InsertPlace : InsertBefore | InsertAfter . InsertBefore = "before:" . InsertAfter = "after:" . FullMethodName = ClassName "." GenMethodName . GenMethodName : MethodName | StarMethod . MethodName = Ident . StarMethod = "*" . /* * ImplementInterface */ ImplementInterface = "implement:" DottedName "in:" ClassName ";" . /* * RenameMethod */ RenameMethod = "rename:" ClassName OrigRenameMethodSig "to:" NewRenameMethodSig ";" . OrigRenameMethodSig = [Options] [*lookahead* (@_MemberType() _MemberName() _OrigRenameMethodArgs()@) MemberType] MemberName [OrigRenameMethodArgs] . OrigRenameMethodArgs = "(" [ArgumentTypes] ")" . ArgumentTypes ~ ArgumentType {"," *s ArgumentType} . ArgumentType = DataType . NewRenameMethodSig = [Options] [*lookahead* (@_MemberType() _MemberName() _NewRenameMethodArgs()@) MemberType] MemberName [NewRenameMethodArgs] . NewRenameMethodArgs = "(" [Arguments] ")" . ComListOfDotList ~ DottedName {"," *s DottedName} . DotList(S) ~ S {"." S} . WMain = . AspectSorter = . OutputVisitor = .