1use crate::types::{FloatType, IntType, Source};
2
3#[derive(Debug, Clone, Copy, PartialEq)]
4pub enum TokenType {
5 And,
6 Break,
7 Do,
8 Else,
9 ElseIf,
10 End,
11 False,
12 For,
13 Function,
14 Goto,
15 IDiv,
17 If,
18 In,
19 Local,
20 Nil,
21 Not,
22 Or,
23 Repeat,
24 Return,
25 Then,
26 True,
27 Until,
28 While,
29 Concat,
31 Dots,
33 Eq,
35 Ge,
37 Le,
39 Ne,
41 Shl,
43 Shr,
45 DbColon,
47 Eos,
48 Flt,
50 Int,
52 Name,
54 String,
56 Lp,
58 Rp,
59 Ls,
60 Rs,
61 Lb,
62 Rb,
63 Add,
65 Minus,
66 Mul,
67 Div,
68 Mod,
69 Pow,
70 Len,
71 Assign,
73 Lt,
75 Gt,
76 BAnd,
78 BOr,
79 BXor,
80 Colon,
82 Comma,
83 Semi,
84 Attr,
86 SComment,
88 MComment,
90}
91
92impl TokenType {
93 pub fn from_keyword(word: &str) -> Option<TokenType> {
95 match word {
96 "and" => Some(TokenType::And),
97 "break" => Some(TokenType::Break),
98 "do" => Some(TokenType::Do),
99 "else" => Some(TokenType::Else),
100 "elseif" => Some(TokenType::ElseIf),
101 "end" => Some(TokenType::End),
102 "false" => Some(TokenType::False),
103 "for" => Some(TokenType::For),
104 "function" => Some(TokenType::Function),
105 "goto" => Some(TokenType::Goto),
106 "if" => Some(TokenType::If),
107 "in" => Some(TokenType::In),
108 "local" => Some(TokenType::Local),
109 "nil" => Some(TokenType::Nil),
110 "not" => Some(TokenType::Not),
111 "or" => Some(TokenType::Or),
112 "repeat" => Some(TokenType::Repeat),
113 "return" => Some(TokenType::Return),
114 "then" => Some(TokenType::Then),
115 "true" => Some(TokenType::True),
116 "until" => Some(TokenType::Until),
117 "while" => Some(TokenType::While),
118 _ => None,
119 }
120 }
121}
122
123#[derive(Debug, PartialEq)]
124pub enum TokenValue {
125 None,
126 Float(FloatType),
127 Int(IntType),
128 Str(String),
129}
130
131#[derive(Debug, PartialEq)]
132pub struct Token {
133 pub t: TokenType,
134 pub value: TokenValue,
135 pub source: Source,
136 pub offset: usize,
137 pub comment_offset: usize,
138}
139
140impl Token {
141 pub fn get_float(&self) -> FloatType {
142 match self.value {
143 TokenValue::Float(f) => f,
144 _ => unreachable!(),
145 }
146 }
147 pub fn get_int(&self) -> IntType {
148 match self.value {
149 TokenValue::Int(i) => i,
150 _ => unreachable!(),
151 }
152 }
153 pub fn get_string(&self) -> String {
154 match &self.value {
155 TokenValue::Str(s) => s.clone(),
156 _ => unreachable!(),
157 }
158 }
159 pub fn is_comment(&self) -> bool {
160 self.t == TokenType::SComment || self.t == TokenType::MComment
161 }
162
163 pub fn comments<'a>(&self, tokens: &'a Vec<Token>) -> &'a [Token] {
164 &tokens[self.comment_offset..self.offset]
165 }
166}