python-syntax 0.1.0

Python 3 parser
Documentation
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);