1use crate::{
2 ast, error::Error, grammar::ProgramParser, lexer::Lexer, source::Location, token::Token,
3};
4
5macro_rules! parse_fn {
6 ($vis:vis fn $name:ident -> $typ:ident) => {
7 $vis fn $name(input: &str) -> Result<ast::$typ, Error> {
8 let lexer = Lexer::new(input);
9 let loc = Location::new(0, 0);
10 let tokens = std::iter::once(Ok((loc, Token::$typ, loc))).chain(lexer);
11 if let ast::Program::$typ(ret) =
12 ProgramParser::new().parse(tokens).map_err(Error::from)?
13 {
14 Ok(ret)
15 } else {
16 unreachable!()
17 }
18 }
19 }
20}
21
22parse_fn!(pub fn parse_module -> Module);
23parse_fn!(pub fn parse_interactive -> Interactive);
24parse_fn!(pub fn parse_eval -> Eval);