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
use crate::error::CompilationError;
use logos::Logos;
use std::fmt;
use std::ops::Range;
#[derive(Logos, Debug, PartialEq, Copy, Clone)]
pub enum Token<'a> {
#[regex("[ \r\n\t]+", logos::skip)]
#[error]
Error,
#[token("true")]
True,
#[token("false")]
False,
#[token("null")]
Null,
#[token(":")]
Colon,
#[token(",")]
Comma,
#[token("{")]
LBrace,
#[token("}")]
RBrace,
#[token("[")]
LBrack,
#[token("]")]
RBrack,
#[regex(r#"-?([0-9]|([1-9][0-9]*))((\.[0-9]+)?)([eE][+-]?[0-9]+)?"#, |lex| lex.slice())]
Number(&'a str),
#[regex(r#""([ -!#-\[\]-\x{10ffff}]|([\\](["\\/bfnrt]|[u][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]])))*""#)]
String(&'a str),
#[regex(r#""([ -!#-\[\]-\x{10ffff}]|([\\](["\\/bfnrt]|[u][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]])))*"#)]
MissingEndQuote(&'a str),
}
impl<'a> Token<'a> {
pub fn to_lalr_triple(
(t, r): (Token<'a>, Range<usize>),
) -> Result<(usize, Token, usize), CompilationError> {
if t == Token::Error {
Err(CompilationError::LexicalError { range: r })
} else {
Ok((r.start, t, r.end))
}
}
}
impl<'a> fmt::Display for Token<'a> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{:#?}", self)
}
}