Macro tree
Source macro_rules! tree {
((None)) => { ... };
((Some($($node:tt)*))) => { ... };
((
Program @ $start:literal .. $end:literal,
functions: [$($func:tt),* $(,)?],
globals: [$($global:tt),* $(,)?] $(,)?
)) => { ... };
((
FunctionDefinition @ $start:literal .. $end:literal,
name: $ident:tt,
params @ $params_start:literal .. $params_end:literal: [$($param:tt),* $(,)?],
return_type: $return_type:tt,
block: $block:tt $(,)?
)) => { ... };
((
Parameter,
mutable: $mutable:expr,
name: $ident:tt,
type: $type:tt $(,)?
)) => { ... };
((
Let @ $start:literal .. $end:literal,
mutable: $mut:literal,
name: $ident:tt,
type: $type:tt,
expr: $expr:tt $(,)?
)) => { ... };
((LetStmt $($rest:tt)*)) => { ... };
((ReturnStmt @ $start:literal .. $end:literal, $expr:tt $(,)?)) => { ... };
((ExprStmt @ $start:literal .. $end:literal, $expr:tt $(,)?)) => { ... };
((
Block @ $start:literal .. $end:literal,
stmts: [$($stmt:tt),* $(,)?],
expr: $expr:tt $(,)?
)) => { ... };
((BlockExpr $($rest:tt)*)) => { ... };
((
IfExpr @ $start:literal .. $end:literal,
cond: $cond:tt,
then_block: $then_block:tt,
else_block: $else_block:tt $(,)?
)) => { ... };
((Int $($rest:tt)*)) => { ... };
((Float $($rest:tt)*)) => { ... };
((Bool $($rest:tt)*)) => { ... };
((Char $($rest:tt)*)) => { ... };
((Ident $($rest:tt)*)) => { ... };
((Grouped @ $start:literal .. $end:literal, $expr:tt)) => { ... };
((
PrefixExpr @ $start:literal .. $end:literal,
op: $op:expr,
expr: $expr:tt $(,)?
)) => { ... };
((
InfixExpr @ $start:literal .. $end:literal,
lhs: $lhs:tt,
op: $op:expr,
rhs: $rhs:tt $(,)?
)) => { ... };
((
AssignExpr @ $start:literal .. $end:literal,
assignee: $assignee:tt,
assignee_ptr_count: $assignee_ptr_count:expr,
op: $op:expr,
expr: $expr:tt $(,)?
)) => { ... };
((
CallExpr @ $start:literal .. $end:literal,
func: $func:tt,
args: [$($arg:tt),* $(,)?] $(,)?
)) => { ... };
((
CastExpr @ $start:literal .. $end:literal,
expr: $expr:tt,
type: $type:expr $(,)?
)) => { ... };
(($value:expr, @ $start:literal .. $end:literal)) => { ... };
}