From 6c5fbc2af10d41fbad252661068357bbd698c158 Mon Sep 17 00:00:00 2001 From: Noah Hellman Date: Mon, 21 Nov 2022 19:56:11 +0100 Subject: [PATCH] wip parse inner --- src/inline.rs | 43 +++++++++++++++++++++++++++++++++---------- src/lex.rs | 30 ++++++++++++++---------------- src/lib.rs | 2 +- 3 files changed, 48 insertions(+), 27 deletions(-) diff --git a/src/inline.rs b/src/inline.rs index 7ee0e80..f086d77 100644 --- a/src/inline.rs +++ b/src/inline.rs @@ -77,22 +77,42 @@ pub enum Dir { Both, } -pub struct Parser> { - tokens: std::iter::Peekable>, +pub struct Parser { openers: Vec, + events: Vec, //tree: tree::Builder, } -impl> Parser { - pub fn new(chars: I) -> Self { +impl Parser { + pub fn new() -> Self { Self { - tokens: lex::Lexer::new(chars).peekable(), openers: Vec::new(), + events: Vec::new(), } } - pub fn parse(mut self, evs: &mut Vec) { - while let Some(t) = self.tokens.next() { + /* + pub fn parse(mut self, src: &str) -> impl Iterator { + todo!() + } + */ +} + +struct Parse<'s> { + src: &'s str, + lexer: lex::Lexer<'s>, + events: &'s mut Vec, +} + +impl<'s> Parse<'s> { + fn new(src: &'s str, events: &'s mut Vec) -> Self { + todo!() + } + + /* + fn parse(mut self, src: &str, evs: &mut Vec) { + let mut chars = src.chars(); + while let Some(t) = chars.next() { { let verbatim_opt = match t.kind { lex::Kind::Seq(lex::Sequence::Dollar) => { @@ -101,7 +121,7 @@ impl> Parser { if let Some(lex::Token { kind: lex::Kind::Seq(lex::Sequence::Backtick), len, - }) = self.tokens.peek() + }) = self.chars.clone().next() { Some((DisplayMath, *len)) } else { @@ -110,7 +130,7 @@ impl> Parser { }) .flatten(); if math_opt.is_some() { - self.tokens.next(); // backticks + chars.next(); // backticks } math_opt } @@ -119,7 +139,7 @@ impl> Parser { }; if let Some((atom, opener_len)) = verbatim_opt { - for tok in self.tokens { + for tok in chars { if let lex::Kind::Seq(lex::Sequence::Backtick) = tok.kind { if tok.len >= opener_len { break; @@ -188,6 +208,7 @@ impl> Parser { } } } +*/ } /* @@ -213,3 +234,5 @@ impl<'s> Iterator for Parser<'s> { } } */ + +mod test {} diff --git a/src/lex.rs b/src/lex.rs index d5742b7..958dba1 100644 --- a/src/lex.rs +++ b/src/lex.rs @@ -1,9 +1,9 @@ use crate::EOF; use Delimiter::*; +use Kind::*; use Sequence::*; use Symbol::*; -use Kind::*; #[derive(Debug)] pub(crate) struct Token { @@ -78,35 +78,33 @@ impl Sequence { } } -pub(crate) struct Lexer> { - chars: std::iter::Peekable, +pub(crate) struct Lexer<'s> { + src: &'s str, + chars: std::str::Chars<'s>, escape: bool, next: Option, - len: usize, } -impl> Lexer { - pub fn new(chars: I) -> Lexer { +impl<'s> Lexer<'s> { + pub fn new(src: &'s str) -> Lexer<'s> { Lexer { - chars: chars.peekable(), + src, + chars: src.chars(), escape: false, next: None, - len: 0, } } fn peek(&mut self) -> char { - self.chars.peek().copied().unwrap_or(EOF) + self.chars.clone().next().unwrap_or(EOF) } fn eat(&mut self) -> Option { - let c = self.chars.next(); - self.len += c.map_or(0, char::len_utf8); - c + self.chars.next() } fn len(&self) -> usize { - self.len + self.src.len() - self.chars.as_str().len() } fn eat_while(&mut self, mut predicate: impl FnMut(char) -> bool) { @@ -222,7 +220,7 @@ impl> Lexer { } } -impl> Iterator for Lexer { +impl<'s> Iterator for Lexer<'s> { type Item = Token; fn next(&mut self) -> Option { @@ -248,14 +246,14 @@ impl> Iterator for Lexer { #[cfg(test)] mod test { use super::Delimiter::*; + use super::Kind::*; use super::Sequence::*; use super::Symbol::*; - use super::Kind::*; macro_rules! test_lex { ($($st:ident,)? $src:expr $(,$($token:expr),* $(,)?)?) => { #[allow(unused)] - let actual = super::Lexer::new($src.chars()).map(|t| t.kind).collect::>(); + let actual = super::Lexer::new($src).map(|t| t.kind).collect::>(); let expected = vec![$($($token),*,)?]; assert_eq!(actual, expected, "{}", $src); }; diff --git a/src/lib.rs b/src/lib.rs index bb89ae6..ab7d125 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -83,7 +83,7 @@ impl<'s> Iterator for Iter<'s> { let chars = (&mut self.tree) .take_while(|ev| matches!(ev, tree::Event::Element(..))) .flat_map(|ev| ev.span().of(self.src).chars()); - inline::Parser::new(chars).parse(&mut self.events); + //inline::Parser::new(chars).parse(&mut self.events); /* let chars = std::iter::from_fn(|| { let mut eat = false;