'+' '-' (left associative)
"->d" (left associative)
"->f" (left associative)
"*+" (left associative)
"**" (left associative)
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"