tree

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)) => { ... };
}