use crate::lexer::prelude::*;
use std::iter::Peekable;
#[derive(Debug, Clone)]
pub struct Parser {
tokens: Peekable<Tokens>
}
impl Parser{
pub fn peek(&mut self) -> Option<Token> {
self.tokens.peek().cloned()
}
pub fn extend(&mut self, tokens: Tokens) {
let mut toks_buf = Tokens::new_empty();
for token in self.clone() {
toks_buf.add_token(token);
}
for token in tokens.clone() {
toks_buf.add_token(token);
}
self.tokens = tokens.peekable();
}
pub fn new_empty() -> Parser {
let tokens = Tokens::new_empty();
Self::new(tokens)
}
pub fn new(tokens: Tokens) -> Parser {
Parser { tokens: tokens.peekable() }
}
pub fn from<T: AsRef<str>>
(
value: T,
delimiters: DelimitersParam
) -> Parser {
let tokens = Tokens::new(value, delimiters);
Parser::new(tokens)
}
}
impl Iterator for Parser {
type Item = Token;
fn next(&mut self) -> Option<Self::Item> {
self.tokens.next()
}
}
pub mod concrete_parser;
pub mod subparser;