python_syntax/
parser.rs

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);