Minimal Imperative Parsing Library | https://docs.rs/mipl
at main 59 lines 1.7 kB view raw
1//! Delimiters for the lexer. 2use std::collections::HashSet; 3use std::iter::FromIterator; 4 5pub trait Inner { 6 fn new_with_inner(v: HashSet<char>) -> Self; 7 fn inner(&self) -> &HashSet<char>; 8} 9/// The interface of [DiscardDelimiters] and 10/// [KeepDelimiters]. 11pub trait Delimiters: Inner + Sized { 12 /// Construct a new set of delimiters from 13 /// a list of characters. 14 fn new(vec: Vec<char>) -> Self { 15 Self::new_with_inner( 16 HashSet::from_iter(vec.iter().cloned()) 17 ) 18 } 19 20 /// Check if the set of delimiters contains a 21 /// particular delimiter character. 22 fn contains(&self, ch: char) -> bool { 23 self.inner().contains(&ch) 24 } 25} 26 27/// Set of all delimiter characters that will not 28/// become tokens through [Tokens::new](crate::lexer::Tokens::new). 29pub struct DiscardDelimiters(HashSet<char>); 30impl Inner for DiscardDelimiters { 31 fn new_with_inner(v: HashSet<char>) -> Self { 32 Self(v) 33 } 34 fn inner(&self) -> &HashSet<char> { 35 &self.0 36 } 37} 38impl Delimiters for DiscardDelimiters {} 39 40/// Set of all delimiter characters that will 41/// also become tokens through [Tokens::new](crate::lexer::Tokens::new). 42pub struct KeepDelimiters(HashSet<char>); 43impl Delimiters for KeepDelimiters {} 44impl Inner for KeepDelimiters { 45 fn new_with_inner(v: HashSet<char>) -> Self { 46 Self(v) 47 } 48 fn inner(&self) -> &HashSet<char> { 49 &self.0 50 } 51} 52 53/// Group the two delimiter sets. 54pub struct DelimitersParam { 55 /// The set of delimiters to keep. 56 pub keep: KeepDelimiters, 57 /// The set of delimiters to discard. 58 pub discard: DiscardDelimiters 59}