1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/// Parses a statement.
#[macro_export]
macro_rules! parse_stmt {
    ($expr:expr) => {{
        use crate::{parse_statements, scan};

        let tokens = scan($expr).tokens;
        parse_statements(tokens, $expr).program
    }};
}

/// Parses an expression.
#[macro_export]
macro_rules! parse_expr {
    ($expr:expr) => {{
        use crate::grammar::*;
        match crate::parse_stmt!($expr).into_iter().next().unwrap().kind {
            StmtKind::Expr(expr) => expr,
            _ => unreachable!(),
        }
    }};
}

/// Parses an assignment.
#[macro_export]
macro_rules! parse_asgn {
    ($asgn:expr) => {{
        use crate::grammar::*;
        match crate::parse_stmt!($asgn).into_iter().next().unwrap().kind {
            StmtKind::Assignment(asgn) => asgn,
            _ => unreachable!(),
        }
    }};
}