Made http://www.pastebin.ca/1066847 into BNF-like syntax. top_level_contents := // empty | top_level_content top_level_contents top_level_content := statements | callable_expression | class_declaration variable := identifier class_declaration := "class" identifier opt_derivation_indication opt_implementation_indications "{" class_member_list "}" opt_derivation_indication := // empty : derivation_indication opt_implementation_indications := // empty : implementation_indications derivation_indication := "extends" identifier implementation_indications := "implements" identifier_list_comma identifier_list_comma := identifier | identifier "," identifier_list_comma // statements statement_block := "{" statements "}" statements := // empty | statement statements statement := statement_with_semicolon ";" | statement_without_semicolon statement_with_semicolon := return_statement | abstract_assignment_statement | break_statement | increment_statement | decrement_statement statement_without_semicolon := | if_statement | for_statement | while_statement | switch_statement abstract_assignment_statement := | assignment_statement | add_assignment_statement | subtract_assignment_statement add_assignment_statement := expression "+=" expression subtract_assignment_statement := expression "-=" expression increment_statement := expression "++" // FIXME: no pre-positioned increment? decrement_statement := expression "--" // FIXME: no pre-positioned increment? return_statement := "return" expression assignment_statement := variable "=" expression while_statement := "while" "(" expression ")" statement_block break_statement := "break" /// - variable-declaration: variable_declaration_statement := type_name opt_array_indicator variable_declaration_pairs ";" type_name := identifier opt_array_type_indicator := // empty | "[" "]" variable_declaration_pairs := variable_declaration_pair | variable_declaration_pair "," variable_declaration_pairs variable_declaration_pair := identifier opt_variable_initializer opt_variable_initializer := // empty | variable_initializer variable_initializer := "=" expression /// - if-else: if_statement := "if" "(" expression ")" statement_block opt_else_block opt_else_block := // empty | else_block else_block := "else" statement_block /// - for: for_statement := "for" "(" for_initializer ";" expression ";" for_continuations ")" statement_block for_initializer := // empty | variable_declaration_statement | abstract_assignment_statement_list_comma abstract_assignment_list_comma := abstract_assignment_statement | abstract_assignment_statement "," abstract_assignment_list_comma for_continuations := statements // FIXME: no constraints? /// - switch-case: switch_statement := "switch" "(" expression ")" "{" switch_case_list "}" switch_case_list := // empty | switch_case_default switch_case_list // default cannot appear twice switch_case_default := switch_case | switch_default switch_case := "case" constant ":" statement_list // must end with break_statement switch_default := "default" ":" statement_list // must end with break_statement // expressions expression := callable_expression | variable | literal | field_access_expression | super_expression | false_expression | this_expression | true_expression | new_expression | array_access_expression | null_expression | parenthesized_expression | less_than_expression | less_eq_expression | greater_than_expression | greater_eq_expression | eq_expression | not_eq_expression | conditional_expression | logical_or_expression | logical_and_expression | logical_not_expression | add_expression | subtract_expression | numeric_negation_expression | multiply_expression | divide_expression | modulo_expression | bitwise_and_expression | bitwise_or_expression | left_shift_expression | right_shift_expression callable_expression := | funccation_call_expression | function_access_expression new_expression := new_object_expression | new_array_expression new_object_expression := "new" function_call_expression new_array_expression := "new" identifier "[" expression "]" function_call_expression := identifier "(" function_args ")" function_args := // empty | function_arg_list function_arg_list := expression | expression "," function_arg_list field_access_expression := expression "." identifier function_access_expression := expression "." function_call_expression super_expression := "super" false_expression := "false" this_expression := "this" true_expression := "true" array_access_expression := "[" expression "]" null_expression := "null" parenthesized_expression := "(" expression ")" less_than_expression := expression "<" expression less_eq_expression := expression "<=" expression greater_than_expression := expression ">" expression greater_eq_expression := expression ">=" expression eq_expression := expression "==" expression not_eq_expression := expression "!=" expression conditional_expression := expression "?" expression ":" expression logical_or_expression := expression "||" expression logical_and_expression := expression "&&" expression logical_not_expression := "!" expression add_expression := expression "+" expression subtract_expression := expression "-" expression numeric_negation_expression := "-" expression multiply_expression := expression "*" expression divide_expression := expression "/" expression modulo_expression := expression "%" expression bitwise_and_expression := expression "&" expression bitwise_or_expression := expression "|" expression left_shift_expression := expression "<<" expression right_shift_expression := expression ">>" expression