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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
use crate::source::Chunk;
use crate::{Logos, Lexer, Skip, Filter};
pub trait LexerInternal<'source> {
type Token;
fn read<T: Chunk<'source>>(&self) -> Option<T>;
fn read_at<T: Chunk<'source>>(&self, n: usize) -> Option<T>;
unsafe fn read_unchecked<T: Chunk<'source>>(&self, n: usize) -> T;
fn test<T: Chunk<'source>, F: FnOnce(T) -> bool>(&self, test: F) -> bool;
fn test_at<T:Chunk<'source>, F: FnOnce(T) -> bool>(&self, n: usize, test: F) -> bool;
fn bump_unchecked(&mut self, size: usize);
fn trivia(&mut self);
fn error(&mut self);
fn end(&mut self);
fn set(&mut self, token: Self::Token);
}
pub trait CallbackResult<'s, P, T: Logos<'s>> {
fn construct<Constructor>(self, c: Constructor, lex: &mut Lexer<'s, T>)
where
Constructor: Fn(P) -> T;
}
impl<'s, P, T: Logos<'s>> CallbackResult<'s, P, T> for P {
#[inline]
fn construct<Constructor>(self, c: Constructor, lex: &mut Lexer<'s, T>)
where
Constructor: Fn(P) -> T,
{
lex.set(c(self))
}
}
impl<'s, T: Logos<'s>> CallbackResult<'s, (), T> for bool {
#[inline]
fn construct<Constructor>(self, c: Constructor, lex: &mut Lexer<'s, T>)
where
Constructor: Fn(()) -> T,
{
match self {
true => lex.set(c(())),
false => lex.set(T::ERROR),
}
}
}
impl<'s, P, T: Logos<'s>> CallbackResult<'s, P, T> for Option<P> {
#[inline]
fn construct<Constructor>(self, c: Constructor, lex: &mut Lexer<'s, T>)
where
Constructor: Fn(P) -> T,
{
match self {
Some(product) => lex.set(c(product)),
None => lex.set(T::ERROR),
}
}
}
impl<'s, P, E, T: Logos<'s>> CallbackResult<'s, P, T> for Result<P, E> {
#[inline]
fn construct<Constructor>(self, c: Constructor, lex: &mut Lexer<'s, T>)
where
Constructor: Fn(P) -> T,
{
match self {
Ok(product) => lex.set(c(product)),
Err(_) => lex.set(T::ERROR),
}
}
}
impl<'s, T: Logos<'s>> CallbackResult<'s, (), T> for Skip {
#[inline]
fn construct<Constructor>(self, _: Constructor, lex: &mut Lexer<'s, T>)
where
Constructor: Fn(()) -> T,
{
lex.trivia();
T::lex(lex);
}
}
impl<'s, P, T: Logos<'s>> CallbackResult<'s, P, T> for Filter<P> {
#[inline]
fn construct<Constructor>(self, c: Constructor, lex: &mut Lexer<'s, T>)
where
Constructor: Fn(P) -> T,
{
match self {
Filter::Emit(product) => lex.set(c(product)),
Filter::Skip => {
lex.trivia();
T::lex(lex);
}
}
}
}