Minimal Imperative Parsing Library | https://docs.rs/mipl

add newline matcher

ecsolticia.codeberg.page e1942cb5 c3c21e0d

verified
+45 -1
+2
src/parser/parsers.rs
··· 41 41 } 42 42 } 43 43 44 + mod is_newline; 44 45 mod exact_match; 45 46 pub use { 46 47 exact_match::ExactMatch, 48 + is_newline::IsNewline, 47 49 };
+15
src/parser/parsers/is_newline.rs
··· 1 + use crate::lexer::NewlineToken; 2 + 3 + use super::*; 4 + 5 + /// Match a newline. 6 + pub struct IsNewline; 7 + impl PeekerOperator<NewlineToken> for IsNewline { 8 + fn peek_for(&self, parser: &mut Parser) -> Option<NewlineToken> { 9 + if let Token::Newline(NewlineToken) = parser.peek()? { 10 + Some(NewlineToken) 11 + } else { 12 + None 13 + } 14 + } 15 + }
+28 -1
tests/test_parsers.rs
··· 1 - use mipl::parser::{*, parsers::Operator}; 1 + use mipl::parser::{*, parsers::*}; 2 2 use mipl::lexer::del::*; 3 3 use mipl::lexer::*; 4 4 ··· 51 51 parser.next() 52 52 ); 53 53 } 54 + 55 + #[test] 56 + fn test_is_newline() { 57 + let d_vec: Vec<char> = vec![' ']; 58 + let d_del = DiscardDelimiters::new(d_vec); 59 + let k_vec: Vec<char> = vec![]; 60 + let k_del = KeepDelimiters::new(k_vec); 61 + let del_param = DelimitersParam { 62 + keep: k_del, discard: d_del 63 + }; 64 + 65 + let mut parser = Parser::from( 66 + "lorem ipsum\ndolor sit amet", 67 + del_param 68 + ); 69 + 70 + let newline_parser = IsNewline; 71 + 72 + assert_eq!(None, newline_parser.try_next(&mut parser)); 73 + 74 + parser.next(); 75 + parser.next(); 76 + 77 + assert_eq!(Some(NewlineToken), newline_parser.try_next(&mut parser)); 78 + 79 + assert_eq!(None, newline_parser.try_next(&mut parser)); 80 + }