1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
use crate::{
    ast, error::Error, grammar::ProgramParser, lexer::Lexer, source::Location, token::Token,
};

macro_rules! parse_fn {
    ($vis:vis fn $name:ident -> $typ:ident) => {
        $vis fn $name(input: &str) -> Result<ast::$typ, Error> {
            let lexer = Lexer::new(input);
            let loc = Location::new(0, 0);
            let tokens = std::iter::once(Ok((loc, Token::$typ, loc))).chain(lexer);
            if let ast::Program::$typ(ret) =
                ProgramParser::new().parse(tokens).map_err(Error::from)?
            {
                Ok(ret)
            } else {
                unreachable!()
            }
        }
    }
}

parse_fn!(pub fn parse_module -> Module);
parse_fn!(pub fn parse_interactive -> Interactive);
parse_fn!(pub fn parse_eval -> Eval);