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 std::iter; use crate::ast; use crate::error::ParseError; use crate::lexer; use crate::n3; use crate::token; macro_rules! do_lalr_parsing { ($input: expr, $pat: ident, $tok: ident) => {{ let lxr = lexer::make_tokenizer($input); let marker_token = (Default::default(), token::Tok::$tok, Default::default()); let tokenizer = iter::once(Ok(marker_token)).chain(lxr); match n3::$pat::new().parse(tokenizer) { Err(err) => Err(ParseError::from(err)), Ok(tree) => Ok(tree), } }}; } pub fn parse_file(source: &str) -> Result<ast::File, ParseError> { do_lalr_parsing!(source, InputFileParser, StartFile) }