demjava.cd.html

package EDU.neu.ccs.demeter.tools.demjava;
import java.text.*;
import java.util.*;
import java.util.zip.*;
import java.io.*;
import EDU.neu.ccs.demeter.*;
import EDU.neu.ccs.demeter.common.tg.*;
Program =			[ <pkg> Package*l] [ <imports> SList(Import)*l] [ Preamble*l] <cg> ClassGraph *EOF*.

Package =			"package" PackageName ";".

Import =			"import" PackageName [ ImportAllClasses] ";".

ImportAllClasses =			".*".

Preamble =			JavaCode.

ClassGraph =			<defdict> Hashtable <classes> DList(ClassGraphEntry) ["tg:" <tg> TraversalGraph].

ClassGraphEntry :			Directive
			| Definition			.

Directive :			ParseDirective
			| VisitorDirective			.

ParseDirective :			DoParse
			| DontParse			.

DoParse =			"*parse*".

DontParse =			"*noparse*".

VisitorDirective :			BeginVisitors
			| EndVisitors			.

BeginVisitors =			"*visitors*".

EndVisitors =			"*endvisitors*".

Definition :			ClassDef			.

ClassDef =			<keywords> List(ClassKeyword) ParamClassName [*s ParseDirective] *s ClassParts [ ClassMethods] [*s EOFtoken] ".".

ClassKeyword :			PublicClass
			| FinalClass
			| InterfaceClass
			| VisitorClass
			| NotParsedClass			.

PublicClass =			"*public*".

FinalClass =			"*final*".

InterfaceClass =			"*interface*".

VisitorClass =			"*visitor*".

NotParsedClass =			"*notparsed*".

ParamClassName =			ClassName ["(" <parameters> Commalist(ClassName)")"].

ClassParts :			ConstOrAltClass
			| RepetitionClass			.

ConstOrAltClass :			ConstructionClass
			| AlternationClass
			*common*			+ + + <parts> List(PartOrSyntax) <parents> ClassParents - - -.

PartOrSyntax :			Part
			| OptionalPart
			| Syntax			.

Part =			["<" PartName ">" *s] <keywords> List(PartKeyword) ClassSpec [ PartInit].

PartKeyword :			FinalPart
			| StaticPart
			| ReadOnlyPart
			| PrivatePart
			| DerivedPart			.

FinalPart =			"*final*".

StaticPart =			"*static*".

ReadOnlyPart =			"*read-only*".

PrivatePart =			"*private*".

DerivedPart =			"*derived*".

PartInit =			"*init*" *s JavaCode.

OptionalPart =			"[" [ LocalLookahead] <part> Sandwich(Part) "]".

ClassParents =			[*s "*extends*" *s <superclasses> Commalist(Superclass)] [*s "*implements*" *s <interfaces> Commalist(Interface)].

Superclass =			ClassSpec.

Interface =			ClassSpec.

ConstructionClass =			"=".

AlternationClass =			":" + + + [*lookahead*(@ _Subclass() @) <subclasses> Barlist(Subclass)] - - - [ Common].

Subclass =			[ LocalLookahead] ClassSpec.

Common =			*l + + + "*common*" - - -.

LocalLookahead =			"*lookahead*" JavaCode.

RepetitionClass =			"~" <sandwiched> Sandwich(RepeatedPart).

RepeatedPart =			[ <nonempty> ClassSpec] "{" [ LocalLookahead] <repeated> Sandwich(ClassSpec) *s "}".

Sandwich(S) =			<first> List(Syntax) *s <inner> S <second> List(Syntax).

ClassSpec =			ClassName ["(" <actual_parameters> Commalist(ClassSpec)")"].

Syntax :			PlainSyntax
			| PrintCommand			.

PlainSyntax =			<string> String.

PrintCommand :			PrintIndent
			| PrintUnindent
			| PrintSkip
			| PrintSpace			.

PrintIndent =			"+".

PrintUnindent =			"-".

PrintSkip =			"*l".

PrintSpace =			"*s".

EOFtoken =			"*EOF*".

ProgramBehavior =			[ <behavior> DList(Behavior)] *EOF*.

Behavior :			StrategyDefinition
			| ClassBehavior			.

StrategyDefinition =			"strategy" StrategyName "=" <exp> StrategyExpression ".".

StrategyExpression :			StrategyGraph
			| PathDirective
			| StrategyVariable
			| CompoundStrategy			.

StrategyGraph =			"{" *l + ["vec:" *s <edgeVec> Vector] <edges> SList(SGEdge) - *l "}" *s ["source:" <sources> ClassGlobSpec] ["source-edge:" <sourceEdges> NList(Integer)] ["target:" <targets> ClassGlobSpec] *implements* StrategyGraphI.

SGEdge =			<source> ClassGlobSpec *s "->" *s <dest> ClassGlobSpec [ <constraint> NegativeConstraint].

PathDirective =			[ <constraint> NegativeConstraint] <segments> List(PathSegment) TargetDirective.

PathSegment =			<node> PositiveConstraint [ <constraint> NegativeConstraint].

Constraint :			PositiveConstraint
			| NegativeConstraint
			*common*			<glob> GlobSpec.

PositiveConstraint :			Through
			| Via			.

Through =			"through".

Via =			"via".

NegativeConstraint :			Bypassing
			| OnlyThrough			.

Bypassing =			"bypassing".

OnlyThrough =			"only-through".

TargetDirective :			To
			| ToStop
			*common*			<targets> ClassGlobSpec.

To =			"to".

ToStop =			"to-stop".

StrategyVariable =			"do" StrategyName.

CompoundStrategy :			Join
			| Merge
			| Intersect
			*common*			"(" <args> Commalist(StrategyExpression) ")".

Join =			"join".

Merge =			"merge".

Intersect =			"intersect".

GlobSpec :			OneGlob
			| GlobSet			.

OneGlob =			Glob.

GlobSet =			"{" *s [ <globs> Commalist(Glob)*s] "}".

Glob :			ClassGlob
			| EdgeGlob			.

EdgeGlob :			PartGlob
			| SubclassGlob
			| SuperclassGlob			.

ClassGlob =			<name> ClassNameGlob.

PartGlob =			"->" *s <source> SourceGlob "," *s <name> PartNameGlob "," *s <dest> DestGlob.

SubclassGlob =			"=>" *s <source> SourceGlob "," *s <dest> DestGlob.

SuperclassGlob =			":>" *s <source> SourceGlob "," *s <dest> DestGlob.

SourceGlob =			<name> ClassNameGlob.

DestGlob =			<name> ClassNameGlob.

ClassNameGlob :			ClassNameExact
			| AnyClass			.

ClassNameExact =			ClassName.

AnyClass =			"*".

PartNameGlob :			PartNameExact
			| AnyPart			.

PartNameExact =			PartName.

AnyPart =			"*".

ClassGlobSpec :			OneClassGlob
			| ClassGlobSet			.

OneClassGlob =			ClassGlob.

ClassGlobSet =			"{" *s <globs> Commalist(ClassGlob) *s "}".

ClassBehavior =			<classes> ClassGlobSpec <methods> ClassMethods.

ClassMethods =			"{" *l + [ <methods> SList(Method)] - *l "}" ["wrappers:" <wrapperdict> Hashtable].

HostSet =			["exact:" <exactHosts> Hashtable] ["partnames:" <partnames> Hashtable] ["globs:" <globs> GlobSet].

Method :			TraversalDef
			| MethodDef
			| Wrapper
			| Accessor
			| Constructor
			| ReturnValue
			| Verbatim			.

TraversalDef =			"traversal" <name> TraversalName <parms> TraversalParms *s "{" *l + <strat> StrategyExpression ";" - *l "}".

TraversalParms =			"(" [ <visitors> Commalist(Visitor)] ")".

Visitor =			ClassName [ VisitorName].

MethodDef =			MethodSignature MethodBody.

MethodSignature =			<keywords> List(MethodKeyword) <returnType> JavaType <name> MethodName "(" [ <parms> Commalist(MethodParm)] ")".

MethodKeyword :			PublicMethod
			| ProtectedMethod
			| PrivateMethod
			| StaticMethod
			| FinalMethod
			| AbstractMethod			.

PublicMethod =			"public".

ProtectedMethod =			"protected".

PrivateMethod =			"private".

StaticMethod =			"static".

FinalMethod =			"final".

AbstractMethod =			"abstract".

MethodParm =			<type> JavaType <array1> List(ArraySpec) <name> ParmName <array2> List(ArraySpec).

ArraySpec =			"[" "]".

MethodBody :			VerbatimMethodBody
			| AdaptiveMethodBody
			| NoMethodBody			.

VerbatimMethodBody =			JavaCode.

AdaptiveMethodBody =			<trv> TraversalExpression <vis> VisitorExpression.

NoMethodBody =			";".

TraversalExpression :			TraversalRef
			| TraversalSpec			.

TraversalRef =			[ Equals] <name> TraversalName.

Equals =			"=".

TraversalSpec =			<strat> StrategyExpression.

VisitorExpression :			VisitorRef
			| VisitorSpec			.

VisitorRef :			WithVisitorRef
			| ParenVisitorRef			.

WithVisitorRef =			"with" <visitorClasses> Commalist(ClassName) ";".

ParenVisitorRef =			"(" <visitorClasses> Commalist(ClassName) ")" ";".

VisitorSpec =			<methods> ClassMethods.

Wrapper =			<kind> WrapperKind <hosts> HostSpec JavaCode.

WrapperKind :			Before
			| Around
			| After			.

Before =			"before".

Around =			"around".

After =			"after".

HostSpec :			GlobSpec			.

Accessor :			Getter
			| Setter
			*common*			PartName JavaCode.

Getter =			"get".

Setter =			"set".

Constructor =			"init" JavaCode.

ReturnValue =			"return" [ <type> JavaType] <exp> JavaCode.

Verbatim =			JavaCode.

PackageName ~ Ident{*lookahead*(@ 2 @) "." Ident }.

ClassName =			<name> Name *implements* ClassNameI.

PartName =			<name> Ident *implements* PartNameI.

TraversalName =			Name.

VisitorName =			Name.

MethodName =			<name> Ident.

ParmName =			<name> Ident.

StrategyName =			<name> Ident.

JavaType =			<type> Name.

JavaCode =			<code> Text.

Name ~ Ident{*lookahead*(@ "." _Ident(),{ "=:~(".indexOf(getToken(3).image) == -1 } @) "." Ident }.

List(S) ~ *s S }.

NList(S) ~ S{*s S }.

SList(S) ~ S{*l S }.

DList(S) ~ S{*l *l S }*l.

Commalist(S) ~ S{"," *s S }.

Barlist(S) ~ S{*l "|" *s S }.

*noparse*

TraversalMethodName =			MethodName.

ClassType =			<is_con> boolean <is_alt> boolean <is_rep> boolean <is_public> boolean <is_final> boolean <is_interface> boolean <is_not_parsed> boolean <is_visitor> boolean.

PartType =			<is_final> boolean <is_static> boolean <is_derived> boolean <has_getter> boolean <has_setter> boolean.

Parts ~  Part }.

*visitors*

ConstructionRuleGenerator =			[ ClassName] <opt> boolean <constr> boolean.

ClassGlobVisitor :			SourceEdgeCollector			.

SourceEdgeCollector =			<sg> StrategyGraph <edges> NList(Integer).

BehaviorCodeGenerator =			ClassDef ClassName PartName <hosts> HostSpec <gen> WrapperCodeGenerator.

WrapperClassChecker =			ClassName.

LookaheadPrinter =			.

ClassNameAccessor :						.
			
			ClassDefVisitor :			NonParamDefCollector
						| GlobalBehaviorAttacher
						| TGVertexCollector
						| RuleGenerator			.
			
			NonParamDefCollector =			<cg> ClassGraph.
			
			GlobalBehaviorAttacher =			<methods> ClassMethods.
			
			RuleGenerator =			.
			
			PartVisitor :			PartNameSetter
						| ParamReplacer
						| RuleDeclGenerator
						| TerminalCollector			.
			
			PartNameSetter =			.
			
			ParamReplacer =			<params> Commalist(ClassName) <actuals> Commalist(ClassSpec).
			
			RuleDeclGenerator =			.
			
			TerminalCollector =			.
			
			EdgeVisitor :						.
						
						GlobVisitor :			GlobMatcher
									| GlobCollector
									| ClassGlobCollector
									| EdgeGlobCollector
									| OutgoingEdgeSpecConvertor
									| SGEdgeMatcher			.
						
						GlobMatcher =			Glob <found_one> boolean.
						
						GlobCollector =			<spec> GlobSet.
						
						ClassGlobCollector =			<spec> ClassGlobSet.
						
						EdgeGlobCollector =			<spec> GlobSet.
						
						OutgoingEdgeSpecConvertor =			<spec> GlobSet.
						
						SGEdgeMatcher =			<c> ClassNameI <index> int <return_val> Vector.
						
						VisitorNameVisitor :			WrapperCallGenerator			.
						
						WrapperCallGenerator =			<kind> WrapperKind <cont> String <indent> boolean Glob <visclname> ClassName <return_val> String.
						
						WrapperCodeGenerator =			<kind> WrapperKind <code> Text.
						
						PartGetter =			PartName <answer> Part <isPart> boolean.
						
						TGVertexCollector =			<tg> TraversalGraph.
						
						TGEdgeGlobMaker =			<s> ClassName <d> ClassName <cl> ClassName <name> PartName <return_val> Glob *extends* TGEdgeVisitor.
						
						HtmlClassNameVisitor =			.
						
						HtmlClassIndex =			.
						
						HtmlVisitor =			<indent> int <needSpace> boolean *extends* UniversalVisitor.
						
						TAOVisitor :			FindVisitorTargetsV
									| CreateMethodsV			.
						
						FindVisitorTargetsV =			<btargets> Vector <atargets> Vector <aroundtargets> Vector <visitorname> String <doing> Vector.
						
						CreateMethodsV =			<rcd> ClassDef <baseclassname> String <classname> String <btargets> Vector <atargets> Vector <aroundtargets> Vector <abort> boolean <doneclasses> Vector <makeprotoparts> String <makeprotosubclasses> String <makeprotomain> String <pathtravmain> String <traverseparts> String <traversesubclasses> String <partcounter> int <subclasscounter> int <optionalpart> boolean <partsdone> Vector <graphstr> String <partstr> String <subclassstr> String <visitorstr> String <hierarchy> Vector.