Date: Mon, 28 Jul 2003 15:51:35 -0400 (EDT)
From: C. Scott Ananian
To: jsr14-prototype-comments@Sun.COM
Subject: Corrections to JSR-14 prototype 2.2 spec.

Appended is a corrected prototype 2.2 grammar, listed by section.
I've separately listed the changes I've made for each section, as well as
some comments on unclear portions.

This grammar can be converted to an LALR(1) grammar with no lexer
tricks using Eric Blake's refactorization of expressions; I can make a
CUP expression of this available if it is useful.
 --scott

COBRA JUDY class struggle assassination Legion of Doom anthrax Echelon 
early warning Mk 48 shortwave struggle non-violent protest SDI explosives 
                         ( http://cscott.net/ )

=========================================================================
Section 2.1 Type Syntax
-----------------------
ReferenceType		::= ClassOrInterfaceType
			 |  ArrayType
			 |  TypeVariable

TypeVariable		::= Identifier

ClassOrInterfaceType	::= ClassOrInterface TypeArgumentsOpt

ClassOrInterface	::= Identifier
			 |  ClassOrInterfaceType . Identifier

TypeArguments		::= < TypeArgumentList >

TypeArgumentList	::= TypeArgument
			 |  TypeArgumentList , TypeArgument

TypeArgument		::= ReferenceType
			 |  Wildcard

Wildcard		::= ? WildcardBoundsOpt

WildcardBounds		::= extends ReferenceType
			 |  super ReferenceType

[changes:
 a) rename ActualTypeArguments to TypeArguments and
    ActualTypeArgumentList to TypeArgumentList to be consistent with
    TypeParameterList, etc naming.
 b) fix capitalization on WildcardBoundsOpt in Wildcard production.
]

Section 2.2 Parameterized Type Declarations
-------------------------------------------

[no changes]

Section 2.4 Handling Consecutive Type Parameter Brackets
--------------------------------------------------------

ReferenceType		::= ClassOrInterfaceType
			 |  ArrayType
			 |  TypeVariable

ClassOrInterfaceType	::= ClassOrInterface
			 |  ClassOrInterface TypeArguments

ClassOrInterface	::= Name
			 |  ClassOrInterface TypeArguments DOT Name

ReferenceType1		::= ReferenceType >
			 |  ClassOrInterface < TypeArgumentsList2

ReferenceType2		::= ReferenceType >>
			 |  ClassOrInterface < TypeArgumentsList3

ReferenceType3		::= ReferenceType >>>

TypeParameters		::= LT TypeParameterList1

TypeParameterList1	::= TypeParameter1
			 |  TypeParameterList , TypeParameter1

TypeParameter1		::= TypeVariable >
			 |  TypeVariable extends ReferenceType1
			 |  TypeVariable extends ReferenceType AdditionalBoundList1

AdditionalBoundsList1	::= AdditionalBound1
			 |  AdditionalBound AdditionalBoundList1

AdditionalBound1	::= & ReferenceType1

TypeArguments		::= LT TypeArgumentList1

TypeArgumentList1	::= TypeArgument1
			 |  TypeArgumentList, TypeArgument1

TypeArgumentList2	::= TypeArgument2
			 |  TypeArgumentList, TypeArgument2

TypeArgumentList3	::= TypeArgument3
			 |  TypeArgumentList, TypeArgument3

TypeArgument1		::= ReferenceType1
			 |  Wildcard1

TypeArgument2		::= ReferenceType2
			 |  Wildcard2

TypeArgument3		::= ReferenceType3
			 |  Wildcard3

Wildcard1		::= ? >
			 |  ? WildcardBounds1

WildcardBounds1		::= extends ReferenceType1
			 |  super ReferenceType1

Wildcard2		::= ? >>
			 |  ? WildcardBounds2

WildcardBounds2		::= extends ReferenceType2
			 |  super ReferenceType2

Wildcard3		::= ? >>>
			 |  WildcardBounds3

WildcardBounds3		::= extends ReferenceType3
			 |  super ReferenceType3

[changes: extensive.  original grammar did not allow
    type parameter: <T extends Object & Set<X>>
    class type: A<List<?>>
]

3.1 Method Declarations
-----------------------
[no changes]

3.3 Generic Constructors
------------------------

ConstructorDeclaration	::= ConstructorModifiersOpt ConstructorDeclarator
			      ThrowsOpt ConstructorBody

ConstructorDeclarator	::= TypeParametersOpt SimpleTypeName
			      ( FormalParameterListOpt )

[changes:
  a) TypeArgumentsOpt changed to TypeParametersOpt in production for
     ConstructorDeclarator
]

5.1 Class Instance Creation Expressions
---------------------------------------

ClassInstanceCreationExpression ::= new TypeArgumentsOpt
	ClassOrInterfaceType ( ArgumentListOpt ) ClassBodyOpt
				 |  Primary . new TypeArgumentsOpt
	Identifier TypeArgumentsOpt ( ArgumentListOpt ) ClassBodyOpt

[changes:
  a) Removed extra TypeArgumentsOpt from first alternative
  b) Fixed position of 'new' vs TypeArgumentsOpt in both alternatives
 comments:
  a) Is 'Name' intended to be a valid 'Primary'?
     current prototype allows this; JLS grammar is unclear. (sun bug 4750181)
     current prototype also does *not* accept the first alternative in
     this production, e.g. '<A> new B()'
]

5.2 Explicit Constructor Invocations
------------------------------------

ExplicitConstructorInvocation ::= TypeArgumentsOpt this ( ArgumentListOpt )
			| TypeArgumentsOpt super ( ArgumentListOpt )
			| Primary . TypeArgumentsOpt super ( ArgumentListOpt )

[comments:
  a) again, is 'Name' intended to be a valid 'Primary'?
]

5.3 Array Creation Expressions
------------------------------
[no changes]

5.6 Generic Method Invocation
-----------------------------

MethodInvocation ::= MethodExpr ( ArgumentListOpt )

MethodExpr	::= MethodName
		 |  Primary . TypeArgumentsOpt Identifier
		 |  super . TypeArgumentsOpt Identifier
		 |  Name . super . TypeArgumentsOpt Identifier

[changes:
  a) 'ClassName' to 'Name' -- this is perhaps spurious
  b) Removed 'TypeArgumentsOpt' from first alternative; this is to
     resolve the A((B)<C,D>E()) ambiguity.  Example 18 must be
     changed; some text should also address this non-orthogonality.
 comments:
  a) Current implementation allows 'Name' as a 'Primary', e.g.
       A.<B>foo();
     Presumably this *is* the intended behavior, as the first
     alternative in the MethodExpr production is not accepted by the
     prototype, e.g. '<B>foo();'
  b) If Name is a Primary and Name is a MethodName, then there is an
     ambiguity in the parse for 'a.b()'.
]

Valid XHTML 1.0!