rendered paste bodyMade 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