'+' '-' (left associative)

"->d" (left associative)

"->f" (left associative)

"*+" (left associative)

"**" (left associative)

BNF Input Grammar

start: ::=

##### declaration_or_property_list ENDOFFILE

declaration_or_property_list: ::=

#####

#####| declaration declaration_or_property_list

#####| property declaration_or_property_list

declaration: ::=

##### "unknown" variable_term

#####| "let" variable_term variable_term_list '=' expression

#####| "let" "rec" variable_term variable_term_list '=' expression

variable_term: ::=

##### variable_term_typeless

#####| '(' variable_term_typeless ':' type_expression ')'

variable_term_list: ::=

#####

#####| variable_term variable_term_list

variable_term_typeless: ::=

##### IDENT"if"IER

property: ::=

##### "property" property_name_opt ':' expression

property_name_opt: ::=

#####

#####| IDENT"if"IER

native_operator: ::=

##### "and"

#####| "or"

#####| "not"

#####| "eq"

#####| "impl"

#####| "xor"

#####| "andred"

#####| "orred"

#####| "con"

#####| "eps"

#####| NUMBER

expression: ::=

##### expression_application_list

#####| left_open_expression

expression_application_list: ::=

##### simple_expression

#####| expression_application_list simple_expression

left_open_expression: ::=

##### "fun" variable_term "->" expression

#####| "let" variable_term variable_term_list '=' expression "in" expression

#####| "let" "rec" variable_term variable_term_list '=' expression "in" expression

#####| "if" condition_on_length_type_expression "then" expression "else" expression

special_operator: ::=

##### "rep" length_type_expression

#####| "extr" simple_expression length_type_expression length_type_expression

##### native_operator

#####| special_operator

#####| variable_term_typeless

#####| '(' expression ')'

type_expression: ::=

##### data_type_expression

#####| address_type_expression

#####| functional_type_expression

data_type_expression: ::=

##### "bool"

#####| data_type_expression "**" data_type_expression

#####| data_type_expression "*+" data_type_expression

#####| address_type_expression "->d" data_type_expression

#####| data_type_variable

#####| '(' data_type_expression ')'

address_type_expression: ::=

##### length_type_expression

#####| address_type_expression "**" address_type_expression

#####| address_type_expression "*+" address_type_expression

#####| address_type_variable

#####| '(' address_type_expression_nolen ')'

address_type_expression_nolen: ::=

##### address_type_expression "**" address_type_expression

#####| address_type_expression "*+" address_type_expression

#####| address_type_variable

#####| '(' address_type_expression_nolen ')'

functional_type_expression: ::=

##### data_type_expression "->f" data_type_expression

#####| address_type_expression "->f" data_type_expression

#####| functional_type_expression "->f" data_type_expression

#####| address_type_expression "->f" functional_type_expression

#####| data_type_expression "->f" functional_type_expression

#####| functional_type_expression "->f" functional_type_expression

#####| functional_type_variable

#####| '(' functional_type_expression ')'

length_type_expression: ::=

##### NUMBER

#####| length_type_variable

#####| length_type_expression '-' length_type_expression

#####| length_type_expression '+' length_type_expression

#####| '(' length_type_expression ')'

condition_on_length_type_expression: ::=

##### length_type_expression '>' length_type_expression

#####| length_type_expression '<' length_type_expression

#####| length_type_expression '=' length_type_expression

#####| length_type_expression '>''=' length_type_expression

#####| length_type_expression '<''=' length_type_expression

#####| "and" condition_on_length_type_expression

##### condition_on_length_type_expression

#####| "or" condition_on_length_type_expression

##### condition_on_length_type_expression

#####| "not" condition_on_length_type_expression

#####| '(' condition_on_length_type_expression ')'

data_type_variable: ::=

##### IDENT"if"IER ':' "data"

address_type_variable: ::=

##### IDENT"if"IER ':' "address"

functional_type_variable: ::=

##### IDENT"if"IER ':' "functional"

length_type_variable: ::=

##### IDENT"if"IER ':' "length"