CompilationUnit ::= ( PackageDeclaration )? ( ImportDeclaration )* ( TypeDeclaration )* <EOF> ;
PackageDeclaration ::= "package" Name ";";
ImportDeclaration ::= "import" ( "static" )? Name ( "." "*" )? ";";
Modifiers ::= ( ( "public" | "static" | "protected" | "private" | "final" | "abstract" | "synchronized" | "native" | "transient" | "volatile" | "strictfp" | Annotation ) )*;
TypeDeclaration ::= ( ";" | Modifiers ( ClassOrInterfaceDeclaration | EnumDeclaration | AnnotationTypeDeclaration ) );
ClassOrInterfaceDeclaration ::= ( "class" | "interface" ) <IDENTIFIER> ( TypeParameters )? ( ExtendsList )? ( ImplementsList )? ClassOrInterfaceBody;
ExtendsList ::= "extends" ClassOrInterfaceType ( "," ClassOrInterfaceType )*;
ImplementsList ::= "implements" ClassOrInterfaceType ( "," ClassOrInterfaceType )*;
EnumDeclaration ::= "enum" <IDENTIFIER> ( ImplementsList )? EnumBody;
EnumBody ::= "{" EnumConstant ( "," EnumConstant )* ( ";" ( ClassOrInterfaceBodyDeclaration )* )? "}";
EnumConstant ::= <IDENTIFIER> ( Arguments )? ( ClassOrInterfaceBody )?;
TypeParameters ::= "<" TypeParameter ( "," TypeParameter )* ">";
TypeParameter ::= <IDENTIFIER> ( TypeBound )?;
TypeBound ::= "extends" ClassOrInterfaceType ( "&" ClassOrInterfaceType )*;
ClassOrInterfaceBody ::= "{" ( ClassOrInterfaceBodyDeclaration )* "}";
ClassOrInterfaceBodyDeclaration ::= ( Initializer | Modifiers ( ClassOrInterfaceDeclaration | EnumDeclaration | ConstructorDeclaration | FieldDeclaration | MethodDeclaration ) | ";" );
FieldDeclaration ::= Type VariableDeclarator ( "," VariableDeclarator )* ";";
VariableDeclarator ::= VariableDeclaratorId ( "=" VariableInitializer )?;
VariableDeclaratorId ::= <IDENTIFIER> ( "[" "]" )*;
VariableInitializer ::= ( ArrayInitializer | Expression );
ArrayInitializer ::= "{" ( VariableInitializer ( "," VariableInitializer )* )? ( "," )? "}";
MethodDeclaration ::= ( TypeParameters )? ResultType MethodDeclarator ( "throws" NameList )? ( Block | ";" );
MethodDeclarator ::= <IDENTIFIER> FormalParameters ( "[" "]" )*;
FormalParameters ::= "(" ( FormalParameter ( "," FormalParameter )* )? ")";
FormalParameter ::= ( "final" )? Type ( "..." )? VariableDeclaratorId;
ConstructorDeclaration ::= ( TypeParameters )? <IDENTIFIER> FormalParameters ( "throws" NameList )? "{" ( ExplicitConstructorInvocation )? ( BlockStatement )* "}";
ExplicitConstructorInvocation ::= ( "this" Arguments ";" | ( PrimaryExpression "." )? "super" Arguments ";" );
Initializer ::= ( "static" )? Block;
Type ::= ( ReferenceType | PrimitiveType );
ReferenceType ::= ( PrimitiveType ( "[" "]" )+ | ( ClassOrInterfaceType ) ( "[" "]" )* );
ClassOrInterfaceType ::= <IDENTIFIER> ( TypeArguments )? ( "." <IDENTIFIER> ( TypeArguments )? )*;
TypeArguments ::= "<" TypeArgument ( "," TypeArgument )* ">";
TypeArgument ::= ( ReferenceType | "?" ( WildcardBounds )? );
WildcardBounds ::= ( "extends" ReferenceType | "super" ReferenceType );
PrimitiveType ::= ( "boolean" | "char" | "byte" | "short" | "int" | "long" | "float" | "double" );
ResultType ::= ( "void" | Type );
Name ::= <IDENTIFIER> ( "." <IDENTIFIER> )*;
NameList ::= Name ( "," Name )*;
Expression ::= ConditionalExpression ( AssignmentOperator Expression )?;
AssignmentOperator ::= ( "=" | "*=" | "/=" | "%=" | "+=" | "-=" | "<<=" | ">>=" | ">>>=" | "&=" | "^=" | "|=" );
ConditionalExpression ::= ConditionalOrExpression ( "?" Expression ":" Expression )?;
ConditionalOrExpression ::= ConditionalAndExpression ( "||" ConditionalAndExpression )*;
ConditionalAndExpression ::= InclusiveOrExpression ( "&&" InclusiveOrExpression )*;
InclusiveOrExpression ::= ExclusiveOrExpression ( "|" ExclusiveOrExpression )*;
ExclusiveOrExpression ::= AndExpression ( "^" AndExpression )*;
AndExpression ::= EqualityExpression ( "&" EqualityExpression )*;
EqualityExpression ::= InstanceOfExpression ( ( "==" | "!=" ) InstanceOfExpression )*;
InstanceOfExpression ::= RelationalExpression ( "instanceof" Type )?;
RelationalExpression ::= ShiftExpression ( ( "<" | ">" | "<=" | ">=" ) ShiftExpression )*;
ShiftExpression ::= AdditiveExpression ( ( "<<" | RSIGNEDSHIFT | RUNSIGNEDSHIFT ) AdditiveExpression )*;
AdditiveExpression ::= MultiplicativeExpression ( ( "+" | "-" ) MultiplicativeExpression )*;
MultiplicativeExpression ::= UnaryExpression ( ( "*" | "/" | "%" ) UnaryExpression )*;
UnaryExpression ::= ( ( "+" | "-" ) UnaryExpression | PreIncrementExpression | PreDecrementExpression | UnaryExpressionNotPlusMinus );
PreIncrementExpression ::= "++" PrimaryExpression;
PreDecrementExpression ::= "--" PrimaryExpression;
UnaryExpressionNotPlusMinus ::= ( ( "~" | "!" ) UnaryExpression | CastExpression | PostfixExpression );
CastLookahead ::= ( "(" PrimitiveType | "(" Type "[" "]" | "(" Type ")" ( "~" | "!" | "(" | <IDENTIFIER> | "this" | "super" | "new" | Literal ) );
PostfixExpression ::= PrimaryExpression ( "++" | "--" )?;
CastExpression ::= ( "(" Type ")" UnaryExpression | "(" Type ")" UnaryExpressionNotPlusMinus );
PrimaryExpression ::= PrimaryPrefix ( PrimarySuffix )*;
MemberSelector ::= "." TypeArguments <IDENTIFIER>;
PrimaryPrefix ::= ( Literal | "this" | "super" "." <IDENTIFIER> | "(" Expression ")" | AllocationExpression | ResultType "." "class" | Name );
PrimarySuffix ::= ( "." "this" | "." AllocationExpression | MemberSelector | "[" Expression "]" | "." <IDENTIFIER> | Arguments );
Literal ::= ( <INTEGER_LITERAL> | <FLOATING_POINT_LITERAL> | <CHARACTER_LITERAL> | <STRING_LITERAL> | BooleanLiteral | NullLiteral );
BooleanLiteral ::= ( "true" | "false" );
NullLiteral ::= "null";
Arguments ::= "(" ( ArgumentList )? ")";
ArgumentList ::= Expression ( "," Expression )*;
AllocationExpression ::= ( "new" PrimitiveType ArrayDimsAndInits | "new" ClassOrInterfaceType ( TypeArguments )? ( ArrayDimsAndInits | Arguments ( ClassOrInterfaceBody )? ) );
ArrayDimsAndInits ::= ( ( "[" Expression "]" )+ ( "[" "]" )* | ( "[" "]" )+ ArrayInitializer );
Statement ::= ( LabeledStatement | AssertStatement | Block | EmptyStatement | StatementExpression ";" | SwitchStatement | IfStatement | WhileStatement | DoStatement | ForStatement | BreakStatement | ContinueStatement | ReturnStatement | ThrowStatement | SynchronizedStatement | TryStatement );
AssertStatement ::= "assert" Expression ( ":" Expression )? ";";
LabeledStatement ::= <IDENTIFIER> ":" Statement;
Block ::= "{" ( BlockStatement )* "}";
BlockStatement ::= ( LocalVariableDeclaration ";" | Statement | ClassOrInterfaceDeclaration );
LocalVariableDeclaration ::= ( "final" )? Type VariableDeclarator ( "," VariableDeclarator )*;
EmptyStatement ::= ";";
StatementExpression ::= ( PreIncrementExpression | PreDecrementExpression | PrimaryExpression ( "++" | "--" | AssignmentOperator Expression )? );
SwitchStatement ::= "switch" "(" Expression ")" "{" ( SwitchLabel ( BlockStatement )* )* "}";
SwitchLabel ::= ( "case" Expression ":" | "default" ":" );
IfStatement ::= "if" "(" Expression ")" Statement ( "else" Statement )?;
WhileStatement ::= "while" "(" Expression ")" Statement;
DoStatement ::= "do" Statement "while" "(" Expression ")" ";";
ForStatement ::= "for" "(" ( Type <IDENTIFIER> ":" Expression | ( ForInit )? ";" ( Expression )? ";" ( ForUpdate )? ) ")" Statement;
ForInit ::= ( LocalVariableDeclaration | StatementExpressionList );
StatementExpressionList ::= StatementExpression ( "," StatementExpression )*;
ForUpdate ::= StatementExpressionList;
BreakStatement ::= "break" ( <IDENTIFIER> )? ";";
ContinueStatement ::= "continue" ( <IDENTIFIER> )? ";";
ReturnStatement ::= "return" ( Expression )? ";";
ThrowStatement ::= "throw" Expression ";";
SynchronizedStatement ::= "synchronized" "(" Expression ")" Block;
TryStatement ::= "try" Block ( "catch" "(" FormalParameter ")" Block )* ( "finally" Block )?;
RUNSIGNEDSHIFT ::= ( ">" ">" ">" );
RSIGNEDSHIFT ::= ( ">" ">" );
Annotation ::= ( NormalAnnotation | SingleMemberAnnotation | MarkerAnnotation );
NormalAnnotation ::= "@" Name "(" ( MemberValuePairs )? ")";
MarkerAnnotation ::= "@" Name;
SingleMemberAnnotation ::= "@" Name "(" MemberValue ")";
MemberValuePairs ::= MemberValuePair ( "," MemberValuePair )*;
MemberValuePair ::= <IDENTIFIER> "=" MemberValue;
MemberValue ::= ( Annotation | MemberValueArrayInitializer | ConditionalExpression );
MemberValueArrayInitializer ::= "{" MemberValue ( "," MemberValue )* ( "," )? "}";
AnnotationTypeDeclaration ::= "@" "interface" <IDENTIFIER> AnnotationTypeBody;
AnnotationTypeBody ::= "{" ( AnnotationTypeMemberDeclaration )* "}";
AnnotationTypeMemberDeclaration ::= ( Modifiers ( Type <IDENTIFIER> "(" ")" ( DefaultValue )? ";" | ClassOrInterfaceDeclaration | EnumDeclaration | AnnotationTypeDeclaration | FieldDeclaration ) | ( ";" ) );
DefaultValue ::= "default" MemberValue;