Minimal Imperative Parsing Library | https://docs.rs/mipl
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;