diff --git a/crates/lex_regex/src/lib.rs b/crates/lex_regex/src/lib.rs index 2e22254..75137c2 100644 --- a/crates/lex_regex/src/lib.rs +++ b/crates/lex_regex/src/lib.rs @@ -1,7 +1,5 @@ #![feature(gen_blocks)] -use std::rc::Rc; - use regex::{Regex, RegexSet}; use copager_cfg::token::{TokenTag, Token}; @@ -9,9 +7,9 @@ use copager_lex::{LexSource, LexDriver}; #[derive(Debug)] pub struct RegexLexer { - regex_istr: Rc, - regex_set: Rc, - regex_map: Rc>, + regex_istr: Regex, + regex_set: RegexSet, + regex_map: Vec<(Regex, S::Tag)>, } impl LexDriver for RegexLexer { @@ -26,9 +24,9 @@ impl LexDriver for RegexLexer { .collect::>>()?; Ok(RegexLexer { - regex_istr: Rc::new(regex_istr), - regex_set: Rc::new(regex_set), - regex_map: Rc::new(regex_map), + regex_istr, + regex_set, + regex_map, }) } @@ -45,24 +43,23 @@ impl LexDriver for RegexLexer { }; // Find the token - let mut matches = self + let matched = self .regex_set .matches(remain) .into_iter() .map(|idx| &self.regex_map[idx]) .map(|(regex, token)| (*token, regex.find(remain).unwrap().as_str())) - .collect::>(); - matches.sort_by(|(_, a), (_, b)| a.len().cmp(&b.len())); + .next(); // Update pos - let (token, acc_s) = match matches.first() { + let (token, acc_s) = match matched { Some(a) => a, None => return, }; let range = (pos, pos + acc_s.len()); pos += acc_s.len(); - yield Token::new(*token, &input, range); + yield Token::new(token, &input, range); } } }