1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
use std::ops::AddAssign; use uuid::Uuid; use regular_expression_bootstrap::StateGenerator; #[macro_use] mod util; mod lexer; pub use crate::lexer::{ Token, Lexer }; #[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)] struct TokenState<T> { uuid: u128, sequence_number: u128, token_kind: Option<T>, } impl<T: Clone> TokenState<T> { fn new(token_kind: Option<T>) -> TokenState<T> { TokenState { uuid: Uuid::new_v4().as_u128(), sequence_number: 0, token_kind } } fn token_kind(&self) -> &Option<T> { &self.token_kind } fn clear_token_kind(&mut self) { self.token_kind = None; } } impl<T> AddAssign<u128> for TokenState<T> { fn add_assign(&mut self, other: u128) { self.sequence_number += other; } } struct TokenStateGenerator<T> { token_state: TokenState<T>, final_enabled: bool, } impl<T: Clone> TokenStateGenerator<T> { pub fn new(token: Option<T>) -> TokenStateGenerator<T> { TokenStateGenerator { token_state: TokenState::new(token), final_enabled: true } } fn next_final_enabled(&mut self) -> TokenState<T> { let next = self.token_state.clone(); self.token_state += 1; next } fn next_final_disabled(&mut self) -> TokenState<T> { let mut next = self.token_state.clone(); self.token_state += 1; next.clear_token_kind(); next } } impl<T: Clone> StateGenerator for TokenStateGenerator<T> { type State = TokenState<T>; fn next_initial(&mut self) -> TokenState<T> { let mut next = self.token_state.clone(); self.token_state += 1; next.clear_token_kind(); next } fn next_final(&mut self) -> TokenState<T> { if self.final_enabled { self.next_final_enabled() } else { self.next_final_disabled() } } fn disable_final(&mut self) -> &mut TokenStateGenerator<T> { self.final_enabled = false; self } fn enable_final(&mut self) -> &mut TokenStateGenerator<T> { self.final_enabled = true; self } }