All pastes #1067010 Raw Edit

Anonymous

public text v1 · immutable
#1067010 ·published 2008-07-09 19:11 UTC
rendered paste body
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