This chapter repeats the syntactic grammar given in Chapters 4, 6-10, 14, and 15, as well as key parts of the lexical grammar from Chapter 3, using the notation from §2.4.
Productions from §3 (Lexical Structure)
Identifier:
IdentifierChars but not a Keyword or BooleanLiteral or NullLiteral
IdentifierChars:
JavaLetter {JavaLetterOrDigit}
JavaLetter:
any Unicode character that is a “Java letter”
JavaLetterOrDigit:
any Unicode character that is a “Java letter-or-digit”
Literal:
IntegerLiteral
FloatingPointLiteral
BooleanLiteral
CharacterLiteral
StringLiteral
NullLiteral
Productions from §4 (Types, Values, and Variables)
Type:
PrimitiveType
ReferenceType
PrimitiveType:
{Annotation} NumericType
{Annotation} boolean
NumericType:
IntegralType
FloatingPointType
IntegralType: one of
byte short int long char
FloatingPointType: one of
float double
ReferenceType:
ClassOrInterfaceType
TypeVariable
ArrayType
ClassOrInterfaceType:
ClassType
InterfaceType
ClassType:
{Annotation} Identifier [TypeArguments]
ClassOrInterfaceType .
{Annotation} Identifier [TypeArguments]
InterfaceType:
ClassType
TypeVariable:
{Annotation} Identifier
ArrayType:
PrimitiveType Dims
ClassOrInterfaceType Dims
TypeVariable Dims
Dims:
{Annotation} [ ]
{{Annotation} [ ]
}
TypeParameter:
{TypeParameterModifier} Identifier [TypeBound]
TypeParameterModifier:
Annotation
TypeBound:
extends
TypeVariable
extends
ClassOrInterfaceType {AdditionalBound}
AdditionalBound:
&
InterfaceType
TypeArguments:
<
TypeArgumentList >
TypeArgumentList:
TypeArgument {,
TypeArgument}
TypeArgument:
ReferenceType
Wildcard
Wildcard:
{Annotation} ?
[WildcardBounds]
WildcardBounds:
extends
ReferenceType
super
ReferenceType
TypeName:
Identifier
PackageOrTypeName .
Identifier
PackageOrTypeName:
Identifier
PackageOrTypeName .
Identifier
ExpressionName:
Identifier
AmbiguousName .
Identifier
MethodName:
Identifier
PackageName:
Identifier
PackageName .
Identifier
AmbiguousName:
Identifier
AmbiguousName .
Identifier
Productions from §7 (Packages)
CompilationUnit:
[PackageDeclaration] {ImportDeclaration} {TypeDeclaration}
PackageDeclaration:
{PackageModifier} package
Identifier {.
Identifier} ;
PackageModifier:
Annotation
ImportDeclaration:
SingleTypeImportDeclaration
TypeImportOnDemandDeclaration
SingleStaticImportDeclaration
StaticImportOnDemandDeclaration
SingleTypeImportDeclaration:
import
TypeName ;
TypeImportOnDemandDeclaration:
import
PackageOrTypeName . * ;
SingleStaticImportDeclaration:
import static
TypeName .
Identifier ;
StaticImportOnDemandDeclaration:
import static
TypeName . * ;
TypeDeclaration:
ClassDeclaration
InterfaceDeclaration
;
ClassDeclaration:
NormalClassDeclaration
EnumDeclaration
NormalClassDeclaration:
{ClassModifier} class
Identifier [TypeParameters]
[Superclass] [Superinterfaces] ClassBody
ClassModifier: one of
Annotation public protected private
abstract static final strictfp
TypeParameters:
<
TypeParameterList >
TypeParameterList:
TypeParameter {,
TypeParameter}
Superclass:
extends
ClassType
Superinterfaces:
implements
InterfaceTypeList
InterfaceTypeList:
InterfaceType {,
InterfaceType}
ClassBody:
{
{ClassBodyDeclaration} }
ClassBodyDeclaration:
ClassMemberDeclaration
InstanceInitializer
StaticInitializer
ConstructorDeclaration
ClassMemberDeclaration:
FieldDeclaration
MethodDeclaration
ClassDeclaration
InterfaceDeclaration
;
FieldDeclaration:
{FieldModifier} UnannType VariableDeclaratorList ;
FieldModifier: one of
Annotation public protected private
static final transient volatile
VariableDeclaratorList:
VariableDeclarator {,
VariableDeclarator}
VariableDeclarator:
VariableDeclaratorId [=
VariableInitializer]
VariableDeclaratorId:
Identifier [Dims]
VariableInitializer:
Expression
ArrayInitializer
UnannType:
UnannPrimitiveType
UnannReferenceType
UnannPrimitiveType:
NumericType
boolean
UnannReferenceType:
UnannClassOrInterfaceType
UnannTypeVariable
UnannArrayType
UnannClassOrInterfaceType:
UnannClassType
UnannInterfaceType
UnannClassType:
Identifier [TypeArguments]
UnannClassOrInterfaceType .
{Annotation} Identifier [TypeArguments]
UnannInterfaceType:
UnannClassType
UnannTypeVariable:
Identifier
UnannArrayType:
UnannPrimitiveType Dims
UnannClassOrInterfaceType Dims
UnannTypeVariable Dims
MethodDeclaration:
{MethodModifier} MethodHeader MethodBody
MethodModifier: one of
Annotation public protected private
abstract static final synchronized native strictfp
MethodHeader:
Result MethodDeclarator [Throws]
TypeParameters {Annotation} Result MethodDeclarator [Throws]
Result:
UnannType
void
MethodDeclarator:
Identifier (
[FormalParameterList] )
[Dims]
FormalParameterList:
FormalParameters ,
LastFormalParameter
LastFormalParameter
FormalParameters:
FormalParameter {,
FormalParameter}
ReceiverParameter {,
FormalParameter}
FormalParameter:
{VariableModifier} UnannType VariableDeclaratorId
VariableModifier: one of
Annotation final
LastFormalParameter:
{VariableModifier} UnannType {Annotation} ...
VariableDeclaratorId
FormalParameter
ReceiverParameter:
{Annotation} UnannType [Identifier .
] this
Throws:
throws
ExceptionTypeList
ExceptionTypeList:
ExceptionType {,
ExceptionType}
ExceptionType:
ClassType
TypeVariable
MethodBody:
Block
;
InstanceInitializer:
Block
StaticInitializer:
static
Block
ConstructorDeclaration:
{ConstructorModifier} ConstructorDeclarator [Throws] ConstructorBody
ConstructorModifier: one of
Annotation public protected private
ConstructorDeclarator:
[TypeParameters] SimpleTypeName (
[FormalParameterList] )
SimpleTypeName:
Identifier
ConstructorBody:
{
[ExplicitConstructorInvocation] [BlockStatements] }
ExplicitConstructorInvocation:
[TypeArguments] this (
[ArgumentList] ) ;
[TypeArguments] super (
[ArgumentList] ) ;
ExpressionName .
[TypeArguments] super (
[ArgumentList] ) ;
Primary .
[TypeArguments] super (
[ArgumentList] ) ;
EnumDeclaration:
{ClassModifier} enum
Identifier [Superinterfaces] EnumBody
EnumBody:
{
[EnumConstantList] [,
] [EnumBodyDeclarations] }
EnumConstantList:
EnumConstant {,
EnumConstant}
EnumConstant:
{EnumConstantModifier} Identifier [(
[ArgumentList] )
] [ClassBody]
EnumConstantModifier:
Annotation
EnumBodyDeclarations:
;
{ClassBodyDeclaration}
Productions from §9 (Interfaces)
InterfaceDeclaration:
NormalInterfaceDeclaration
AnnotationTypeDeclaration
NormalInterfaceDeclaration:
{InterfaceModifier} interface
Identifier [TypeParameters]
[ExtendsInterfaces] InterfaceBody
InterfaceModifier: one of
Annotation public protected private
abstract static strictfp
ExtendsInterfaces:
extends
InterfaceTypeList
InterfaceBody:
{
{InterfaceMemberDeclaration} }
InterfaceMemberDeclaration:
ConstantDeclaration
InterfaceMethodDeclaration
ClassDeclaration
InterfaceDeclaration
;
ConstantDeclaration:
{ConstantModifier} UnannType VariableDeclaratorList ;
ConstantModifier: one of
Annotation public
static final
InterfaceMethodDeclaration:
{InterfaceMethodModifier} MethodHeader MethodBody
InterfaceMethodModifier: one of
Annotation public
abstract default static strictfp
AnnotationTypeDeclaration:
{InterfaceModifier} @ interface
Identifier AnnotationTypeBody
AnnotationTypeBody:
{
{AnnotationTypeMemberDeclaration} }
AnnotationTypeMemberDeclaration:
AnnotationTypeElementDeclaration
ConstantDeclaration
ClassDeclaration
InterfaceDeclaration
;
AnnotationTypeElementDeclaration:
{AnnotationTypeElementModifier} UnannType Identifier ( )
[Dims]
[DefaultValue] ;
AnnotationTypeElementModifier: one of
Annotation public
abstract
DefaultValue:
default
ElementValue
Annotation:
NormalAnnotation
MarkerAnnotation
SingleElementAnnotation
NormalAnnotation:
@
TypeName (
[ElementValuePairList] )
ElementValuePairList:
ElementValuePair {,
ElementValuePair}
ElementValuePair:
Identifier =
ElementValue
ElementValue:
ConditionalExpression
ElementValueArrayInitializer
Annotation
ElementValueArrayInitializer:
{
[ElementValueList] [,
] }
ElementValueList:
ElementValue {,
ElementValue}
MarkerAnnotation:
@
TypeName
SingleElementAnnotation:
@
TypeName (
ElementValue )
ArrayInitializer:
{
[VariableInitializerList] [,
] }
VariableInitializerList:
VariableInitializer {,
VariableInitializer}
Productions from §14 (Blocks and Statements)
Block:
{
[BlockStatements] }
BlockStatements:
BlockStatement {BlockStatement}
BlockStatement:
LocalVariableDeclarationStatement
ClassDeclaration
Statement
LocalVariableDeclarationStatement:
LocalVariableDeclaration ;
LocalVariableDeclaration:
{VariableModifier} UnannType VariableDeclaratorList
Statement:
StatementWithoutTrailingSubstatement
LabeledStatement
IfThenStatement
IfThenElseStatement
WhileStatement
ForStatement
StatementNoShortIf:
StatementWithoutTrailingSubstatement
LabeledStatementNoShortIf
IfThenElseStatementNoShortIf
WhileStatementNoShortIf
ForStatementNoShortIf
StatementWithoutTrailingSubstatement:
Block
EmptyStatement
ExpressionStatement
AssertStatement
SwitchStatement
DoStatement
BreakStatement
ContinueStatement
ReturnStatement
SynchronizedStatement
ThrowStatement
TryStatement
EmptyStatement:
;
LabeledStatement:
Identifier :
Statement
LabeledStatementNoShortIf:
Identifier :
StatementNoShortIf
ExpressionStatement:
StatementExpression ;
StatementExpression:
Assignment
PreIncrementExpression
PreDecrementExpression
PostIncrementExpression
PostDecrementExpression
MethodInvocation
ClassInstanceCreationExpression
IfThenStatement:
if (
Expression )
Statement
IfThenElseStatement:
if (
Expression )
StatementNoShortIf else
Statement
IfThenElseStatementNoShortIf:
if (
Expression )
StatementNoShortIf else
StatementNoShortIf
AssertStatement:
assert
Expression ;
assert
Expression :
Expression ;
SwitchStatement:
switch (
Expression )
SwitchBlock
SwitchBlock:
{
{SwitchBlockStatementGroup} {SwitchLabel} }
SwitchBlockStatementGroup:
SwitchLabels BlockStatements
SwitchLabels:
SwitchLabel {SwitchLabel}
SwitchLabel:
case
ConstantExpression :
case
EnumConstantName :
default :
EnumConstantName:
Identifier
WhileStatement:
while (
Expression )
Statement
WhileStatementNoShortIf:
while (
Expression )
StatementNoShortIf
DoStatement:
do
Statement while (
Expression ) ;
ForStatement:
BasicForStatement
EnhancedForStatement
ForStatementNoShortIf:
BasicForStatementNoShortIf
EnhancedForStatementNoShortIf
BasicForStatement:
for (
[ForInit] ;
[Expression] ;
[ForUpdate] )
Statement
BasicForStatementNoShortIf:
for (
[ForInit] ;
[Expression] ;
[ForUpdate] )
StatementNoShortIf
ForInit:
StatementExpressionList
LocalVariableDeclaration
ForUpdate:
StatementExpressionList
StatementExpressionList:
StatementExpression {,
StatementExpression}
EnhancedForStatement:
for (
{VariableModifier} UnannType VariableDeclaratorId
:
Expression )
Statement
EnhancedForStatementNoShortIf:
for (
{VariableModifier} UnannType VariableDeclaratorId
:
Expression )
StatementNoShortIf
BreakStatement:
break
[Identifier] ;
ContinueStatement:
continue
[Identifier] ;
ReturnStatement:
return
[Expression] ;
ThrowStatement:
throw
Expression ;
SynchronizedStatement:
synchronized (
Expression )
Block
TryStatement:
try
Block Catches
try
Block [Catches] Finally
TryWithResourcesStatement
Catches:
CatchClause {CatchClause}
CatchClause:
catch (
CatchFormalParameter )
Block
CatchFormalParameter:
{VariableModifier} CatchType VariableDeclaratorId
CatchType:
UnannClassType {|
ClassType}
Finally:
finally
Block
TryWithResourcesStatement:
try
ResourceSpecification Block [Catches] [Finally]
ResourceSpecification:
(
ResourceList [;
] )
ResourceList:
Resource {;
Resource}
Resource:
{VariableModifier} UnannType VariableDeclaratorId =
Expression
Productions from §15 (Expressions)
Primary:
PrimaryNoNewArray
ArrayCreationExpression
PrimaryNoNewArray:
Literal
ClassLiteral
this
TypeName . this
(
Expression )
ClassInstanceCreationExpression
FieldAccess
ArrayAccess
MethodInvocation
MethodReference
ClassLiteral:
TypeName {[ ]
} . class
NumericType {[ ]
} . class
boolean
{[ ]
} . class
void . class
ClassInstanceCreationExpression:
UnqualifiedClassInstanceCreationExpression
ExpressionName .
UnqualifiedClassInstanceCreationExpression
Primary .
UnqualifiedClassInstanceCreationExpression
UnqualifiedClassInstanceCreationExpression:
new
[TypeArguments]
ClassOrInterfaceTypeToInstantiate (
[ArgumentList] )
[ClassBody]
ClassOrInterfaceTypeToInstantiate:
{Annotation} Identifier {.
{Annotation} Identifier}
[TypeArgumentsOrDiamond]
TypeArgumentsOrDiamond:
TypeArguments
<>
FieldAccess:
Primary .
Identifier
super .
Identifier
TypeName . super .
Identifier
ArrayAccess:
ExpressionName [
Expression ]
PrimaryNoNewArray [
Expression ]
MethodInvocation:
MethodName (
[ArgumentList] )
TypeName .
[TypeArguments] Identifier (
[ArgumentList] )
ExpressionName .
[TypeArguments] Identifier (
[ArgumentList] )
Primary .
[TypeArguments] Identifier (
[ArgumentList] )
super .
[TypeArguments] Identifier (
[ArgumentList] )
TypeName . super .
[TypeArguments] Identifier (
[ArgumentList] )
ArgumentList:
Expression {,
Expression}
MethodReference:
ExpressionName ::
[TypeArguments] Identifier
ReferenceType ::
[TypeArguments] Identifier
Primary ::
[TypeArguments] Identifier
super ::
[TypeArguments] Identifier
TypeName . super ::
[TypeArguments] Identifier
ClassType ::
[TypeArguments] new
ArrayType :: new
ArrayCreationExpression:
new
PrimitiveType DimExprs [Dims]
new
ClassOrInterfaceType DimExprs [Dims]
new
PrimitiveType Dims ArrayInitializer
new
ClassOrInterfaceType Dims ArrayInitializer
DimExprs:
DimExpr {DimExpr}
DimExpr:
{Annotation} [
Expression ]
Expression:
LambdaExpression
AssignmentExpression
LambdaExpression:
LambdaParameters ->
LambdaBody
LambdaParameters:
Identifier
(
[FormalParameterList] )
(
InferredFormalParameterList )
InferredFormalParameterList:
Identifier {,
Identifier}
LambdaBody:
Expression
Block
AssignmentExpression:
ConditionalExpression
Assignment
Assignment:
LeftHandSide AssignmentOperator Expression
LeftHandSide:
ExpressionName
FieldAccess
ArrayAccess
AssignmentOperator: one of
= *= /= %= += -= <<= >>= >>>=
&= ^= |=
ConditionalExpression:
ConditionalOrExpression
ConditionalOrExpression ?
Expression :
ConditionalExpression
ConditionalOrExpression ?
Expression :
LambdaExpression
ConditionalOrExpression:
ConditionalAndExpression
ConditionalOrExpression ||
ConditionalAndExpression
ConditionalAndExpression:
InclusiveOrExpression
ConditionalAndExpression &&
InclusiveOrExpression
InclusiveOrExpression:
ExclusiveOrExpression
InclusiveOrExpression |
ExclusiveOrExpression
ExclusiveOrExpression:
AndExpression
ExclusiveOrExpression ^
AndExpression
AndExpression:
EqualityExpression
AndExpression &
EqualityExpression
EqualityExpression:
RelationalExpression
EqualityExpression ==
RelationalExpression
EqualityExpression !=
RelationalExpression
RelationalExpression:
ShiftExpression
RelationalExpression <
ShiftExpression
RelationalExpression >
ShiftExpression
RelationalExpression <=
ShiftExpression
RelationalExpression >=
ShiftExpression
RelationalExpression instanceof
ReferenceType
ShiftExpression:
AdditiveExpression
ShiftExpression <<
AdditiveExpression
ShiftExpression >>
AdditiveExpression
ShiftExpression >>>
AdditiveExpression
AdditiveExpression:
MultiplicativeExpression
AdditiveExpression +
MultiplicativeExpression
AdditiveExpression -
MultiplicativeExpression
MultiplicativeExpression:
UnaryExpression
MultiplicativeExpression *
UnaryExpression
MultiplicativeExpression /
UnaryExpression
MultiplicativeExpression %
UnaryExpression
UnaryExpression:
PreIncrementExpression
PreDecrementExpression
+
UnaryExpression
-
UnaryExpression
UnaryExpressionNotPlusMinus
PreIncrementExpression:
++
UnaryExpression
PreDecrementExpression:
--
UnaryExpression
UnaryExpressionNotPlusMinus:
PostfixExpression
~
UnaryExpression
!
UnaryExpression
CastExpression
PostfixExpression:
Primary
ExpressionName
PostIncrementExpression
PostDecrementExpression
PostIncrementExpression:
PostfixExpression ++
PostDecrementExpression:
PostfixExpression --
CastExpression:
(
PrimitiveType )
UnaryExpression
(
ReferenceType {AdditionalBound} )
UnaryExpressionNotPlusMinus
(
ReferenceType {AdditionalBound} )
LambdaExpression
ConstantExpression:
Expression