use crate::{ representation::{Representation, EBNF}, ParseResult, Parser, ParserExtension, }; pub fn sequence(sequence: S) -> impl Parser where S: Sequence, { let repr = sequence.repr(); (move |input| -> ParseResult { sequence.parse(input) }) .to_anno() .with_repr(repr) } pub fn surrounded_by( main: impl Parser, surrounding: impl Parser, ) -> impl Parser { let s_prod = surrounding.representation().production(); let main_prod = main.representation().production(); (move |input| { let (_result1, rest1) = surrounding.parse(input)?; let (result2, rest2) = main.parse(rest1)?; let (_result3, rest3) = surrounding.parse(rest2)?; Ok((result2, rest3)) }) .to_anno() .with_repr(Representation::new().with_production(EBNF::Sequence(vec![ s_prod.clone(), main_prod, s_prod, ]))) } pub fn seq2( first: impl Parser, second: impl Parser, ) -> impl Parser { sequence((first, second)) } pub trait Sequence { fn parse(&self, input: I) -> ParseResult; fn repr(&self) -> Representation; } impl Sequence for (P1, P2) where P1: Parser, P2: Parser, { fn parse(&self, input: I) -> ParseResult { let p1 = &self.0; let p2 = &self.1; p1.parse(input).and_then(|(result1, rest)| { p2.parse(rest) .map(|(result2, rest2)| ((result1, result2), rest2)) }) } fn repr(&self) -> Representation { let p1 = &self.0; let p2 = &self.1; Representation::new().with_production(EBNF::Sequence(vec![ p1.representation().production(), p2.representation().production(), ])) } } impl Sequence for (P1, P2, P3) where P1: Parser, P2: Parser, P3: Parser, { fn parse(&self, input: I) -> ParseResult { let p1 = &self.0; let p2 = &self.1; let p3 = &self.2; let (result1, rest1) = p1.parse(input)?; let (result2, rest2) = p2.parse(rest1)?; let (result3, rest3) = p3.parse(rest2)?; Ok(((result1, result2, result3), rest3)) } fn repr(&self) -> Representation { let p1 = &self.0; let p2 = &self.1; let p3 = &self.2; Representation::new().with_production(EBNF::Sequence(vec![ p1.representation().production(), p2.representation().production(), p3.representation().production(), ])) } }