diff --git a/src/main.rs b/src/main.rs index 9d2e1d5..9857726 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,4 @@ -use nom::multi::many1; - -use crate::parser::paragraph; +use crate::parser::document; mod parser; @@ -9,6 +7,6 @@ const TEST_DOC: &'static str = include_str!("../toy_language.txt"); fn main() -> Result<(), Box> { pretty_env_logger::init(); println!("{}\n\n\n", TEST_DOC); - println!("{:#?}", many1(paragraph)(TEST_DOC)); + println!("{:#?}", document(TEST_DOC)); Ok(()) } diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 48fc2d8..436b250 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -2,4 +2,4 @@ mod nom_context; mod parser_with_context; mod text; mod text_element_parser; -pub use text::paragraph; +pub use text::document; diff --git a/src/parser/parser_with_context.rs b/src/parser/parser_with_context.rs index 691d049..2a80f03 100644 --- a/src/parser/parser_with_context.rs +++ b/src/parser/parser_with_context.rs @@ -1,7 +1,7 @@ macro_rules! parser_with_context { ($name:ident,$typ:ty,$inp:ident,$context:ident,$fnbody:block) => { pub fn $name<'c, I: Clone, O, E: nom::error::ParseError>( - $context: &mut NomContext<'c, I, O, E>, + $context: NomContext<'c, I, O, E>, ) -> impl for<'a> FnMut(&'a str) -> IResult<&'a str, $typ, VerboseError<&'a str>> + 'c { |$inp| $fnbody } diff --git a/src/parser/text.rs b/src/parser/text.rs index 07709ba..b2f00bd 100644 --- a/src/parser/text.rs +++ b/src/parser/text.rs @@ -18,10 +18,14 @@ use nom::character::complete::space1; use nom::combinator::map; use nom::combinator::recognize; use nom::error::VerboseError; +use nom::multi::many1; use nom::multi::many_till; use nom::sequence::tuple; use nom::IResult; +use super::nom_context::NomContext; +use super::text_element_parser::text_element; + pub type Res = IResult>; #[derive(Debug)] @@ -125,10 +129,14 @@ pub fn link_end(input: &str) -> Res<&str, TextElement> { } pub fn paragraph(input: &str) -> Res<&str, (Vec, &str)> { - todo!() - // many_till(TextElementParser::new(paragraph_end), paragraph_end)(input) + let initial_context = NomContext::new(¶graph_end); + many_till(text_element(initial_context), paragraph_end)(input) } fn paragraph_end(input: &str) -> Res<&str, &str> { recognize(tuple((map(line_break, TextElement::LineBreak), blank_line)))(input) } + +pub fn document(input: &str) -> Res<&str, Vec<(Vec, &str)>> { + many1(paragraph)(input) +}