< program > ::= < expression_list >
< expression_list > ::= < expression > < terminator > |
< expression > < terminator > < expression_list >
< expression > ::= < number > |
< string > |
< identifier > |
< pair_expression > |
< call_expression > |
< module_expression > |
< function_expression > |
< binary_expression > |
< conditional_expression > |
< assignment_expression > |
< struct_definition > |
< comment >
< terminator > ::= '\n' | ';'
< module_expression > ::= 'module' < extended_identifier > 'end'
< extended_identifier > ::= < identifier > |
< identifier > < expression_list >
< struct_definition > ::= 'struct' < extended_typed_identifier > 'end' |
'mutable' 'struct' < extended_typed_identifier > 'end'
< extended_typed_identifier > ::= < typed_identifier > |
< typed_identifier > < terminator > < extended_typed_identifier >
< typed_identifier > ::= < parametrized_identifier > |
< parametrized_identifier > < parametrized_choice > < parametrized_identifier >
< parametrized_choice > ::= '::' | '< :'
< parametrized_identifier > ::= < identifier > |
< identifier > '{' < modified_typed_identifier > '}'
< modified_typed_identifier > ::= < typed_identifier > |
< typed_identifier > ',' < modified_typed_identifier >
< function_expression > ::= 'function' < identifier > < parameter_list > |
'function' < identifier > < parameter_list > < expression_list > 'end'
< parameter_list > ::= '(' < extended_parameter_list > ')'
< extended_parameter_list > ::= < identifier > |
< identifier > ‘,’ < extended_parameter_list >
< call_expression > ::= < expression > < argument_list >
< argument_list > ::= '(' < extended_argument_list > ')'
< extended_argument_list > ::= < expression > |
< expression > ',' < extended_argument_list >
< binary_expression > ::= < binary_expression > < times_operator > < plus_expression > |
< plus_expression >
< plus_expression > ::= < plus_expression > < plus_operator > < arrow_expression > |
< arrow_expression >
< arrow_expression > ::= < or_expression > < arrow_operator > < arrow_expression > |
< or_expression >
< or_expression > ::= < or_expression > '||' < and_expression > |
< and_expression >
< and_expression > ::= < and_expression > '&&' < assignment_expression > |
< assignment_expression >
< assignment_expression > ::= < pair_expression > < assign_opereator > < assignment_expression > |
< pair_expression >
< pair_expression > ::= < expression > '= >' < pair_expression > |
< expression >
< conditional_expression > ::= 'if' < expression > < expression_list > |
'if' < expression > < expression_list > < elseif_clause > |
'if' < expression > < expression_list > < elseif_clause > < else_clause >
< elseif_clause > ::= 'elseif' < expression > < expression_list > |
'elseif' < expression > < expression_list > < elseif_clause >
< else_clause > ::= 'else' < expression_list >
< identifier > ::= /[a-zA-Z]\w*/
< number > ::= /\d+/
< string > ::= '"' < characters > '"'
< characters > ::= < character > | < character > < characters >
< character > ::= < identifier > | < number >
< times_operator > ::= '*' | '/' | '÷' | '%' | '&' | '⋅' | '*' | '\\'
< plus_opereator > ::= '+' | '-'
< arrow_operator > ::= '←' | '→'
< assign_opereator > ::= ':=' | '~' | '$=' | '=' | '+=' | '-=' | '*=' |
'/=' | '//=' | '|\=|' | '^=' | '÷=' | '%=' | '&='
< comment > ::= '#' | /.*/