BNF rules of JAVA

compilation_unit  = 
 [ package_statement ] 
 < import_statement > 
 < type_declaration >  . 

package_statement  = 
 "package" package_name  ";"  . 

import_statement  = 
 "import"  (  ( package_name  "."  "*"  ";"  ) 
 /  ( class_name  / interface_name )  )  ";"  . 

type_declaration  = 
 [ doc_comment ]  ( class_declaration  / interface_declaration )  ";"  . 

doc_comment  =  "/**"  "... text ..."  "*/"  . 

class_declaration  = 
 < modifier >  "class" identifier 
 [  "extends" class_name ] 
 [  "implements" interface_name  <  "," interface_name >  ] 
 "{"  < field_declaration >  "}"  . 

interface_declaration  = 
 < modifier >  "interface" identifier 
 [  "extends" interface_name  <  "," interface_name >  ] 
 "{"  < field_declaration >  "}"  . 

field_declaration  = 
 (  [ doc_comment ]  ( method_declaration 
 / constructor_declaration 
 / variable_declaration )  ) 
 / static_initializer 
 /  ";"  . 

method_declaration  = 
 < modifier > type identifier 
 "("  [ parameter_list ]  ")"  <  "["  "]"  > 
 ( statement_block  /  ";"  )  . 

constructor_declaration  = 
 < modifier > identifier  "("  [ parameter_list ]  ")" 
statement_block  . 

statement_block  =  "{"  < statement >  "}"  . 

variable_declaration  = 
 < modifier > type variable_declarator 
 <  "," variable_declarator  >  ";"  . 

variable_declarator  = 
 identifier  <  "["  "]"  >  [  "=" variable_initializer ]  . 

variable_initializer  = 
expression 
 /  (  "{"  [ variable_initializer 
 <  "," variable_initializer  >  [  ","  ]  ]  "}"  )  . 

static_initializer  = 
 "static" statement_block  . 

parameter_list  = 
parameter  <  "," parameter >  . 

parameter  = 
type identifier  <  "["  "]"  >  . 

statement  = 
variable_declaration 
 /  ( expression  ";"  ) 
 /  ( statement_block ) 
 /  ( if_statement ) 
 /  ( do_statement ) 
 /  ( while_statement ) 
 /  ( for_statement ) 
 /  ( try_statement ) 
 /  ( switch_statement ) 
 /  (  "synchronized"  "(" expression  ")" statement  ) 
 /  (  "return"  [ expression ]  ";"  ) 
 /  (  "throw" expression ";"  ) 
 /  ( identifier  ":" statement ) 
 /  (  "break"  [ identifier ]  ";"  ) 
 /  (  "continue"  [ identifier ]  ";"  ) 
 /  (  ";"  )  . 

if_statement = 
 "if"  "(" expression  ")" statement 
 [  "else" statement ]  . 

do_statement = 
 "do" statement  "while"  "(" expression  ")"  ";"  . 

while_statement = 
 "while"  "(" expression  ")" statement  . 

for_statement = 
 "for"  "("  ( variable_declaration  /  ( expression  ";"  )  /  ";"  ) 
 [ expression ]  ";" 
 [ expression ]  ";" 
 ")" statement  . 

try_statement = 
 "try" statement 
 <  "catch"  "(" parameter  ")" statement > 
 [  "finally" statement ]  . 

switch_statement = 
 "switch"  "(" expression  ")"  "{" 
 <  (  "case" expression  ":"  ) 
 /  (  "default"  ":"  ) 
 / statement > 
 "}"  . 

expression  = 
numeric_expression 
 / testing_expression 
 / logical_expression 
 / string_expression 
 / bit_expression 
 / casting_expression 
 / creating_expression 
 / literal_expression 
 /  "null" 
 /  "super" 
 /  "this" 
 / identifier 
 /  (  "(" expression  ")"  ) 
 /  ( expression 
 (  (  "("  [ arglist ]  ")"  ) 
 /  (  "[" expression  "]"  ) 
 /  (  "." expression  ) 
 /  (  "," expression  ) 
 /  (  "instanceof"  ( class_name / interface_name )  ) 
 )  )  . 

numeric_expression  = 
 (  (  "-" 
 /  "++" 
 /  "--"  ) 
expression ) 
 /  ( expression 
 (  "++" 
 /  "--"  )  ) 
 /  ( expression 
 (  "+" 
 /  "+=" 
 /  "-" 
 /  "-=" 
 /  "*" 
 /  "*=" 
 /  "/" 
 /  "/=" 
 /  "%" 
 /  "%="  ) 
expression  )  . 

testing_expression  = 
 ( expression 
 (  ">" 
 /  "<" 
 /  ">=" 
 /  "<=" 
 /  "==" 
 /  "!="  ) 
expression  )  . 

logical_expression  = 
 (  "!" expression ) 
 /  ( expression 
 (  "ampersand" 
 /  "ampersand=" 
 /  "|" 
 /  "|=" 
 /  "^" 
 /  "^=" 
 /  (  "ampersand"  "ampersand"  ) 
 /  "||=" 
 /  "%" 
 /  "%="  ) 
expression  ) 
 /  ( expression  "?" expression  ":" expression ) 
 /  "true" 
 /  "false"  . 

string_expression  =  ( expression 
 (  "+" 
 /  "+="  ) 
expression  )  . 

bit_expression  = 
 (  "~" expression ) 
 /  ( expression 
 (  ">>=" 
 /  "<<" 
 /  ">>" 
 /  ">>>"  ) 
expression  )  . 

casting_expression  = 
 "(" type  ")" expression  . 

creating_expression  = 
 "new"  (  ( classe_name  "("  [ arglist ]  ")"  ) 
 /  ( type_specifier  [  "[" expression  "]"  ]  <  "["  "]"  >  ) 
 /  (  "(" expression  ")"  )  )  . 

literal_expression  = 
integer_literal 
 / float_literal 
 / string 
 / character  . 

arglist  = 
expression  <  "," expression  >  . 

type  = 
type_specifier  <  "["  "]"  >  . 

type_specifier = 
 "boolean" 
 /  "byte" 
 /  "char" 
 /  "short" 
 /  "int" 
 /  "float" 
 /  "long" 
 /  "double" 
 / class_name 
 / interface_name  . 

modifier = 
 "public" 
 /  "private" 
 /  "protected" 
 /  "static" 
 /  "final" 
 /  "native" 
 /  "synchronized" 
 /  "abstract" 
 /  "threadsafe" 
 /  "transient"  . 

package_name = 
identifier 
 /  ( package_name  "." identifier )  . 

class_name  = 
identifier 
 /  ( package_name  "." identifier )  . 

interface_name = 
identifier 
 /  ( package_name  "." identifier )  . 

integer_literal = 
 (  (  "1..9"  <  "0..9"  >  ) 
 /  <  "0..7"  > 
 /  (  "0"  "x"  "0..9a..f"  <  "0..9a..f"  >  )  ) 
 [  "l"  ]  . 

float_literal  = 
 ( decimal_digits  "."  [ decimal_digits ]  [ exponent_part ]  [ float_type_suffix ]  ) 
 /  (  "." decimal_digits  [ exponent_part ]  [ float_type_suffix ]  ) 
 /  ( decimal_digits  [ exponent_part ]  [ float_type_suffix ]  )  . 

decimal_digits  = 
 "0..9"  <  "0..9"  >  . 

exponent_part  = 
 "e"  [  "+"  /  "-"  ] decimal_digits  . 

float_type_suffix  = 
 "f"  /  "d"  . 

character  =
  "based on the unicode character set"  . 

string  =  
 "''"  < character  >  "''"  . 

identifier  =
  "a..z,$,_"  <  "a..z,$,_,0..9,unicode character over 00C0"  >  .