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