The Grammar of Erg (ver 0.1.0, provisional)

special_op ::= '=' | '->' | '=>' | '.' | ',' | ':' | '::' | '|>' | '&' separator ::= ';' | '\n' escape ::= '\' comment_marker ::= '#' reserved_symbol ::= special_op | separator | comment_marker number ::= [0-9] first_last_dight ::= number dight ::= number | '_' bin_dight ::= [0-1] oct_dight ::= [0-8] hex_dight ::= [0-9] | [a-f] | [A-F] int ::= first_last_dight | first_last_dight dight* first_last_dight | '0' ('b' | 'B') binary_dight+ | '0' ('o' | 'O') octa_dight+ | '0' ('x' | 'X') hex_dight+ ratio ::= '.' dight* first_last_dight | first_last_dight dight* '.' dight* first_last_dight bool ::= 'True' | 'False' none ::= 'None' ellipsis ::= 'Ellipsis' not_implemented ::= 'NotImplemented' parenthesis ::= '(' | ')' bracket ::= '{' | '}' square_bracket ::= '[' | ']' enclosure ::= parenthesis | bracket | square_bracket infix_op ::= '+' | '-' | '*' | '/' | '//' | '**' | '%' | '&&' | '||' | '^^' | '<' | '<=' | '>' | '>=' | 'and' | 'or' | 'is' | 'as' | 'isnot' | 'in' | 'notin' | 'dot' | 'cross' prefix_op ::= '+' | '-' | '*' | '**' | '..' | '..<' | '~' | '&' | '!' postfix_op ::= '?' | '..' | '<..' operator ::= infix_op | prefix_op | postfix_op char ::= /* ... */ str ::= '\"' char* '\" symbol_head ::= /* char except dight */ symbol ::= symbol_head /* char except (reserved_symbol | operator | escape | ' ') */ subscript ::= accessor '[' expr ']' attr ::= accessor '.' symbol accessor ::= symbol | attr | subscript literal ::= int | ratio | str | bool | none | ellipsis | not_implemented pos_arg ::= expr kw_arg ::= symbol ':' expr arg ::= pos_arg | kw_arg enc_args ::= pos_arg (',' pos_arg)* ','? args ::= '()' | '(' arg (',' arg)* ','? ')' | arg (',' arg)* var_pattern ::= accessor | `...` accessor | '[' single_patterns ']' var_decl_opt_t = var_pattern (':' type)? var_decl = var_pattern ':' type param_pattern ::= symbol | `...` symbol | literal | '[' param_patterns ']' param_decl_opt_t = param_pattern (':' type)? param_decl = param_pattern ':' type params_opt_t ::= '()' (':' type)? | '(' param_decl_opt_t (',' param_decl_opt_t)* ','? ')' (':' type)? | param_decl_opt_t (',' param_decl_opt_t)* params ::= '()' ':' type | '(' param_decl (',' param_decl)* ','? ')' ':' type subr_decl ::= accessor params subr_decl_opt_t ::= accessor params_opt_t decl ::= var_decl | subr_decl decl_opt_t = var_decl_opt_t | subr_decl_opt_t body ::= expr | indent line+ dedent def ::= ('@' decorator '\n')* decl_opt_t '=' body call ::= accessor args | accessor call decorator ::= call lambda_func ::= params_opt_t '->' body lambda_proc ::= params_opt_t '=>' body lambda ::= lambda_func | lambda_proc normal_array ::= '[' enc_args ']' array_comprehension ::= '[' expr | (generator)+ ']' array ::= normal_array | array_comprehension record ::= '{' '=' '}' | '{' def (';' def)* ';'? '}' set ::= '{' '}' | '{' expr (',' expr)* ','? '}' dict ::= '{' ':' '}' | '{' expr ':' expr (',' expr ':' expr)* ','? '}' tuple ::= '(' ')' | '(' expr (',' expr)* ','? ')' indent ::= /* ... */ expr ::= accessor | literal | prefix | infix | postfix | array | record | set | dict | tuple | call | def | lambda line ::= expr separator+ program ::= expr? | (line | comment)*