1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
use crate::parser::Parser; use crate::syntax::Delimiter; use crate::syntax::Syntax; use crate::syntax::NonEmptySyntax; use lark_error::ErrorReported; use lark_debug_derive::DebugWith; #[derive(DebugWith)] pub struct Delimited<D, T>(pub D, pub T); impl<D, T> Delimited<D, T> { fn delimiters(&self) -> &D { &self.0 } fn content(&self) -> &T { &self.1 } } impl<D, T> Syntax<'parse> for Delimited<D, T> where D: Delimiter<'parse>, T: Syntax<'parse>, { type Data = T::Data; fn test(&mut self, parser: &Parser<'parse>) -> bool { parser.test(self.delimiters().open_syntax()) } fn expect(&mut self, parser: &mut Parser<'parse>) -> Result<Self::Data, ErrorReported> { try { let Delimited(delimiter, content) = self; parser.expect(delimiter.open_syntax())?; let content = parser.expect(content)?; parser.expect(delimiter.close_syntax())?; content } } } impl<D, T> NonEmptySyntax<'parse> for Delimited<D, T> where D: Delimiter<'parse>, T: Syntax<'parse>, { }