The syntax is specified below using XML's Extended BNF Notation. The diagrams do not attempt to convey operator precedence within a rule (see Reserved Tokens for that information.

/* Statements */
	program ::= dcl_stmt*
	dcl_stmt ::= var_stmt | fn_stmt
	var_stmt ::= perm_ident ident_token type? (',' ident_token type?)* ('=' append_exp (',' append_exp)*)? ';'
	fn_stmt ::= fn_type block
	block ::= '{' stmt* '}'
	stmt ::= if_stmt | match_stmt | block | while_stmt | break_stmt | cont_stmt | each_stmt | return_stmt | do_stmt | exp_stmt | ';'
	if_stmt ::= 'if' logic_exp block ( 'elif' logic_exp block )* ( 'else' block )?
	match_stmt ::= 'match' exp ('using' exp)? ('into' var_list)? ('with' exp ('into' var_list)? block)+ ('else' block)?
	while_stmt ::= 'while' logic_exp block
	each_stmt  ::= 'each' (ident_token ':')? var_list 'in' (exp|'...') block
	break_stmt ::= 'break' ';'
	cont_stmt  ::= 'continue' ';'
	return_stmt ::= 'return' this_exp? ';'
	do_stmt ::= 'do' exp? block
	exp_stmt   ::= this_exp ';'
	
	this_exp ::= exp (('using' exp)? block)?
	var_list ::= perm_ident? ident_token type (',' perm_ident? ident_token type)*

/* Type declarations */
	type ::= genqualname | nbrtype | arraytype | optiontype | ptrtype | reftype | fntype | structtype
	nbrtype ::= 'Bool' | 'i8' | 'i16' | 'i32' | 'i64' | 'isize' | 'u8' | 'u16' | 'u32' | 'u64' | 'usize' | 'f32' | 'f64'
	arraytype ::= '[' integer_token? ']' type
	optiontype ::= '?' type
	ptrtype ::= '*' type
	lifetype ::= lifetime_token type
	reftype ::= '&' region-type? lifetime_token? perm_type? type
	perm_ident ::= 'mut' | 'imm' | 'uni' | 'ro' | 'mutx' | 'id' | genqualname
	region_type ::= genqualname
	fntype ::= 'fn' (ident_token)? '(' fnparm (',' fnparm)* ')' (type (',' type)*)?
	fnparm ::= perm_ident? ident_token type? ('=' (literal | ident))?
	structtype ::= 'struct' ident_token? ('{' structstmt (',' structstmt)* '}')?
	structstmt ::= var_stmt | fn_stmt | 'mixin' genqualname

/* General Use Expressions (with possible assignments) */
	exp ::= assgn_exp
	assgn_exp ::= tuple_exp ('=' | '+='|'-='|'*='|'/='|'%='|'&='|'|='|'^='|'<<='|'>>='|'<-') exp
	tuple_exp ::= simple_exp (',' simple_exp)*

/* Expressions without any assignments */
	simple_exp ::= if_exp | match_exp | while_exp | each_exp | loop_exp | or_exp
	or_exp ::= and_exp ('or' and_exp)?
	and_exp ::= not_exp ('and' not_exp)?
	not_exp ::= '!'* compare_exp
	compare_exp ::= range_exp (('=='|'!='|'~~'|'<=>'|'<'|'<='|'>'|'>=') range_exp)?
	range_exp ::= bit_exp ('..' bit_exp)? ('..' bit_exp)?
	bit_exp ::= shift_exp (('|'|'&'|'^') shift_exp)*
	shift_exp ::= arith_exp (('<<' | '>>') arith_exp)?
	arith_exp ::= cast_exp (('+'|'-'|'*'|'/'|'%') cast_exp)*
	as_exp ::= prefix_exp (('as'|'into') type)?
	prefix_exp ::= ('.'|'<-'|'-'|'~'|'*'|'++'|'--')* term | addr
	addr ::= ('&'|'&<'|'&[]') ((region_type perm_type? suffix_exp) | (perm_type? (fn_stmt | (term suffix*))))
	suffix_exp ::= term suffix*
	suffix ::= '++'|'--'| ('.' property) | ('(' (simple_exp (',' simple_exp)*)? ')') | ('[' (simple_exp (',' simple_exp)*)? ']')
	property ::= ident_token | symbol_token | integer_token
	term ::=  literal | genqualname | pseudo | '(' exp ')'
	genqualname ::= (ident_token '::')* ident_token ('[' type (',' type)* ']')?
	pseudo ::= 'self' | 'this'
	
/* Literals and other tokens */
	literal ::= float_token | integer_token | text_token | symbol_token | 'true' | 'false' | array_lit
	array_lit ::= '[' (simple_exp (',' simple_exp) ';')? simple_exp (',' simple_exp) ']'
	float_token ::= (('0'-'9') ('0'-'9')*) '.' ('0'-'9')* (('e'|'E') ('-'|'+')? ('0'-'9')+)?
	integer_token ::= (('0'-'9') ('0'-'9')*) | '0x' (('0'-'9')|('a'-'f')|('A'-'F'))+
	lifetime_token ::= '\'' ident_token
	text_token ::= '"' any_char '"'
	symbol_token ::= "'" any_char "'"

	ident_token ::= '`' any_char* '`' | ('@' | '#' | '_' | alpha_char) (alpha_char | ('0'-'9') | '$' | '_')*

Railroad diagrams courtesy of the Railroad Diagram Generator.