BNF for Java1.1.jj

TOKENS

/* WHITE SPACE */
<DEFAULT> SKIP : {
" "
| "\t"
| "\n"
| "\r"
| "\f"
| "\u001a"
}

   
/* COMMENTS */
<DEFAULT> MORE : {
"/*" : IN_MULTI_LINE_COMMENT
}

   
<DEFAULT> SPECIAL : {
<SINGLE_LINE_COMMENT: "//"> : IN_SINGLE_LINE_COMMENT
}

   
<IN_SINGLE_LINE_COMMENT> SPECIAL : {
<SINGLE_LINE_COMMENT2: (~["\n","\r"])* ("\n" | "\r" | "\r\n")?> : DEFAULT
}

   
//
//SPECIAL_TOKEN :
//{
//    : DEFAULT
   //
   /*"\n" : DEFAULT
      | "\r" : DEFAULT
      | "\r\n" : DEFAULT
      | <~[]>*/
//}

//
//SPECIAL_TOKEN :
//{
//   : DEFAULT
//}
<IN_MULTI_LINE_COMMENT> SPECIAL : {
<END_OF_LINE_MULTI: "\n" | "\r" | "\r\n"> : IN_MULTI_LINE_COMMENT
| <MULTI_LINE_COMMENT: "*/"> : DEFAULT
}

   
//
<IN_SINGLE_LINE_COMMENT,IN_MULTI_LINE_COMMENT> MORE : {
<~[]>
}

   
/* RESERVED WORDS AND LITERALS */
<DEFAULT> TOKEN : {
<ABSTRACT: "abstract">
| <ASSERT: "assert">
| <BOOLEAN: "boolean">
| <BREAK: "break">
| <BYTE: "byte">
| <CASE: "case">
| <CATCH: "catch">
| <CHAR: "char">
| <CLASS: "class">
| <CONST: "const">
| <CONTINUE: "continue">
| <_DEFAULT: "default">
| <DO: "do">
| <DOUBLE: "double">
| <ELSE: "else">
| <ENUM: "enum">
| <EXTENDS: "extends">
| <FALSE: "false">
| <FINAL: "final">
| <FINALLY: "finally">
| <FLOAT: "float">
| <FOR: "for">
| <GOTO: "goto">
| <IF: "if">
| <IMPLEMENTS: "implements">
| <IMPORT: "import">
| <INSTANCEOF: "instanceof">
| <INT: "int">
| <INTERFACE: "interface">
| <LONG: "long">
| <NATIVE: "native">
| <NEW: "new">
| <NULL: "null">
| <PACKAGE: "package">
| <PRIVATE: "private">
| <PROTECTED: "protected">
| <PUBLIC: "public">
| <RETURN: "return">
| <SHORT: "short">
| <STATIC: "static">
| <TESTAAAA: "strictfp">
| <SUPER: "super">
| <SWITCH: "switch">
| <SYNCHRONIZED: "synchronized">
| <THIS: "this">
| <THROW: "throw">
| <THROWS: "throws">
| <TRANSIENT: "transient">
| <TRUE: "true">
| <TRY: "try">
| <VOID: "void">
| <VOLATILE: "volatile">
| <WHILE: "while">
}

   
/* LITERALS */
<DEFAULT> TOKEN : {
<INTEGER_LITERAL: <DECIMAL_LITERAL> (["l","L"])? | <HEX_LITERAL> (["l","L"])? | <OCTAL_LITERAL> (["l","L"])?>
| <#DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])*>
| <#HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+>
| <#OCTAL_LITERAL: "0" (["0"-"7"])*>
| <FLOATING_POINT_LITERAL: (["0"-"9"])+ "." (["0"-"9"])* (<EXPONENT>)? (["f","F","d","D"])? | "." (["0"-"9"])+ (<EXPONENT>)? (["f","F","d","D"])? | (["0"-"9"])+ <EXPONENT> (["f","F","d","D"])? | (["0"-"9"])+ (<EXPONENT>)? ["f","F","d","D"]>
| <#EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+>
| <CHARACTER_LITERAL: "\'" (~["\\","\n"] | "\\" (["n","t","b","r","f","\\","\'","\""] | ["0"-"7"] (["0"-"7"])? | ["0"-"3"] ["0"-"7"] ["0"-"7"])) "\'">
| <STRING_LITERAL: "\"" (~["\"","\\","\n","\r"] | "\\" (["n","t","b","r","f","\\","\'","\""] | ["0"-"7"] (["0"-"7"])? | ["0"-"3"] ["0"-"7"] ["0"-"7"]))* "\"">
}

   
/* IDENTIFIERS */
<DEFAULT> TOKEN : {
<IDENTIFIER: <LETTER> (<LETTER> | <DIGIT>)*>
| <#LETTER: ["$","A"-"Z","_","a"-"z","\u00a2"-"\u00a5","\u00aa","\u00b5","\u00ba","\u00c0"-"\u00d6","\u00d8"-"\u00f6","\u00f8"-"\u021f","\u0222"-"\u0233","\u0250"-"\u02ad","\u02b0"-"\u02b8","\u02bb"-"\u02c1","\u02d0"-"\u02d1","\u02e0"-"\u02e4","\u02ee","\u037a","\u0386","\u0388"-"\u038a","\u038c","\u038e"-"\u03a1","\u03a3"-"\u03ce","\u03d0"-"\u03d7","\u03da"-"\u03f3","\u0400"-"\u0481","\u048c"-"\u04c4","\u04c7"-"\u04c8","\u04cb"-"\u04cc","\u04d0"-"\u04f5","\u04f8"-"\u04f9","\u0531"-"\u0556","\u0559","\u0561"-"\u0587","\u05d0"-"\u05ea","\u05f0"-"\u05f2","\u0621"-"\u063a","\u0640"-"\u064a","\u0671"-"\u06d3","\u06d5","\u06e5"-"\u06e6","\u06fa"-"\u06fc","\u0710","\u0712"-"\u072c","\u0780"-"\u07a5","\u0905"-"\u0939","\u093d","\u0950","\u0958"-"\u0961","\u0985"-"\u098c","\u098f"-"\u0990","\u0993"-"\u09a8","\u09aa"-"\u09b0","\u09b2","\u09b6"-"\u09b9","\u09dc"-"\u09dd","\u09df"-"\u09e1","\u09f0"-"\u09f3","\u0a05"-"\u0a0a","\u0a0f"-"\u0a10","\u0a13"-"\u0a28","\u0a2a"-"\u0a30","\u0a32"-"\u0a33","\u0a35"-"\u0a36","\u0a38"-"\u0a39","\u0a59"-"\u0a5c","\u0a5e","\u0a72"-"\u0a74","\u0a85"-"\u0a8b","\u0a8d","\u0a8f"-"\u0a91","\u0a93"-"\u0aa8","\u0aaa"-"\u0ab0","\u0ab2"-"\u0ab3","\u0ab5"-"\u0ab9","\u0abd","\u0ad0","\u0ae0","\u0b05"-"\u0b0c","\u0b0f"-"\u0b10","\u0b13"-"\u0b28","\u0b2a"-"\u0b30","\u0b32"-"\u0b33","\u0b36"-"\u0b39","\u0b3d","\u0b5c"-"\u0b5d","\u0b5f"-"\u0b61","\u0b85"-"\u0b8a","\u0b8e"-"\u0b90","\u0b92"-"\u0b95","\u0b99"-"\u0b9a","\u0b9c","\u0b9e"-"\u0b9f","\u0ba3"-"\u0ba4","\u0ba8"-"\u0baa","\u0bae"-"\u0bb5","\u0bb7"-"\u0bb9","\u0c05"-"\u0c0c","\u0c0e"-"\u0c10","\u0c12"-"\u0c28","\u0c2a"-"\u0c33","\u0c35"-"\u0c39","\u0c60"-"\u0c61","\u0c85"-"\u0c8c","\u0c8e"-"\u0c90","\u0c92"-"\u0ca8","\u0caa"-"\u0cb3","\u0cb5"-"\u0cb9","\u0cde","\u0ce0"-"\u0ce1","\u0d05"-"\u0d0c","\u0d0e"-"\u0d10","\u0d12"-"\u0d28","\u0d2a"-"\u0d39","\u0d60"-"\u0d61","\u0d85"-"\u0d96","\u0d9a"-"\u0db1","\u0db3"-"\u0dbb","\u0dbd","\u0dc0"-"\u0dc6","\u0e01"-"\u0e30","\u0e32"-"\u0e33","\u0e3f"-"\u0e46","\u0e81"-"\u0e82","\u0e84","\u0e87"-"\u0e88","\u0e8a","\u0e8d","\u0e94"-"\u0e97","\u0e99"-"\u0e9f","\u0ea1"-"\u0ea3","\u0ea5","\u0ea7","\u0eaa"-"\u0eab","\u0ead"-"\u0eb0","\u0eb2"-"\u0eb3","\u0ebd","\u0ec0"-"\u0ec4","\u0ec6","\u0edc"-"\u0edd","\u0f00","\u0f40"-"\u0f47","\u0f49"-"\u0f6a","\u0f88"-"\u0f8b","\u1000"-"\u1021","\u1023"-"\u1027","\u1029"-"\u102a","\u1050"-"\u1055","\u10a0"-"\u10c5","\u10d0"-"\u10f6","\u1100"-"\u1159","\u115f"-"\u11a2","\u11a8"-"\u11f9","\u1200"-"\u1206","\u1208"-"\u1246","\u1248","\u124a"-"\u124d","\u1250"-"\u1256","\u1258","\u125a"-"\u125d","\u1260"-"\u1286","\u1288","\u128a"-"\u128d","\u1290"-"\u12ae","\u12b0","\u12b2"-"\u12b5","\u12b8"-"\u12be","\u12c0","\u12c2"-"\u12c5","\u12c8"-"\u12ce","\u12d0"-"\u12d6","\u12d8"-"\u12ee","\u12f0"-"\u130e","\u1310","\u1312"-"\u1315","\u1318"-"\u131e","\u1320"-"\u1346","\u1348"-"\u135a","\u13a0"-"\u13f4","\u1401"-"\u166c","\u166f"-"\u1676","\u1681"-"\u169a","\u16a0"-"\u16ea","\u1780"-"\u17b3","\u17db","\u1820"-"\u1877","\u1880"-"\u18a8","\u1e00"-"\u1e9b","\u1ea0"-"\u1ef9","\u1f00"-"\u1f15","\u1f18"-"\u1f1d","\u1f20"-"\u1f45","\u1f48"-"\u1f4d","\u1f50"-"\u1f57","\u1f59","\u1f5b","\u1f5d","\u1f5f"-"\u1f7d","\u1f80"-"\u1fb4","\u1fb6"-"\u1fbc","\u1fbe","\u1fc2"-"\u1fc4","\u1fc6"-"\u1fcc","\u1fd0"-"\u1fd3","\u1fd6"-"\u1fdb","\u1fe0"-"\u1fec","\u1ff2"-"\u1ff4","\u1ff6"-"\u1ffc","\u203f"-"\u2040","\u207f","\u20a0"-"\u20af","\u2102","\u2107","\u210a"-"\u2113","\u2115","\u2119"-"\u211d","\u2124","\u2126","\u2128","\u212a"-"\u212d","\u212f"-"\u2131","\u2133"-"\u2139","\u2160"-"\u2183","\u3005"-"\u3007","\u3021"-"\u3029","\u3031"-"\u3035","\u3038"-"\u303a","\u3041"-"\u3094","\u309d"-"\u309e","\u30a1"-"\u30fe","\u3105"-"\u312c","\u3131"-"\u318e","\u31a0"-"\u31b7","\u3400"-"\u4db5","\u4e00"-"\u9fa5","\ua000"-"\ua48c","\uac00"-"\ud7a3","\uf900"-"\ufa2d","\ufb00"-"\ufb06","\ufb13"-"\ufb17","\ufb1d","\ufb1f"-"\ufb28","\ufb2a"-"\ufb36","\ufb38"-"\ufb3c","\ufb3e","\ufb40"-"\ufb41","\ufb43"-"\ufb44","\ufb46"-"\ufbb1","\ufbd3"-"\ufd3d","\ufd50"-"\ufd8f","\ufd92"-"\ufdc7","\ufdf0"-"\ufdfb","\ufe33"-"\ufe34","\ufe4d"-"\ufe4f","\ufe69","\ufe70"-"\ufe72","\ufe74","\ufe76"-"\ufefc","\uff04","\uff21"-"\uff3a","\uff3f","\uff41"-"\uff5a","\uff65"-"\uffbe","\uffc2"-"\uffc7","\uffca"-"\uffcf","\uffd2"-"\uffd7","\uffda"-"\uffdc","\uffe0"-"\uffe1","\uffe5"-"\uffe6"]>
| <#DIGIT: ["0"-"9","\u0660"-"\u0669","\u06f0"-"\u06f9","\u0966"-"\u096f","\u09e6"-"\u09ef","\u0a66"-"\u0a6f","\u0ae6"-"\u0aef","\u0b66"-"\u0b6f","\u0be7"-"\u0bef","\u0c66"-"\u0c6f","\u0ce6"-"\u0cef","\u0d66"-"\u0d6f","\u0e50"-"\u0e59","\u0ed0"-"\u0ed9","\u1040"-"\u1049"]>
}

   
/* SEPARATORS */
<DEFAULT> TOKEN : {
<LPAREN: "(">
| <RPAREN: ")">
| <LBRACE: "{">
| <RBRACE: "}">
| <LBRACKET: "[">
| <RBRACKET: "]">
| <SEMICOLON: ";">
| <COMMA: ",">
| <DOT: ".">
| <AT: "@">
}

   
/* OPERATORS */
<DEFAULT> TOKEN : {
<ASSIGN: "=">
| <GT: ">">
| <LT: "<">
| <BANG: "!">
| <TILDE: "~">
| <HOOK: "?">
| <COLON: ":">
| <EQ: "==">
| <LE: "<=">
| <GE: ">=">
| <NE: "!=">
| <SC_OR: "||">
| <SC_AND: "&&">
| <INCR: "++">
| <DECR: "--">
| <PLUS: "+">
| <MINUS: "-">
| <STAR: "*">
| <SLASH: "/">
| <BIT_AND: "&">
| <BIT_OR: "|">
| <XOR: "^">
| <REM: "%">
| <LSHIFT: "<<">
| <PLUSASSIGN: "+=">
| <MINUSASSIGN: "-=">
| <STARASSIGN: "*=">
| <SLASHASSIGN: "/=">
| <ANDASSIGN: "&=">
| <ORASSIGN: "|=">
| <XORASSIGN: "^=">
| <REMASSIGN: "%=">
| <LSHIFTASSIGN: "<<=">
| <RSIGNEDSHIFTASSIGN: ">>=">
| <RUNSIGNEDSHIFTASSIGN: ">>>=">
| <ELLIPSIS: "...">
}

   

NON-TERMINALS

/*****************************************
 * THE JAVA LANGUAGE GRAMMAR STARTS HERE *
 *****************************************/

/*
 * Program structuring syntax follows.
 */
CompilationUnit ::= ( PackageDeclaration )? ( ImportDeclaration )* ( TypeDeclaration )* ( ( PackageDeclaration | ( ImportDeclaration ) ) ( ImportDeclaration )* ( TypeDeclaration )+ )* <EOF>
ImportUnit ::= ( PackageDeclaration )? ( ImportDeclaration )* ( "abstract" | "final" | "public" | "synchronized" | "strictfp" )* ( "class" | "interface" )
PackageDeclaration ::= ( Annotation )* "package" Name ";"
ImportDeclaration ::= "import" ( "static" )? Name ( "." "*" )? ";"
TypeDeclaration ::= ClassDeclaration
| Modifiers EnumDeclaration
| InterfaceDeclaration
| Modifiers AnnotationTypeDeclaration
| ";"
/*
 * Declaration syntax follows.
 */
ClassDeclaration ::= ( Annotation )? ( Annotation )* ( "abstract" | "final" | "public" | "synchronized" | "strictfp" )* UnmodifiedClassDeclaration
UnmodifiedClassDeclaration ::= Modifiers "class" Identifier ( TypeParameters )? ( "extends" Name ( TypeArguments )? ( "." Name ( TypeArguments )? )* )? ( "implements" NameList )? ClassBody
ClassBody ::= "{" ( ClassBodyDeclaration )* "}"
NestedClassDeclaration ::= ( Annotation )? ( Annotation )* ( "static" | "abstract" | "final" | "public" | "protected" | "private" | "strictfp" )* UnmodifiedClassDeclaration
ClassBodyDeclaration ::= EmptyStatement
| Initializer
| Modifiers AnnotationTypeDeclaration
| CreationAnnotation
| NestedClassDeclaration
| Modifiers NestedInterfaceDeclaration
| Modifiers EnumDeclaration
| ConstructorDeclaration
| MethodDeclaration
| ( Annotation )* FieldDeclaration
// This production is to determine lookahead only.
MethodDeclarationLookahead ::= ( Annotation )* ( "public" | "protected" | "private" | "static" | "abstract" | "final" | "native" | "synchronized" | "strictfp" )* ( Annotation )* ( TypeParameters )? ResultType Identifier "("
InterfaceDeclaration ::= ( Annotation )? ( Annotation )* ( "strictfp" | "abstract" | "public" )* UnmodifiedInterfaceDeclaration
NestedInterfaceDeclaration ::= ( Annotation )? ( Annotation )* ( "static" | "abstract" | "final" | "public" | "protected" | "private" | "strictfp" )* UnmodifiedInterfaceDeclaration
UnmodifiedInterfaceDeclaration ::= "interface" Identifier ( TypeParameters )? ( "extends" NameList )? "{" ( InterfaceMemberDeclaration )* "}"
InterfaceMemberDeclaration ::= EmptyStatement
| NestedClassDeclaration
| NestedInterfaceDeclaration
| Modifiers EnumDeclaration
| MethodDeclaration
| Modifiers FieldDeclaration
FieldDeclaration ::= ( "public" | "protected" | "private" | "static" | "final" | "transient" | "volatile" )* ( Annotation )* Type VariableDeclarator ( "," VariableDeclarator )* ";"
VariableDeclarator ::= VariableDeclaratorId ( "=" VariableInitializer )?
VariableDeclaratorId ::= ( "enum" | Identifier ) ( "[" "]" )*
VariableInitializer ::= ArrayInitializer
| Expression
ArrayInitializer ::= "{" ( VariableInitializer ( "," VariableInitializer )* )? ( "," )? "}"
MethodDeclaration ::= ( Annotation )* ( "public" | "protected" | "private" | "static" | "abstract" | "final" | "native" | "synchronized" | "strictfp" )* ( Annotation )* ( TypeParameters )? ResultType MethodDeclarator ( "throws" NameList )? ( Block | ";" )
MethodDeclarator ::= Identifier FormalParameters ( "[" "]" )*
FormalParameters ::= "(" ( FormalParameter ( "," FormalParameter )* )? ")"
FormalParameter ::= Modifiers Type ( "..." )? VariableDeclaratorId
ConstructorDeclaration ::= ( Annotation )* ( "public" | "protected" | "private" )? ( TypeParameters )? Identifier FormalParameters ( "throws" NameList )? "{" ( ExplicitConstructorInvocation )? ( ExplicitConstructorInvocation )? ( BlockStatement )* "}"
ExplicitConstructorInvocation ::= "this" Arguments ";"
| ( PrimaryExpression "." )? "super" Arguments ";"
Initializer ::= ( "static" )? Block
/*
 * Type, name and expression syntax follows.
 */
Type ::= ReferenceType
| PrimitiveType
/*
ccl 2008-01-24
{
  ( PrimitiveType()
          {
                  _sName = getToken(0).image;
          }
    | Name()
    [TypeArguments() ["." Identifier()] ]
) ( "[" "]" { _sName += "[]"; } )*
}
*/

/*
 * Takes special consideration for assert.
 */
FieldTypeLookahead ::= ( PrimitiveType | FieldTypeNameLookahead ) ( "[" "]" )*
PrimitiveType ::= "boolean"
| "char"
| "byte"
| "short"
| "int"
| "long"
| "float"
| "double"
ResultType ::= "void"
| Type
Name ::= ( "enum" | Identifier ) ( "." ( "enum" | Identifier ) )*
/**
 * Takes special consideration for assert.
 */
FieldTypeNameLookahead ::= <IDENTIFIER> ( "." Identifier )*
NameList ::= Name ( TypeArguments )? ( "," Name ( TypeArguments )? )*
/*
 * Expression syntax follows.
 */
Expression ::= Assignment
| ConditionalExpression
Assignment ::= PrimaryExpression AssignmentOperator Expression
AssignmentOperator ::= "="
| "*="
| "/="
| "%="
| "+="
| "-="
| "<<="
| ">>="
| ">>>="
| "&="
| "^="
| "|="
ConditionalExpression ::= ConditionalOrExpression ( "?" Expression ":" ConditionalExpression )?
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 ( ( "<<" | ( ">" ">" ) ( ">" )? ) AdditiveExpression )*
AdditiveExpression ::= MultiplicativeExpression ( ( "+" | "-" ) MultiplicativeExpression )*
MultiplicativeExpression ::= UnaryExpression ( ( "*" | "/" | "%" ) UnaryExpression )*
UnaryExpression ::= ( "+" | "-" ) UnaryExpression
| PreIncrementExpression
| PreDecrementExpression
| UnaryExpressionNotPlusMinus
PreIncrementExpression ::= "++" PrimaryExpression
PreDecrementExpression ::= "--" PrimaryExpression
UnaryExpressionNotPlusMinus ::= ( "~" | "!" ) UnaryExpression
| CastExpression
| PostfixExpression
// This production is to determine lookahead only.  The LOOKAHEAD specifications
// below are not used, but they are there just to indicate that we know about
// this.
CastLookahead ::= "(" PrimitiveType
| "(" Type "[" "]"
| "(" Type ")" ( "~" | "!" | "(" | Identifier | "this" | "super" | "new" | Literal )
// To fix bug Test48.java. Clemens [2000-10-03]
PostfixLookahead ::= "(" Name ( "[" "]" )* "."
PostfixExpression ::= PrimaryExpression ( "++" | "--" )?
CastExpression ::= "(" Type ")" UnaryExpression
| "(" Type ")" UnaryExpressionNotPlusMinus
PrimaryExpression ::= PrimaryPrefix ( PrimarySuffix )*
PrimaryPrefix ::= Literal
| "this" ( "." )? ( Identifier )?
| "super" ( "." )? ( Identifier )?
| "(" Expression ")"
| AllocationExpression
| ResultType "." "class"
| Name ( "." "super" "." Identifier )?
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" Name ( TypeArguments )? ( ArrayDimsAndInits | Arguments ( ClassBody )? )
/*
 * The third LOOKAHEAD specification below is to parse to PrimarySuffix
 * if there is an expression between the "[...]".
 */
ArrayDimsAndInits ::= ( "[" Expression "]" )+ ( "[" "]" )*
| ( "[" "]" )+ ArrayInitializer
/*
 * Statement syntax follows.
 */
Statement ::= LabeledStatement
| AssertStatement
| Block
| EmptyStatement
| StatementExpression ";"
| SwitchStatement
| IfStatement
| WhileStatement
| DoStatement
| ForStatement
| BreakStatement
| ContinueStatement
| ReturnStatement
| ThrowStatement
| SynchronizedStatement
| TryStatement
LabeledStatement ::= Identifier ":" Statement
AssertStatementLookahead ::= <ASSERT> Expression
AssertStatement ::= <ASSERT> Expression ( ":" Expression )? ";"
Block ::= "{" ( BlockStatement )* "}"
BlockStatement ::= LocalVariableDeclaration ";"
| Statement
| UnmodifiedClassDeclaration
| UnmodifiedInterfaceDeclaration
/*void LocalVariableDeclaration() :
{}
{
  [ "final" ] Type() VariableDeclarator() ( "," VariableDeclarator() )*
}*/
LocalVariableDeclaration ::= Modifiers 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" "(" ( Modifiers 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 )?
Identifier ::= <IDENTIFIER>
| <ASSERT>
/* Annotation syntax follows. */
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 )* ( "," )? "}"
/*
 =================================================
 Java 1.5 stuff starts here
 =================================================
*/

/* Annotation Types. */

//Added by REYNAUD Sebastien (LOGICA)
CreationAnnotation ::= "@" "interface" <IDENTIFIER> "{" ( AnnotationTypeMemberDeclaration )* "}"
//
AnnotationTypeDeclaration ::= "@" "interface" <IDENTIFIER> AnnotationTypeBody
AnnotationTypeBody ::= "{" ( AnnotationTypeMemberDeclaration )* "}"
AnnotationTypeMemberDeclaration ::= Modifiers ( Type <IDENTIFIER> "(" ")" ( DefaultValue )? ";" | ClassOrInterfaceDeclaration | EnumDeclaration | AnnotationTypeDeclaration | FieldDeclaration15 )
| ( ";" )
DefaultValue ::= "default" MemberValue
/*
 * Modifiers. We match all modifiers in a single rule to reduce the chances of
 * syntax errors for simple modifier mistakes. It will also enable us to give
 * better error messages.
 */
Modifiers ::= ( ( "public" | "static" | "protected" | "private" | "final" | "abstract" | "synchronized" | "native" | "transient" | "volatile" | "strictfp" | Annotation ) )*
ClassOrInterfaceDeclaration ::= ( "class" | "interface" ) <IDENTIFIER> ( TypeParameters )? ( ExtendsList )? ( ImplementsList )? ClassOrInterfaceBody
EnumDeclaration ::= "enum" <IDENTIFIER> ( ImplementsList )? EnumBody
TypeParameters ::= "<" TypeParameter ( "," TypeParameter )* ">"
ExtendsList ::= "extends" ClassOrInterfaceType ( "," ClassOrInterfaceType )*
ImplementsList ::= "implements" ClassOrInterfaceType ( "," ClassOrInterfaceType )*
ClassOrInterfaceBody ::= "{" ( ClassOrInterfaceBodyDeclaration )* "}"
EnumBody ::= "{" ( EnumConstant ( "," EnumConstant )* )? ( "," )? ( ";" ( ClassOrInterfaceBodyDeclaration )* )? "}"
TypeParameter ::= <IDENTIFIER> ( TypeBound )?
ClassOrInterfaceType ::= <IDENTIFIER> ( TypeArguments )? ( "." <IDENTIFIER> ( TypeArguments )? )*
ClassOrInterfaceBodyDeclaration ::= Initializer
| Modifiers ( ClassOrInterfaceDeclaration | EnumDeclaration | ConstructorDeclaration | FieldDeclaration15 | MethodDeclaration15 )
| ";"
EnumConstant ::= Modifiers <IDENTIFIER> ( Arguments )? ( ClassOrInterfaceBody )?
TypeBound ::= "extends" ClassOrInterfaceType ( "&" ClassOrInterfaceType )*
TypeArguments ::= "<" TypeArgument ( "," TypeArgument )* ">"
TypeArgument ::= ReferenceType
| "?" ( WildcardBounds )?
ReferenceType ::= PrimitiveType ( "[" "]" )+
| ( ClassOrInterfaceType ) ( "[" "]" )*
WildcardBounds ::= "extends" ReferenceType
| "super" ReferenceType
FieldDeclaration15 ::= Type VariableDeclarator ( "," VariableDeclarator )* ";"
MethodDeclaration15 ::= MethodDeclaration
MethodDeclarator15 ::= <IDENTIFIER> FormalParameters ( "[" "]" )*
FormalParameters15 ::= "(" ( FormalParameter15 ( "," FormalParameter15 )* )? ")"
FormalParameter15 ::= Modifiers Type ( "..." )? VariableDeclaratorId
MemberSelector ::= "." TypeArguments <IDENTIFIER>