Minimal Imperative Parsing Library | https://docs.rs/mipl
at main 1.6 kB view raw
1//! The Parser. 2use crate::lexer::prelude::*; 3use std::iter::Peekable; 4 5/// Contains both the token stream and the parsing functionalities. 6#[derive(Debug, Clone)] 7pub struct Parser { 8 tokens: Peekable<Tokens> 9} 10impl Parser{ 11 /// Look up the next token in the stream 12 /// without consuming it. 13 pub fn peek(&mut self) -> Option<Token> { 14 self.tokens.peek().cloned() 15 } 16 17 /// Extend the parser with [Tokens]. 18 /// 19 /// Current implementation *could be* 20 /// costly as it relies on cloning. 21 pub fn extend(&mut self, tokens: Tokens) { 22 let mut toks_buf = Tokens::new_empty(); 23 24 for token in self.clone() { 25 toks_buf.add_token(token); 26 } 27 28 for token in tokens.clone() { 29 toks_buf.add_token(token); 30 } 31 32 self.tokens = tokens.peekable(); 33 } 34 35 /// Get a new empty [Parser]. 36 pub fn new_empty() -> Parser { 37 let tokens = Tokens::new_empty(); 38 Self::new(tokens) 39 } 40 41 /// Create a new [Parser] from tokens. 42 pub fn new(tokens: Tokens) -> Parser { 43 Parser { tokens: tokens.peekable() } 44 } 45 46 /// Create a [Parser] from string value and 47 /// delimiters. 48 pub fn from<T: AsRef<str>> 49 ( 50 value: T, 51 delimiters: DelimitersParam 52 ) -> Parser { 53 let tokens = Tokens::new(value, delimiters); 54 Parser::new(tokens) 55 } 56} 57impl Iterator for Parser { 58 type Item = Token; 59 60 fn next(&mut self) -> Option<Self::Item> { 61 self.tokens.next() 62 } 63} 64 65pub mod concrete_parser; 66pub mod subparser;